На какие вопросы отвечает поведение объекта? - PullRequest
3 голосов
/ 09 марта 2010

Читая книгу, я нашел следующее утверждение:

(Объект) Поведение отвечает на один из двух вопросов: Что этот объект делает (для меня)? или Что я могу сделать с этим объектом? В случае оранжевого , это не очень много, но мы можем сделать что-то с этим. Одним поведением является то, что его можно есть.

В моем понимании поведения объекта приведенное выше утверждение верно в отношении первого вопроса и неверно в случае второго. Тем не менее, я часто вижу классы с такими методами, как Orange :: eat () , и я не уверен в своих навыках проектирования. Поэтому я хотел бы спросить, является ли ошибкой дизайна дать апельсинам поведение кушать ? (апельсины и едят используются только для примера)

Ответы [ 3 ]

3 голосов
/ 09 марта 2010

Я думаю, что нет ничего плохого в вашем мышлении об объектах и ​​их обязанностях. Orange::eat() имело бы смысл, если бы у апельсинов были рты. В противном случае, это Animal, кто делает еду.

В том-то и дело, что предложения SVO (Subject-Verb-Object) не всегда являются лучшим способом описания чего-либо, но ООП, похоже, сильно склоняется к такому утверждению, поэтому мы часто сталкиваемся со странными, неестественными и абстрактные конструкции предложений в коде.

1 голос
/ 09 марта 2010

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

В этом очевидном примере ответ прост, но он становится более сложным в реальных сценариях, вы можете взглянуть на Agile Принципы, Шаблоны и Практики в C # Роберта Мартина. Пройдите через несколько сценариев и поймите, кто что будет делать и т. Д.

1 голос
/ 09 марта 2010

Давайте возьмем классический образец сотрудника. «Что я могу сделать для этого объекта» означает:

void SetSalary(int value);

Еда апельсина - это не апельсиновый метод, а метод человека:

void Eat(Orange& orange);
...