Страницы

Поиск по вопросам

воскресенье, 15 декабря 2019 г.

SOLID - обсуждение Open Closed Principle

#php #solid



  Бертран Мейер в основном известен как основоположник термина Принцип открытости/закрытости,
который появился в 1988 году в его книге Object-Oriented Software Construction. Идея
была в том, что однажды разработанная реализация класса в дальнейшем требует только
исправления ошибок, а новые или изменённые функции требуют создания нового класса.
Этот новый класс может переиспользовать код исходного класса через механизм наследования.
Производный подкласс может реализовывать или не реализовывать интерфейс исходного класса.


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

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

Этот принцип же породит множество ненужных классов, наследующих базовый.

Из википедии:


  Solid - принципы, когда применяются вместе, предназначены для повышения вероятности
того, что программист создаст систему, которую будет легко поддерживать и расширять
в течение долгого времени[3]. Принципы SOLID - это руководства, которые могут применяться
во время работы над программным обеспечением для удаления запахов кода предписывая
программисту выполнять рефакторинг исходного кода, пока тот не станет разборчиво написанным
и расширяемым. Это часть общей стратегии гибкой и адаптивной разработки


Но данный принцип противоречит концепции (разборчиво написанного кода и расширяемости).
Т.е если у нас уже есть множество созданных объектов 'Человек', и в проекте мы хотим
чтобы они теперь могли общаться, после добавления данного метода в другой класс, мы
должны все наши объекты создать на базе другого класса. 

Т.е по логике, по концепции , по здравому смыслу (чтобы не переписывать код)..дополнение
должно быть произведено именно в классе 'человек'. + мы получаем возможность создавать
людей как имеющих общаться так и не умеющих - но это является ошибкой проектирования
кода проекта .
    


Ответы

Ответ 1



SOLID - это не догмы, а рекомендации. Обычно, если им следовать, то код получается легче дорабатывать и тестировать. Но это может приводить к тому, что кода может быть больше. Чем больше программируешь, тем больше понимаешь как лучше найти баланс. Кроме наследования есть другие инструменты - например, инкапсуляция, интерфейсы. Я бы сделал ОбщительныйИнтерфейс пока из одного метода общаться. И нужные наследники Человека реализовывали бы этот интерфейс. Также, если многие потомки Человека общаются схожим образом, то, чтобы не дублировать код, вынес бы логику общения в отдельный класс и инкапсулировал его в нужных Человеков.

Комментариев нет:

Отправить комментарий