除了Bertrand Meyer本人之外,我很高兴在大学里教埃菲尔,并且只读了.NET 4.0将包括合同设计.
任何有洞察力的人都可以详细说明这与Eiffel的现有功能集相比有多强大吗?
是否支持接口合同?
我的很多函数在声明之下都有一大堆验证代码:
if ( ! (start < end) ) {
throw new IllegalStateException( "Start must be before end." );
}
Run Code Online (Sandbox Code Playgroud)
我想精确地指定某些输入的有效范围 - 例如A> B,C => 1或str_d.length()> 0.
鉴于我的一些函数有很多必须经过验证的论证,我最终可能会编写大量的样板来验证前置条件.我正在编写一个主要由非技术开发人员使用的库,我们发现验证函数输入是帮助我们的用户正确操作API的最佳方法.我们越早提出错误,客户就越不需要做的工作.
是否有更优雅的方法来指定我的方法中的前置条件,后置条件(以及可能的不变条件).
一位同事告诉我有关Eiffel编程语言的一个特性,它允许以非常自然的方式描述前/后/不变条件,而无需重复大量的样板代码.是否有Java语言的附加组件,这将允许我使用这些魔术?
是否有一些库允许我在c ++中轻松方便地创建面向对象的回调?
例如,埃菲尔的语言具有"代理人"的概念,其或多或少的工作方式如下:
class Foo{
public:
Bar* bar;
Foo(){
bar = new Bar();
bar->publisher.extend(agent say(?,"Hi from Foo!", ?));
bar->invokeCallback();
}
say(string strA, string strB, int number){
print(strA + " " + strB + " " + number.out);
}
}
class Bar{
public:
ActionSequence<string, int> publisher;
Bar(){}
invokeCallback(){
publisher.call("Hi from Bar!", 3);
}
}
Run Code Online (Sandbox Code Playgroud)
输出将是:嗨来自Bar!3来自Foo!
所以 - 代理允许将成员函数封装到一个对象中,沿着一些预定义的调用参数(来自Foo的Hi)给它,指定打开的参数(?),然后将它传递给其他对象,然后再调用它.
由于C++不允许创建非静态成员函数的函数指针,似乎并不容易实现容易在C++使用的东西.我在c ++中找到了一些关于面向对象回调的谷歌的文章,但是,实际上我正在寻找一些我可以导入的库或头文件,它允许我使用一些类似优雅的语法.
有人给我一些提示吗?
谢谢!
我知道Eiffel(祖先)和Racket都实现了"按合同设计"的功能.可悲的是,我不确定如何区别于另一个.Eiffel的DBC依赖于OOP范式和继承,但是Racket,一种非常不同的语言如何解释这种差异?
有没有人有任何学习埃菲尔语的经验.
Eiffel Studio是否像Visual Studio一样?
这是学习OOP的好方法吗?
等等
我想POINT在埃菲尔做一个不可变的课.下面的代码定义了一个吗?和字段的{NONE}可访问性是否足够?我可以写一些类不变的类,或者我怎样才能实现不变性?xyx = x'
class POINT
create
make
feature {NONE}
x: DOUBLE
y: DOUBLE
feature
make (x_: DOUBLE; y_: DOUBLE)
do
x := x_
y := y_
ensure
set: x = x_ and y = y_
end
feature --accessors
get_x: DOUBLE
do
Result := x
ensure
Result = x
end
end
Run Code Online (Sandbox Code Playgroud) 在埃菲尔说,我们应该"放松前提条件并收紧后期条件",但我不确定这意味着什么.这种好处/如何受益于子类别?
谢谢
我试着这样做:
local
condition: BOOLEAN
condition := true
do
Run Code Online (Sandbox Code Playgroud)
这样的事情:
local
condition: BOOLEAN := true
do
Run Code Online (Sandbox Code Playgroud)
显然既不起作用,但我需要在声明中初始化变量,因为如果执行重试指令,我不希望变量重新初始化.我查看了Eiffel的官方文档和教程,但它们始终将操作体中的变量初始化.
我一直想要进入一种纯OO语言一段时间,但是我觉得他们似乎都需要一个IDE,我找不到任何不在视频中的好教程格式.
我很高兴以后使用IDE ,但我不想通过一个学习语言.我正在寻找的是一个简单的控制台解释器或命令行编译器,如gcc,ghc,ghci和python IDLE(是的,它是一个IDE,但它是如此极简主义,它可能只是一个命令行解释器).我发现当我不想同时使用IDE时,我会更快,更好,更全面地学习语言.所以,请不要告诉我吱吱声是唯一的方法:P
我也在寻找以文本而非视觉方式呈现的教程.再一次,当我盯着一个页面并且一遍又一遍地阅读别人的咒语时,我会更快地学习,而不是暂停视频,将其取回10秒,按下播放,再次执行,再次,然后再次.
我对不同程度的OO纯度的各种语言感兴趣,我计划在某些时候学习它们.任何一个smalltalk方言都让我感兴趣,Self(一个极端原型导向的smalltalk版本(非常有趣,越激进越好的imo)),strongtalk,vanilla smalltalk(或者一些实现,就像你能得到的那样).
我也对Eiffel感兴趣,我见过的代码片段看起来非常优雅,我读到它实际上非常具有创新性(引入代码合同和其他类似的东西).然而,我会优先考虑来自小型营地的一种语言而不是埃菲尔一侧的语言,因为面对价值的埃菲尔似乎是OO和命令式编程之间的混合体.同样,我宁愿避免Scala(混合OO和功能)和其他混合语言.所以没有C#,Java,C++,D,python等等.我不是在考虑这些语言,因为我认为它们很糟糕,只是因为我开始学习纯OO而且那些语言是混合OO:不是真的是我在找什么.
此外,任何人都可以推荐官方书籍吗?对于smalltalk,有"蓝皮书"AKA"Smalltalk-80:语言及其实现".对艾菲尔来说,有"艾菲尔:语言".我问,因为根据我的经验,你可以通过阅读该语言作者撰写的书籍(参见K&R C编程语言)以及阅读一般书籍来学到很多东西.
所以,是的,我的问题:开始使用纯OO语言会有什么好处?如何在不使用IDE的情况下学习它?是否有一本由语言作者撰写的相关书籍?
你如何在埃菲尔开发一个Web应用程序?
是否有针对eiffel的webapp框架?
是否有使用eiffel开发的网络应用程序示例?