Является ли принцип Open-Closed SOLID таким же, как кодирование для интерфейса?

Означает ли открытость для расширения и закрытость для модификации код для интерфейса?

Если я кодирую интерфейс так, что будущие конкретные реализации могут быть введены путем реализации интерфейса, и мы создаем новые классы, не затрагивая существующую логику, достигает ли это той же цели, которую мы пытаемся решить, используя открытые для расширения и закрытые для -модификация SOLID в принципе?


person Akhil Gupta    schedule 03.01.2020    source источник
comment
stackoverflow.com/questions/57555901/   -  person Matt Timmermans    schedule 03.01.2020


Ответы (1)


Я бы сказал, что код для интерфейса решает принцип открытия-закрытия (OCP), но есть и другие способы кодирования для интерфейса.

Код для интерфейса также может означать код для абстрактного класса, такого как InputStream.

Кроме того, использование CDI может позволить закрывать бины для модификации и открывать для расширений.

Это означает, что вы не должны использовать интерфейсы, но можете использовать OCP.

Если я кодирую интерфейс (...), достигается ли (...) принцип SOLID?

Да, вы следуете принципу SOLID. Но разработчики интерфейса могут этого не делать.

Обычно интерфейс разделен на сигнатуру метода и javadoc. Сигнатура метода указывает, что вы технически можете сделать, а в javadoc должно быть указано, что должна делать реализация. В обоих случаях подпись и документ являются неопровержимыми фактами, и реализация, которая нарушает либо подпись, либо javadoc, в большинстве случаев должна быть зарегистрирована как ошибка.

Таким образом, вы можете использовать либо существующий интерфейс для общих требований, либо новый интерфейс для конкретных требований. Если вы создаете новый интерфейс, вы можете подумать о принципе разделения интерфейса, который также является частью набора принципов SOLID.

Если вы разрабатываете этот интерфейс, вы должны быть открыты для требований разработчика. Например, если интерфейс такой:

Date readDate(InputStream in);

Могут быть некоторые требования от разработчиков, которые вы никогда не могли предвидеть:

  1. Вы должны добавить IOException в случае закрытия потока.
  2. Вы должны добавить параметр Charset-Parameter, потому что кодировка - это ASCII, что означает, что длина в битах составляет 7 бит, а не 8 бит.
  3. Вы должны добавить часовой пояс, потому что Date использует часовой пояс сервера, а источники потока из другого часового пояса.
  4. Вы должны добавить Locale, потому что формат год/месяц/день (Великобритания) может быть форматом год-месяц-день (GER) в другом языковом стандарте.

Эти требования могут появиться после того, как вы закодировали интерфейс. Я бы сказал, что эти требования к интерфейсу вынуждают вас модифицировать закрытый код для интерфейса. Вы могли бы сказать, что да, это модификация, нарушающая правила «закрытые для модификаций». Но ни одно из этих требований к интерфейсу на самом деле не должно изменять поведение вашего кода к интерфейсу.

person Grim    schedule 29.12.2020