Подтвердить что ты не робот

Являются ли СОЛИДНЫЕ принципы действительно прочными?

Образец дизайна, обозначенный первой буквой в этом аббревиатуре, - это принцип единой ответственности. Вот цитата:

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

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

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

Итак, мой вопрос. Можно ли строго придерживаться SRP? Как это можно сделать?

4b9b3361

Ответ 1

Как вы однажды обнаружите, ни один из самых известных принципов разработки программного обеспечения не может быть на 100%.

Частое программирование заключается в том, чтобы делать компромиссы - абстрактную чистоту и размер кода против скорости vs .efficiency.

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

Ответ 2

Я не думаю, что быть сериализуемым или одноразовым составляет несколько обязанностей.

Ответ 3

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

Я думаю, что заданный вами вопрос поднимает ключевой момент - как вы определяете единственную возможность, которую должен иметь класс?

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

Однако, пожалуйста, продолжайте придерживаться этого. Хотя это, вероятно, невозможно применить во всех случаях - это все же лучше, чем наличие в коде одного "объекта Бога" (Anti-Pattern).

Если у вас возникли проблемы с этим, я бы рекомендовал прочитать следующее:

  • Рефакторинг - Мартин Фаулер: Несмотря на то, что это, очевидно, касается рефакторинга, эта книга также очень полезна в отображении того, как разложить проблемы на свои логические части или релевантность - что является ключом к SRP. Эта книга также затрагивает другие принципы - однако она делает это гораздо менее академично, чем вы могли видеть раньше.

  • Чистый код - Роберт Мартин: Кто лучше читает, чем самый высокий показатель принципов SOLID. Серьезно, я нашел, что это действительно полезная книга во всех областях мастерства в области программного обеспечения - не только принципы SOLID. Как книга Фаулера, эта книга разбита на всех уровнях опыта, поэтому я рекомендую всем.

Ответ 4

Чтобы лучше понять принципы SOLID, вам нужно понять проблему, которую они решают:

Объектно-ориентированное программирование возникло из структурированного/процедурного программирования - оно добавило новую организационную систему (классы и др.), а также поведение (полиморфизм, наследование, состав). Это означало, что OO не было отделено от структурированного/процедурного, но было прогрессией, и что разработчики могли делать очень процедурные OO, если бы захотели.

Итак... SOLID появился как что-то вроде лакмусового теста, чтобы ответить на вопрос: "Я действительно занимаюсь OO, или я просто использую процедурные объекты?" 5 принципов, если следовать, означает, что вы довольно далеко от OO-стороны спектра. Несоблюдение этих правил не означает, что вы не выполняете OO, но это означает его гораздо более структурное/процедурное OO.

Ответ 5

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

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

Ответ 6

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

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

Ответ 7

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

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

Ответ 8

Итак, если вместо разработки одного класса "Собака" с методами "Бар", "Сон" и "Ешьте", я должен создать классы "AnimalWhoBarks", "AnimalWhoSleeps", "AnimalWhoEats" и т.д.? Зачем? Как это делает мой код лучше? Как я должен просто реализовать тот факт, что моя собака не заснет и будет лаять всю ночь, если он не ел?

"Разделить большие классы в меньших", это прекрасный практический совет, но "каждый объект должен иметь одну ответственность" - это абсолютная догматическая глупость ООП.

Представьте, что .NET Framework была написана с учетом SRP. Вместо 40000 классов у вас будут миллионы.

Обобщенный SRP ( "Обобщенный" является важным словом здесь) является просто преступлением IMHO. Вы не можете сократить разработку программного обеспечения до 5 принципов бухгалтерского учета.

Ответ 9

Изменив свое определение "единственной ответственности", принципы SOLID довольно ликвидны и (как и другие броские аббревиатуры аббревиатур) не означают, что они означают.

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

Ответ 10

S.O.L.I.D означает:

  • Принцип единой ответственности
  • Принцип открытого закрытия
  • Принцип замены Лискова
  • Сегрегация интерфейса Принцип
  • Принцип инверсии зависимостей

Это стандарты, на которые мы ссылаемся, когда мы говорим о ООП. Однако ни один из этих принципов не может быть отлично выполнен в разработке программного обеспечения.

Вы можете просмотреть очень хорошо объясняющую презентацию по этой теме здесь http://www.slideshare.net/jonkruger/advanced-objectorientedsolid-principles