моделирование на основе ответственности в сравнении с причинами изменения класса
-
05-07-2019 - |
Вопрос
В этом тексте, который я прочитал
Будьте внимательны к компоненту, который просто прославленная ответственность. компонент должен захватывать абстракция, которая имеет цель в система. Может случиться так, что появляется в один момент как значимый компонент действительно только один ответственность остается сама по себе. Тот ответственность может быть возложена на компонент. р>
Это меня смущает. Если у класса должна быть только одна причина для изменения, кажется, что он должен иметь одну ответственность. Но теперь, кажется, я принимаю это слишком узко. Может ли как-то дать объяснение ответственности и причины изменения в контексте моделирования ответственности? Может ли класс иметь более двух обязанностей и при этом иметь одну причину для изменения (или наоборот)?
Решение
Читать о моделировании (или дизайне) класса-ответственности-сотрудничества
http://www.agilemodeling.com/artifacts/crcModel.htm р>
http://alistair.cockburn.us/Using+CRC+cards р>
http: //users.csc.calpoly. Edu / ~ jdalbey / SWE / CaseStudies / ATMSim / CRCmodel.html р>
http://c2.com/doc/oopsla89/paper.html р>
У класса может быть несколько обязанностей. Он всегда представляет одну «вещь». Р>
" одна из причин изменить " Правило не распространяется на обязанности. Период.
" одна из причин изменить " Правило следует использовать следующим образом.
<Ол>Это не значит "1". Это означает «как можно меньше».
Это относится к " интерфейсу " или "лежащая в основе абстракция"; или «концепция» для класса. Класс должен содержать несколько понятий. Когда основная концепция меняется, класс меняется. Р>
Многие простые вещи лучше, чем несколько сложных. Проще рекомбинировать и модифицировать простые вещи.
Внутри каждой сложной вещи есть много простых вещей, пытающихся быть свободными.
Трудно определить "простой", но "один концепт" закрыто. «Одна вещь, которую нужно изменить» также является полезным тестом для «простоты».
Наконец, "одна причина для изменения" буквально не означает «1».
Другие советы
Как я понимаю, опасность "прославлять ответственность перед компонентом" означает, что вы должны быть осторожны, чтобы не переводить обязанности непосредственно на компоненты системы.
Например, в системе электронной почты пользователь может обратиться к системе с целью инициирования сообщения получателю. Ответственность за то, чтобы это стало возможным, лежит на системе.
Пользователь также может обратиться к системе, чтобы прочитать и ответить на электронное письмо. Система также обязана сделать это возможным.
Но значит ли это, что должны быть два компонента " инициировать новое письмо " и " ответить на электронную почту " в системе? Нет. Обычный "составить письмо" Компонент сможет обрабатывать оба требования.
Таким образом, в этом случае компонент " составить письмо " отвечает за цели пользователя "инициировать новую почту" и " ответить на почту " ;. Но его нужно будет изменить, только если изменится его основная концепция (" составление писем ").
Еще раз внимательно посмотрите на следующую фразу Кокберна: "Компонент должен захватывать абстракцию, которая имеет цель в системе". Цель в системе (причина изменения) не совпадает с целью достижения цели (ответственности) пользователя.
Короче говоря, на мой взгляд, в идеале компонент имеет одну основную концепцию. Это может иметь несколько обязанностей. Но, на мой взгляд, одна ответственность не может быть назначена более чем одному компоненту.