Eiffel: лучшие практики работы с геттерами возвращают Void, если объект не найден?

Какова лучшая практика в Eiffel для возврата объекта из функции, если он не найден. Я видел, что многие коллекции, такие как ARRAY, например, основывают поведение not found на предварительном условии, например, или другой функции.

Многие языки основывают свою политику на возврате Void (или null), когда объект не найден. В Eiffel это означало бы, что в результате получится съемный объект?

Нулевая политика

item_at_index (index: INTEGER): detachable FOO
    do
        if bar_collection.valid_index(i) then
            Result := bar_collection.item_at(i)
        else
            Result := Void 
        end
    end

Никогда не обнуляйте политику

item_at_index (index: INTEGER): detachable FOO
    require
        bar_collection.valid_index(i)
    do
        Result := bar_collection.item_at(i)
    end

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


Ответы (1)


Политика зависит от базовой структуры, бизнес-логики и т. д.

Одним из примеров является случай, когда известно, что элемент находится по определенному индексу, ключу и т. д. Структуры, подобные массивам, попадают в эту категорию. Попытка получить элементы за пределами массива может рассматриваться как ошибка. Таким образом, наличие предварительного условия является подходящим подходом.

Другой пример — когда неизвестно, есть элемент или нет. Рассмотрим дерево XML DOM и запрос на получение всех элементов с заданным именем. Нет никаких предварительных знаний о том, присутствуют ли такие элементы или нет. Поэтому разумным подходом является возврат Void, когда не найдено ни одного совпадающего элемента.

Таким образом, это не похоже на дилемму «черное или белое», решение должно учитывать контекст.

person Alexander Kogtenkov    schedule 28.09.2018