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

在我对最佳实践的看法中,我会说

如果我错了请纠正我。提前致谢!

许多 Eiffel 库是在 default_create 添加到具有相应语义的 ANY 之前开发的。这解释了为什么很多 classes 的基础库不使用它。

另外,创建过程可以带有一些特定的意义。例如,make 可以创建一个使用引用相等性比较内部对象的容器,而 make_equal 可以创建一个使用对象相等性的容器(HASH_TABLE 就是这种情况,尽管有一个指示元素的预期数量的附加参数,可以通过其他一些设计选择省略此参数)。在这种情况下,default_createdefault_create_equal 将是非对称的,而 makemake_equal 是对称的,因此设计更加一致。

正如您所指出的,default_create 不应该带有任何特定的行为,只是一些基本的东西,所有后代都应该这样做。

default_create 是否应该被所有其他创建过程调用在很大程度上取决于设计。一个几乎成为规则的例子是 "vision" 库,它在 default_create 中编码了正确的初始化顺序,这对 void 安全至关重要。仍然可以编写一个 class(基于此库)来正确执行初始化,而无需在其创建过程中调用 default_create,但具有现成的模式可以简化开发。