Eiffel: лучшие практики для процедур создания - PullRequest
0 голосов
/ 26 октября 2018

Животное

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

Исправьте меня, если я ошибаюсь.Заранее спасибо!

1 Ответ

0 голосов
/ 26 октября 2018

Многие библиотеки Eiffel были разработаны до того, как default_create был добавлен к ANY с соответствующей семантикой.Это объясняет, почему многие классы базовой библиотеки не используют ее.

Кроме того, процедуры создания могут иметь определенный смысл.Например, make может создать контейнер, который сравнивает внутренние объекты, используя равенство ссылок, тогда как make_equal может создать контейнер, который вместо этого использует равенство объектов (это имеет место для HASH_TABLE, хотя есть дополнительный аргумент для указания ожидаемогочисло элементов, этот аргумент может быть опущен при некотором другом выборе дизайна).В таких случаях default_create и default_create_equal будут несимметричными, в то время как make и make_equal симметричны, так что конструкция будет более согласованной.

Как вы указали, default_createне должен нести какого-либо определенного поведения, только некоторые базовые вещи, ожидаемые от всех потомков.

Должен ли default_create вызываться всеми другими процедурами создания, сильно зависит от проекта.Одним из примеров, где это почти правило, является библиотека «vision» , которая кодирует в default_create правильный порядок инициализации, критически важный для безопасности void.Еще возможно написать класс (на основе этой библиотеки), который правильно выполняет инициализацию, не вызывая default_create в своей процедуре создания, но наличие готовых к использованию шаблонов упрощает разработку.

...