Я понимаю, что многие принципы дизайна в некоторых случаях противоречат друг другу. Итак, мы должны взвесить их и посмотреть, какой из них более выгоден. До сих пор я знал о принципе SRP и делал множество своих проектов исключительно на его основе, но внутренне я иногда чувствовал себя не так, следуя этому принципу. Теперь я узнал о TDA, и я почувствовал, что получил больше поддержки :)
SRP: - Объект должен беспокоиться о себе, а не о ком-либо другом
TDA: - Поведение (которое зависит только от состояния объекта) должно сохраняться внутри самого объекта.
Пример: - У меня есть разные формы, такие как прямоугольник, квадрат, круг и т. д. Теперь мне нужно вычислить площадь.
Мой дизайн до сих пор: - Я следовал SRP, где у меня был класс AreaCalculatorService, который будет запрашивать состояние формы и вычислять площадь. Причина этого дизайна заключалась в том, что форма не должна беспокоить расчет площади, поскольку это не ответственность за форму. Но в идеале я привык думать, что код вычисления области должен находиться под каждой формой, как если бы в конце строки, если появляется новая форма, мне нужно изменить класс AreaCalculatorService (который нарушает принцип открытия для расширения и закрытия для изменения (OECM)). Но всегда отдавал предпочтение SRP. Это кажется неправильным
Миф сломан (по крайней мере, мой): - С TDA, похоже, мое ощущение было правильным, когда я не должен спрашивать о состоянии объекта, но должен сказать форме, чтобы вычислить его площадь. Хотя это нарушит принцип SRP, но будет поддерживать принцип OECM. Как я уже сказал, принципы дизайна иногда конфликтуют друг с другом, но я считаю, что там, где поведение полностью зависит от состояния объекта, поведение и состояние должны быть вместе.
Другой пример: - скажем, я должен рассчитать зарплату всех отделов всех сотрудников в организации, тогда мы должны следовать SRP, где SalaryCalculatorService будет зависеть от отдела и сотрудников.
Он спросит зарплату каждого сотрудника, а затем произведет суммирование по всем зарплатам. Итак, здесь я прошу состояние сотрудника, но все же не нарушаю TDA. CalcSalary не зависит только от заработной платы каждого сотрудника.
Сообщите мне, верна ли моя интерпретация обоих этих принципов, где я должен следовать TDA в первом случае, а SRP - во втором?
getName()
, сохраняя ее состояние и т. д. - person emilly   schedule 05.11.2016There's no SRP violation here and it's definitely TDA..
Я считаю, что здесь есть нарушение SRP. В истинном смысле «единственная ответственность» означает, что для изменений должна быть единственная причина. Единственная ответственность за форму - сохранить состояние объекта, ничего больше (например, расчет площади). - person emilly   schedule 06.11.2016radius
вместоdiameter
). - person Phil1970   schedule 15.12.2016