Eiffel: лучшие практики создания процедур

Животное

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

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


person Pipo    schedule 26.10.2018    source источник


Ответы (1)


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

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

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

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

person Alexander Kogtenkov    schedule 26.10.2018