После публикации этого вопроса и прочтения этого вопроса я понял, что очень важно знать, должен ли метод возвращать нуль или считается ли это ошибкой и исключения должны быть брошены. Также приятно обсудить, когда возвращает 'null' или выбрасывает исключение .
Я пишу метод и уже знаю, хочу ли я вернуть ноль или выдать исключение, как лучше всего выразить мое решение, другими словами, документировать мой контракт?
Некоторые способы, которыми я могу придумать:
- Запишите это в спецификации / документации (кто-нибудь прочитает?)
- Сделать его частью имени метода (как я и предлагал здесь )
- Предположим, что каждый метод, который выдает исключение, не возвращает ноль, а каждый метод, который не 'throw' может возвращать ноль.
Я в основном говорю о java, но это может относиться и к другим языкам: почему существует формальный способ выражения, если генерируются исключения (ключевые слова throws
), но нет формального способа выражения, если ноль может быть возвращенным?
Почему нет чего-то подобного:
public notnull Object methodWhichCannotReturnNull(int i) throws Exception
{
return null; // this would lead to a compiler error!
}
Сводка и заключение
Есть много способов выразить договор:
- Если ваша IDE поддерживает его (например, IntelliJ), лучше использовать аннотацию, например
@NotNull
, потому что она видна программисту и может использоваться для автоматической проверки времени компиляции. Для Eclipse есть плагин для добавления поддержки, но он не работает для меня.
- Если это не вариант, используйте пользовательские типы, такие как
Option<T>
или NotNull<T>
, которые добавляют ясность и, по крайней мере, проверку во время выполнения.
- В любом случае, документирование контракта в JavaDoc никогда не повредит, а иногда даже помогает.
- Использование имен методов для документирования обнуляемости возвращаемого значения не было предложено никем, кроме меня, и хотя оно может быть очень многословным и не всегда полезным, я все же считаю, что иногда оно тоже имеет свои преимущества .