Eiffel: Лучшие практики с геттерами возвращают Void, если объект не найден? - PullRequest
0 голосов
/ 28 сентября 2018

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

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

Нулевое политическое

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

1 Ответ

0 голосов
/ 28 сентября 2018

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

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

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

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

...