Какая польза от принципа единой ответственности? - PullRequest
0 голосов
/ 09 сентября 2018

Я пытаюсь понять принцип Единой Ответственности, но мне сложно понять концепцию. Я читаю книгу Люциана-Поля Торже «Шаблоны проектирования и лучшие практики на Java»; Адриан Янкулеску; Камалмит Сингх ».

В этой книге я читаю главу «Принцип единой ответственности», где у них есть класс автомобиля, как показано ниже:

enter image description here

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

Решением будет создание двух классов, как показано ниже:

enter image description here

У меня вопрос, даже если мы создадим два класса, давайте рассмотрим, добавляем ли мы новое свойство с именем 'price' в класс CAR [или меняем свойство 'model' на 'carModel'], тогда вы не думаете, что мы тоже необходимо обновить класс CarDAO, например, изменить SQL или так далее.

Так в чем здесь польза SRP?

Ответы [ 3 ]

0 голосов
/ 09 сентября 2018

Отличный вопрос.

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

Предположим, например, что вы хотите обменять базу данных, скажем, с MySQL на PostgreSQL. С помощью SRP вы переопределите CarDAO, измените любой используемый для диалекта SQL и оставите логику Car без изменений. Однако вам, возможно, придется внести небольшое изменение, возможно, в конфигурацию, чтобы указать Car использовать новый PostgreSQL DAO. Разумная структура DI сделает это простым.

Предположим, в другом примере, что вы хотите делегировать CarDAO другому разработчику для интеграции с memcached, так что чтение, хотя и в конечном итоге непротиворечивое, происходит быстро. Опять же, этому разработчику не нужно ничего знать о бизнес-логике в Car. Вместо этого им нужно работать только за методами CRUD CarDAO и, возможно, объявить еще несколько методов в API CarDAO с различными гарантиями согласованности.

Предположим, что в еще одном примере ваша команда нанимает инженера базы данных, специализирующегося на соблюдении законодательства. При подготовке к предстоящему IPO инженеру базы данных поручено вести журнал аудита всех изменений по всем таблицам в 35 базах данных компании. С SRP нашему бесстрашному администратору базы данных не нужно было бы беспокоиться о какой-либо бизнес-логике , использующей любую из наших таблиц; вместо этого их магию отслеживания мутаций можно ловко внедрить в DAO, используя декораторы или другие методы программирования аспектов. (Кстати, это можно сделать и с другой стороны интерфейса SQL.)

Хорошо, последний вопрос. Предположим теперь, что в команду входит системный инженер, которому поручено распределять эти данные по нескольким регионам (центрам обработки данных) в AWS. Этот инженер может пойти дальше SRP и добавить компонент, единственная роль которого заключается в том, чтобы сообщать нам для каждого идентификатора домашний регион каждой сущности. Каждый раз, когда мы выполняем межрегиональное чтение, новый компонент увеличивает счетчик; каждую неделю автоматизированный инструмент переносит данные, часто считываемые между регионами, в новый домашний регион, чтобы уменьшить задержку.

Теперь давайте продолжим наше воображение и предположим, что бизнес процветает - внезапно вы работаете в компании из списка Fortune 500 с несколькими отделами, охватывающими несколько стран. Бизнес-аналитики из финансового департамента хотят использовать вашу таблицу для составления квартального роста продаж автомобилей в своих отчетах для инвесторов после IPO. Вместо предоставления им доступа к Car (поскольку логика, используемая для создания отчетов, может отличаться от логики, используемой для подготовки данных к визуализации в веб-интерфейсе), вы могли бы потенциально создать интерфейс только для чтения для CarDAO с краткий список тщательно отобранных общедоступных атрибутов, которые вы теперь должны поддерживать за пределами отдела. Не дай Бог, вы должны переименовать один из этих атрибутов: будьте готовы к 3-месячному плану заката и множеству грустных информационных панелей и ночных эскалаций. (И, пожалуйста, не предоставляйте им прямой доступ к реальной таблице SQL, поскольку подразумевается, что вся таблица представляет собой открытый интерфейс .) К сожалению, мои шрамы могут отображаться.

Следствие состоит в том, что если вам нужно изменить бизнес-логику в Car (скажем, добавить метод, который вычисляет более низкую продажную цену каждой Tesla после смущающего отзыва), вы бы не t коснитесь CarDAO, поскольку if car.brand == 'Tesla; price = price * 0.6 не имеет ничего общего с доступом к данным.

Дополнительное чтение: CQRS

0 голосов
/ 09 сентября 2018

Принцип единой ответственности , как заявлено Робертом К. Мартином, означает, что

У класса должна быть только одна причина для изменения.

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

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

0 голосов
/ 09 сентября 2018

Для добавления нового свойства вам нужно изменить оба класса, только если это свойство должно быть сохранено в базе данных. Если это свойство используется в бизнес-логике, вам не нужно менять DAO. Также, если вы измените свою базу данных с одного поставщика на другого или с SQL на NoSQL, вам придется вносить изменения только в классе DAO. И если вам нужно изменить какую-то бизнес-логику, вам нужно изменить только Car класс.

...