Eiffel:创建过程的最佳实践
Eiffel: best practices for creation procedures
动物
deferred class ANIMAL
inherit
ANY
redefine
default_create
end
feature
creator: like Current
guts: GUTS
default_create
do
create guts
end
make_malformed
do
default_create
end
end --class
小猪
class PIG
inherit
ANIMAL
redefine
make_malformed
end
create
default_create,
make_malformed,
make_from_insemination
feature
guts: GUTS
make_malformed
do
Precursor
set_left_eye (create {MALFORMED_EYE})
end
make_from_insemination (some_humain: HUMAIN)
do
default_create
creator := some_humain
end
end --class
在我对最佳实践的看法中,我会说
- 如果制作过程没有特别的意义(比如我的
make_malformed
例子)重新定义default_create
- 所有创建过程都应调用
default_create
并添加特定行为(如我的 make_from_db
示例)
- 所以 Eiffel 中的许多图书馆的目的是什么,它们正在添加一个
make
,例如 create {LINKED_LIST}.make
如果我错了请纠正我。提前致谢!
许多 Eiffel 库是在 default_create
添加到具有相应语义的 ANY
之前开发的。这解释了为什么很多 classes 的基础库不使用它。
另外,创建过程可以带有一些特定的意义。例如,make
可以创建一个使用引用相等性比较内部对象的容器,而 make_equal
可以创建一个使用对象相等性的容器(HASH_TABLE
就是这种情况,尽管有一个指示元素的预期数量的附加参数,可以通过其他一些设计选择省略此参数)。在这种情况下,default_create
和 default_create_equal
将是非对称的,而 make
和 make_equal
是对称的,因此设计更加一致。
正如您所指出的,default_create
不应该带有任何特定的行为,只是一些基本的东西,所有后代都应该这样做。
default_create
是否应该被所有其他创建过程调用在很大程度上取决于设计。一个几乎成为规则的例子是 "vision" 库,它在 default_create
中编码了正确的初始化顺序,这对 void 安全至关重要。仍然可以编写一个 class(基于此库)来正确执行初始化,而无需在其创建过程中调用 default_create
,但具有现成的模式可以简化开发。
动物
deferred class ANIMAL
inherit
ANY
redefine
default_create
end
feature
creator: like Current
guts: GUTS
default_create
do
create guts
end
make_malformed
do
default_create
end
end --class
小猪
class PIG
inherit
ANIMAL
redefine
make_malformed
end
create
default_create,
make_malformed,
make_from_insemination
feature
guts: GUTS
make_malformed
do
Precursor
set_left_eye (create {MALFORMED_EYE})
end
make_from_insemination (some_humain: HUMAIN)
do
default_create
creator := some_humain
end
end --class
在我对最佳实践的看法中,我会说
- 如果制作过程没有特别的意义(比如我的
make_malformed
例子)重新定义default_create
- 所有创建过程都应调用
default_create
并添加特定行为(如我的make_from_db
示例) - 所以 Eiffel 中的许多图书馆的目的是什么,它们正在添加一个
make
,例如create {LINKED_LIST}.make
如果我错了请纠正我。提前致谢!
许多 Eiffel 库是在 default_create
添加到具有相应语义的 ANY
之前开发的。这解释了为什么很多 classes 的基础库不使用它。
另外,创建过程可以带有一些特定的意义。例如,make
可以创建一个使用引用相等性比较内部对象的容器,而 make_equal
可以创建一个使用对象相等性的容器(HASH_TABLE
就是这种情况,尽管有一个指示元素的预期数量的附加参数,可以通过其他一些设计选择省略此参数)。在这种情况下,default_create
和 default_create_equal
将是非对称的,而 make
和 make_equal
是对称的,因此设计更加一致。
正如您所指出的,default_create
不应该带有任何特定的行为,只是一些基本的东西,所有后代都应该这样做。
default_create
是否应该被所有其他创建过程调用在很大程度上取决于设计。一个几乎成为规则的例子是 "vision" 库,它在 default_create
中编码了正确的初始化顺序,这对 void 安全至关重要。仍然可以编写一个 class(基于此库)来正确执行初始化,而无需在其创建过程中调用 default_create
,但具有现成的模式可以简化开发。