Является ли СРП (принцип единой ответственности) объективным?

17

Рассмотрим двух дизайнеров пользовательского интерфейса, которые хотят создавать привлекательные для пользователя дизайны. «Привлечение пользователей» - это концепция, которая не является объективной и находится только в сознании дизайнеров. Таким образом, дизайнер А может, например, выбрать красный цвет, а дизайнер Б - синий. Дизайнер A создает макет, который полностью отличается от дизайнера B и так далее.

Я читал о SRP (принцип единой ответственности), и то, что я понял, было своего рода субъективным анализом или распределением обязанностей, которые могут варьироваться от проектировщика ОО до другого проектировщика ОО. Я прав? Другими словами, возможно ли иметь два превосходных объектно-ориентированных анализатора и проектировщика, которые придумали два разных проекта для одной системы на основе принципала SRP?

Саид Нямати
источник
4
Я думаю, что у любого вида дизайна (искусство, проектирование, ...) есть баланс объективности и субъективности - некоторые ясные правила и ограничения, некоторые вызовы опыта и суждения, и даже некоторые полностью свободные все варианты, как хорошие. выбор друг друга.
Steve314

Ответы:

12

Хороший вопрос, который я часто обдумывал.

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

Действительно, то, что можно увидеть как две части одного и того же целого, можно рассматривать как две совершенно разные концепции. Это все время можно увидеть, глядя на то, как разработчики различных библиотек кода подходят к одной и той же проблеме. И все же оба решения работают просто отлично.

(PS. Отредактировал этот ответ, поскольку последний вопрос ОП требует противоположного названия вопроса.)

инженер
источник
5

Сам принцип объективен, но существует так много разных способов реализации того, что следует этому принципу, что два независимых разработчика почти всегда придумают довольно разные конструкции систем для одного и того же приложения.

Даже вероятно, что один и тот же разработчик, делающий один и тот же дизайн дважды, все равно предложит два решения, которые хотя бы частично отличаются.

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

Guffa
источник
Хороший анализ @Guffa. +1. Мне понравилась идея не быть всеобъемлющим. Да, SRP только говорит вам, чтобы попытаться сделать все, чтобы ответить за одну проблему. Но это не говорит вам, где граница ответственности.
Саид Нимати
2

Применение принципа субъективно. Однако «субъективное» не означает «предпочтение» так же, как эстетика.

Есть очевидные крайности. Класс с ровно одним методом с несколькими строками кода, который не вызывается ни для каких других классов, определенно следует SRP. С другой стороны, класс с двумя методами, один из которых содержит полную реализацию электронной почты через необработанные сокеты, а другой - создает форму графического интерфейса, определенно не следует SRP.

Эстетика - плохая аналогия. Лучшей аналогией были бы хорошо известные в информатике концепции взаимосвязи и сплоченности . Ни один из этих атрибутов не является черно-белым, истинным или ложным. Тем не менее, они являются измеримыми, даже если есть качественный элемент. Если вы покажете группе опытных разработчиков два отдельных проекта для одной и той же функции, они собираются дать аналогичные показания, по которым дизайн имеет больше сцепления и / или сплоченности.

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

Aaronaught
источник
0

Существует объективное определение «ответственности» как «причины для изменения». Во время программирования все причины для изменения лежат в будущем, поэтому программист может только догадываться, основываясь на своем опыте и знании предметной области. Поэтому анализ обязанностей - это своего рода прогноз, отчасти субъективный.

maaartinus
источник
0

SRP объективен; реализации являются субъективными

две реализации с одинаковой функциональностью могут использовать совершенно разные внутренние структуры, что приводит к разным классам и методам, и обе могут удовлетворять SRP

если они используют одни и те же методы и состояние, и оба они нормализованы (минимальные / нередуцируемые), то теоретически они получат те же классы и методы в рамках SRP.

но я не могу доказать это. Еще.

Стивен А. Лоу
источник