Форум сайта python.su
0
помогите пожалуйста разобраться в первым принципом SOLID - принципом единой ответственности.
чаще всего в интернете я нахожу такую формулировку, которая предлагает каждому классу решать только одну проблему. согласно этой формулировке, если класс рассчитывает какое-нибудь значение, то функционал, отвечающий за вывод результата, не может быть в этом же классе. вывод желательно вынести в отдельный класс.
проиллюстрировать написанное можно при помощи следующих примеров:
неправильный пример
правильный пример
однако в книже роберта мартина “чистая архитектура” (стр79) даётся другое определение:
Модуль должен отвечать за одного и только за одного актора.
Модуль должен иметь одну и только одну причину для изменения.учитывая то, что роберт мартин объединил принципы SOLID, то у меня больше оснований верить его определению.
circle = Circle(2) rect = Rect(4, 2) areaCalc = AreaCalc([circle, rect]) sum = areaCalc.sumArea() AreaOutput(sum).outputSum() AreaOutput(sum).outputSumRound()
Отредактировано zlodiak (Март 16, 2019 20:11:22)
Офлайн
857
Опирайся на эту инфу
wiki. ru. SRP
Этот Мартин сам запутался в том, что имел в виду. Вот он пишет отмазки, что он имел в виду не то, о чём сказал. Он сказал “ответственность”, а имел в виду “ответственность пользователя за изменения кода класса”. Если бы он был математиком, никогда бы не допустил такой глупой оговорки и ясно бы разделил эти два понятия. В результате всех этих размышлений он к тому и приходит, что его “причина для изменений кода” и есть ответственность класса, построенная на связности класса (внутренняя связность класса - когда все методы класса объединены вокруг одной функции, которую выполняет класс (посредством экземпляра)).
То же самое можно сказать и про этот отрывок из его книги, который ты привёл
Теперь определим, что означает слово «модуль». Самое простое опреде-Модуль - это не файл с иходным кодом. Файл с исходным кодом - это одно из представлений модуля. Компьютер точно так же состоит из модулей, но при этом никакая из его деталей не написана ни на каком языке. И программа состоит из модулей, которые могут быть по-разному выражены. Модули имеют внутреннюю связность и межмодульное зацепление. Внутренняя связность может быть слабой и сильной. Межмодульное зацепление может быть слабым и сильным.
ление — файл с исходным кодом. В большинстве случаев это определение
можно принять. Однако некоторые языки среды разработки не используют
исходные файлы для хранения кода. В таких случаях модуль — это просто
связный набор функций и структур данных.
Роль модулей могут играть структуры данных, библиотеки функций, классы, сервисы и др. программные единицы, реализующие некоторую функциональность и предоставляющие интерфейс к ней.
Офлайн
568
Для языка Java, а если мне память не изменяет Мартин на него прежде всего свои книги ориентирует, модуль = класс.
Офлайн
857
Модуль - изолированная единица, имеющая независимое внутреннее содержимое и внешний интерфейс. А чем она представлена, в виде чего она существует, - зависит от контекста. Можно программу модулем считать, можно операционную систему модулем считать, можно интегральную микросхему модулем считать (модуль памяти). А потом уже идут локальные определения “а давайте вот в этом языке программирования такую-то изолированную штуку назовём модулем”. И так мы получаем общее понятие модуля для всех языков и программ и частные определения модулей в разных языках программирования. В одном языке модуль - это одно, а в другом языке модуль - это другое, а в третьем - третье.
Поэтому нужно понимать, что есть модули и у них есть свойства. И вот космическая станция вся модульная и у этих модулей космической станции есть те же самые свойства, что и модулей в кусках программы, что и модулей памяти в компьютере. То есть рычажок из модуля космической станции не лезет в другой модуль космической станции, а работает в пределах только своего модуля. Поэтому ты любой из этих модулей можешь вытащить, привезти с Земли другой модуль и вставить туда на место старого модуля. И другие модули даже не заметят, что там что-то заменили.
Офлайн