Привет, сегодня я хотел бы поговорить о культуре проектирования. Многие программисты (особенно джуниоры) боятся создать лишний класс, интерфейс и т.п… Причин тому, я уверен, немало, однако эта тема выходит за рамки этого поста. Но как раз из-за этого появляются очень интересные проблемы, о которых я хотел бы сегодня рассказать. Если я тебя заинтриговал — добро пожаловать под кат.
Как пример возьмем JDK интерфейс Iterator.
Этот код взят именно из JDK 1.8 не просто так. Дело в том, что в JavaDoc'е к методу remove сказано, что он может кидать UnsupportedOperationException, в случае, если реализация интерфейса его не поддерживает. И на мой взгляд это большая проблема. Конечно, я понимаю, что в JDK она вызвана поддержкой обратной совместимости и уже ничего с этим не сделаешь, ничего не сломав.
Я долго думал, как проиллюстрировать эту проблему. И вот, я обратил свое внимание на нее, когда я приехал в гости к другу. Пока друг удалился в кухню запивом соком, я решил включить кондиционер, он был такой же, как и у меня дома и я без вопросов взял пульт и начал клацать. Не работает. Переподключил конциционер к сети, проверил батарейки в пульте, подошел вплотную — и нечего, мой любимый турбо-режим не работает и все, о чем я и пожаловался другу, когда он вернулся. Но тут-то меня и ждал сюрприз: «А в этой модели нет никаких турбо-режимов», — хладнокровно ответил мне друг. «Как так, вот же кнопка „turbo“», — показываю я другу пульт.
Приблизительно такие же чувства я испытываю когда мне прилетает вот такой вот UnsupportedOperationException. На мой взгляд, эта проблема должна решаться простой иерархией интерфейсов, и если с пультами проблема вызвана нерентабельностью, но ведь у нас таких проблем нет ;)
Спасибо за внимание.
Буду рад коментариям и объективной критике.
Как пример возьмем JDK интерфейс Iterator.
public interface Iterator<E> {
boolean hasNext();
E next();
default void remove() {
throw new UnsupportedOperationException("remove");
}
default void forEachRemaining(Consumer<? super E> action) {
Objects.requireNonNull(action);
while (hasNext())
action.accept(next());
}
}
Этот код взят именно из JDK 1.8 не просто так. Дело в том, что в JavaDoc'е к методу remove сказано, что он может кидать UnsupportedOperationException, в случае, если реализация интерфейса его не поддерживает. И на мой взгляд это большая проблема. Конечно, я понимаю, что в JDK она вызвана поддержкой обратной совместимости и уже ничего с этим не сделаешь, ничего не сломав.
Я долго думал, как проиллюстрировать эту проблему. И вот, я обратил свое внимание на нее, когда я приехал в гости к другу. Пока друг удалился в кухню за
Приблизительно такие же чувства я испытываю когда мне прилетает вот такой вот UnsupportedOperationException. На мой взгляд, эта проблема должна решаться простой иерархией интерфейсов, и если с пультами проблема вызвана нерентабельностью, но ведь у нас таких проблем нет ;)
Спасибо за внимание.
Буду рад коментариям и объективной критике.