2010-12-27 2 views
3

У меня есть два объекта. Объект Meeting и объект Action (действие, поднятое на собрании). Действие может также существовать независимо от Совещания. У меня есть два способа увязки действий поднятых на совещание:Сцепление в дизайне OO

  1. есть метод на совещании, где я передать в объекте действия, такие как «addToMeeting (Действие действия)». WIthin inals of Meeting Затем я связываю действие с встречей . Для этого подхода, хотя объект Meeting должен знать около и использовать методы на объекте Action , поэтому он становится связанным.
  2. есть способ на Встрече, где я просто передаю номер действия, который должен быть указан как как «addToMeeting (int actionID)». Большого объект в настоящее время встречи не нужно знать ничего о действии но ...... теперь код добавления действий на встречу необходимо знать как получить действие ID так уже отвернулся от этого " meeting.addToMeeting (действие) "до это " meeting.addToMeeting (action.getID()) ".

Для хорошего дизайна OO, какой подход следует использовать? Или есть третий способ ...

+0

Я думаю, что вы можете найти книгу ([посмотреть онлайн] (http://books.google.co.uk/books?id=9CL446IzhuAC&pg=PA38&lpg=PA38&dq=events+chapter+one+coupling&source=bl&ots= qmJTOuCz90 и сиг = EZKvZBjF8QmGohatC97HsmAqG0c & гл = еп & е = wj6tTqe5LcTX8gON_YyiCw & са = X & OI = book_result и кт = результат & resnum = 6 & вед = 0CEMQ6AEwBQ # v = OnePage & д = события% 20chapter% 20-ОН% 20coupling & F = ложь)) "на основе событий программирования: принимать события до предела " не принимать название по номинальной стоимости - глава первая дает проницательное описание и способ, с помощью которых уменьшить/сдвинуть связь на более низкие формы связанного поведения. –

ответ

0

Пока встречи связаны с действиями в любом случае, у вас будет какая-то связь. Однако вы можете рассмотреть третий подход, чтобы создать «фабрику действий», которая генерирует объекты действий. Идентификатор будет свойством объекта Action, как только он будет создан (и, возможно, сохранен). Вся эта встреча будет заключаться в том, чтобы сообщить фабрике о создании действия и иметь доступ к свойству идентификатора действия.

+0

Хотя это может быть лучшим подходом в некоторых ситуациях (при условии, что пример, на который мы смотрим, не является ниспадающей версией проблемного домена OP), я думаю, что это добавляет ненужные осложнения к простой ситуации. – Nate

+0

Спасибо за вашу помощь. Самый поучительный. – poulenc

0

Я бы выбрал вариант № 1 - соединение не плохо, в вашем случае, поскольку между объектами существует четкая связь. Я бы пошел с опцией №1. Это дает вам возможность для собрания иметь свойство MeetingActions[] или что-то подобное.

1

Я хотел бы предложить вам создать интерфейс «идентифицирующую» с помощью метода GetId() на нем, которая реализуется с помощью действий

Затем вы можете сделать следующее:

addToMeeting(Identifiable action); 

и внутри метода сделать

this.actionId = action.getID(); 
+0

Спасибо. Это будет хорошо работать. Вместо того, чтобы идентифицировать, я буду использовать интерфейс «MeetingItem», который позволит мне прикрепить любой элемент к собранию, которое реализует интерфейс, как вы предлагаете. – poulenc

5

Если только думаю, что вы когда-либо планировать ссылки на Meeting случаях являются действия, то это было бы представляется наиболее подходящим, чтобы сделать Meeting осведомленным о Action, а не наоборот.

Имея класс Actions, управляющий внутренними элементами Meeting, обрывает инкапсуляцию и, как правило, затрудняет сохранение такого кода. Таким образом, я бы выставил метод addAction(Action a) на Meeting в этом случае.

Однако, если есть другие вещи, которые могут быть связаны с собранием, вы можете рассмотреть абстрагирование понятия «элементы собрания».

Вместо того, чтобы иметь Meeting знать о Action,, или наоборот, вы могли бы определить интерфейс, такой как IMeetingItem который предоставляет необходимую информацию, Meeting нужно будет связать с такими деталями. Action затем воплотят IMeetingItem, что позволяет сделать что-то вроде:

meeting.addItem(action); // action treated as an IMeetingItem in this context 

Обратите внимание, что в обоих подходах, это Meeting класс, который опосредует функциональность добавления элемента к самому себе, а не имея добавляемый элемент манипулирует внутренним представлением собрания.

+0

Спасибо. Действительно, как вторая часть, так как это означает, что я могу добавить этот интерфейс к любому объекту, который хочу добавить на собрание (например, к проблеме), и встреча должна знать только об интерфейсе. – poulenc

+0

Во-вторых, это. Интуитивно существуют встречи, чтобы решить, что делать, поэтому имеет смысл, что 'Meeting' знает о' Action'. С другой стороны, в достаточно продуктивной компании не все виды действий будут касаться управления встречами, поэтому отношения не нужны в самом общем интерфейсе действий. –