0

动物

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示例)
  • 那么埃菲尔的许多图书馆的目的是什么makecreate {LINKED_LIST}.make

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

4

1 回答 1

1

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

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

正如您所指出的,default_create不应该进行任何特定的行为,只是一些基本的东西,期望所有的后代。

是否default_create应该被所有其他创建过程调用很大程度上取决于设计。一个例子,这几乎是一个规则,是库“视觉”,它以正确的初始化顺序进行编码,default_create这对于虚空安全至关重要。仍然可以编写一个类(基于这个库)来正确执行初始化而不调用default_create它的创建过程,但是有一个随时可用的模式可以简化开发。

于 2018-10-26T14:00:58.257 回答