【问题标题】:Eiffel: best practices for creation proceduresEiffel:创建过程的最佳实践
【发布时间】:2018-10-26 13:35:28
【问题描述】:

动物

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 creation-pattern


    【解决方案1】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-08-10
      • 1970-01-01
      • 1970-01-01
      • 2018-07-07
      • 1970-01-01
      • 1970-01-01
      • 2018-01-31
      • 1970-01-01
      相关资源
      最近更新 更多