Уведомления

Группа в Telegram: @pythonsu

#1 Март 16, 2019 20:08:07

zlodiak
От: Россия
Зарегистрирован: 2014-01-19
Сообщения: 159
Репутация: +  0  -
Профиль   Адрес электронной почты  

В чём заключается принцип единой ответственности?

помогите пожалуйста разобраться в первым принципом SOLID - принципом единой ответственности.

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

проиллюстрировать написанное можно при помощи следующих примеров:
неправильный пример
правильный пример

однако в книже роберта мартина “чистая архитектура” (стр79) даётся другое определение:

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

проблема в том, что согласно его определению оба приведённых выше пример правильны. потому что любой блок вызывающего кода:
 circle = Circle(2)
rect = Rect(4, 2)
areaCalc = AreaCalc([circle, rect])
sum = areaCalc.sumArea()
AreaOutput(sum).outputSum()
AreaOutput(sum).outputSumRound()

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

для удобства привожу всю страничку из упомянутой книжки: https://pastebin.com/ZKmDBWzh

Отредактировано zlodiak (Март 16, 2019 20:11:22)

Офлайн

#2 Март 17, 2019 00:36:05

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10024
Репутация: +  857  -
Профиль   Отправить e-mail  

В чём заключается принцип единой ответственности?

Опирайся на эту инфу
wiki. ru. SRP

Этот Мартин сам запутался в том, что имел в виду. Вот он пишет отмазки, что он имел в виду не то, о чём сказал. Он сказал “ответственность”, а имел в виду “ответственность пользователя за изменения кода класса”. Если бы он был математиком, никогда бы не допустил такой глупой оговорки и ясно бы разделил эти два понятия. В результате всех этих размышлений он к тому и приходит, что его “причина для изменений кода” и есть ответственность класса, построенная на связности класса (внутренняя связность класса - когда все методы класса объединены вокруг одной функции, которую выполняет класс (посредством экземпляра)).

То же самое можно сказать и про этот отрывок из его книги, который ты привёл

Теперь определим, что означает слово «модуль». Самое простое опреде-
ление — файл с исходным кодом. В большинстве случаев это определение
можно принять. Однако некоторые языки среды разработки не используют
исходные файлы для хранения кода. В таких случаях модуль — это просто
связный набор функций и структур данных.
Модуль - это не файл с иходным кодом. Файл с исходным кодом - это одно из представлений модуля. Компьютер точно так же состоит из модулей, но при этом никакая из его деталей не написана ни на каком языке. И программа состоит из модулей, которые могут быть по-разному выражены. Модули имеют внутреннюю связность и межмодульное зацепление. Внутренняя связность может быть слабой и сильной. Межмодульное зацепление может быть слабым и сильным.

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



Офлайн

#3 Март 17, 2019 04:24:55

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

В чём заключается принцип единой ответственности?

Для языка Java, а если мне память не изменяет Мартин на него прежде всего свои книги ориентирует, модуль = класс.



Офлайн

#4 Март 17, 2019 08:57:17

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10024
Репутация: +  857  -
Профиль   Отправить e-mail  

В чём заключается принцип единой ответственности?

Модуль - изолированная единица, имеющая независимое внутреннее содержимое и внешний интерфейс. А чем она представлена, в виде чего она существует, - зависит от контекста. Можно программу модулем считать, можно операционную систему модулем считать, можно интегральную микросхему модулем считать (модуль памяти). А потом уже идут локальные определения “а давайте вот в этом языке программирования такую-то изолированную штуку назовём модулем”. И так мы получаем общее понятие модуля для всех языков и программ и частные определения модулей в разных языках программирования. В одном языке модуль - это одно, а в другом языке модуль - это другое, а в третьем - третье.

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



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version