埃菲尔铁塔:创建程序的最佳做法

时间:2018-10-26 13:35:29

标签: eiffel creation-pattern

动物

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

PIG

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

如果我错了,请纠正我。预先感谢!

1 个答案:

答案 0 :(得分:1)

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

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

正如您所指出的,default_create不应带有任何后代期望的任何特定行为,而只是某些基本行为。

所有其他创建过程是否应调用default_create很大程度上取决于设计。一个几乎是规则的示例是库“ vision” ,该库以default_create编码正确的初始化顺序,这对无效性至关重要。仍然有可能编写一个类(基于该库)以正确执行初始化,而无需在其创建过程中调用default_create,但具有易于遵循的模式可以简化开发。