2010-01-28 4 views
1

Существует два класса: A и B.Проблема разработки программного обеспечения OOP

И мне нужно реализовать функцию whoViewed,

У меня есть два варианта, сделать его функция состоит A и B .which попахивает дубликат.

Другой выбор - сделать его отдельным классом: Viewer, но он более абстрактный.

Если бы вы были мной, то каким образом вы выберете?

Чтобы сделать его более общим:

, что вы делаете, когда вам необходимо получить статистическую информацию между различными классами (как получить последние просмотренные 10 лиц {которые могут быть A или B} из базы данных) в пределах объем ООП.

+3

У вас есть очень определенный вопрос в голове, но нам нужно узнать больше о том, что у вас в голове, чтобы ответить на него. – wheaties

+0

Er, то, что вы на самом деле пытаетесь сделать, может быть актуальным. –

+2

Я бы выбрал арбузы. Определенно арбузы. –

ответ

2

Очевидно, что дублирование метода whoViewed() в 2-х местах плохое, так что опция находится вне таблицы. У вас есть третий вариант: создайте родительский класс, который реализует whoViewed() и имеет унаследованные A и B. Известная книга «Банда четырех» Design Patterns рекомендует использовать композицию над наследованием. Таким образом, это предложило бы сделать класс Viewer, который вы упомянули в вопросе. Учитывая ограниченный контекст, предоставленный в вашем вопросе, я бы посоветовал взять совет GoF и пойти с классом Viewer.

Кстати, если вы ожидаете, что реализация whoViewed() быть различными в A и B, вы могли бы сделать Viewer интерфейс и реализовать интерфейс в A и B.

+0

Итак, когда вам нужно работать с двумя или более классами, создайте для этого новый класс? – user198729

+0

И если мне нужно получить последние просмотренные 10 сущностей из базы данных, трудно (невозможно?) Сделать его интерфейсом 'A' и' B' – user198729

+0

Предпочитаете композицию для наследования. –

1

, если WhoViewed в A и B имеет ту же функциональность, создайте класс, из которого они могут наследовать.

Если реализация метода различна для обоих классов, из, если они уже наследоваться от другого класса, использовать интерфейс для A и B.

3

Я бы рекомендовал не использовать наследование и вместо того, чтобы идти с композицией. Создайте класс с именем ViewMonitor, который будет обрабатывать общие функции. Скорее всего, нет логического способа создания структуры наследования.

0

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

1

Я бы не предложил вводить наследование здесь, потому что это серьезное решение, требует, чтобы оба класса были действительно полиморфными во всех аспектах. В этом случае - выполните реализацию в третьем классе, сделайте этот класс членом A и B, а затем делегируйте вызов методу whoViewed этому члену. В псевдокоде: класс C { WhoViewed(); }

Класс A { C m_C; WhoVied { m_c.WhoViwed(); }

В В то же самое, как и в А.

Если говорить на языке ООД - заменить наследование с делегацией.

1

Я бы использовал состав и делегировать внешний объект. Ваша проблема звучит как перекрестная озабоченность, поэтому AOP может быть для вас вариантом.

В зависимости от языка вы можете использовать Mixins (Ruby) или Traits (Scala).

1

Это похоже на проблему AOP и должно быть разрешено с использованием аспекта.

Если вы можете подумать о том, «кто просмотрел», как аспект, который вы можете сохранить последние просмотренные 10 объектов из базы данных.

После этого вы перехватите вызовы своим сущностям и сохраните необходимые метаданные в удобном для нахождения месте.

Смежные вопросы