2010-02-11 2 views
0

Ищите мнения об этом:OO Design Вопрос

Я разбил различные обязанности на отдельные объекты. Однако многие из этих объектов имеют зависимости друг от друга. Все эти объекты придерживаются интерфейсов, поэтому я не привязан к реализации. Меня беспокоят зависимости между объектами и потенциал для круговых зависимостей. Является ли это симптомом плохого дизайна? Что сделали другие люди для разделения обязанностей и управления зависимостями? Благодарю.

+0

одна вещь, которую вы не хотите делать, - это слишком много интерфейсов, где логически только одна реализация, она будет запутывать ваш код, когда вы попытаетесь и будете поддерживать. (думаю, что нужно управлять файлами заголовков в C/C++). Каждый раз, когда вы добавляете свойство или метод в iterface, вы должны обращаться ко всем классам реализации и обеспечивать реализацию. Это действительно очень грязно, даже с хорошей рефакторинговой IDE, такой как Intellij IDEA. –

+0

@TheNoob: вы принимаете ссылки на объекты во время выполнения, а не на зависимости классов? Вы говорите, что объекты прилипают к интерфейсам, что отлично, поэтому классы должны зависеть только от интерфейсов, поэтому не должно быть круговых зависимостей. Однако во время выполнения вы можете легко получить круговые ссылки - это то, что вы имеете в виду? – quamrana

+0

По круговым зависимостям я имел в виду, что класс А зависит от класса В, а класс В зависит от класса А. Каждый из них состоит из экземпляра другого. – 2010-02-12 15:56:34

ответ

2

Важно то, что объектные модели имеют Low Coupling и High Cohesion. Это означает, что вещи должны зависеть от других вещей только тогда, когда они должны (Сцепление), и что они должны делать одно и только одно (очень хорошо) (сплоченность). Нет простого ответа о том, когда ваши решения, кроме опыта (а это значит, что вы учитесь на ошибках), станут вашим основным драйвером. Существует множество шаблонов проектирования для адресации муфты (Facade, Composite, Memento, Decorator, etc). Сплоченность, как правило, просто упражнение рефакторинга для перемещения вещей в классы или из классов, когда вы начинаете работать с ними.

0

Ну, вы можете вставлять эти зависимости .... Если foo зависит от реализации бара, то для его конструктора требуется экземпляр bar в качестве аргумента или его можно установить с помощью метода setter.

1

Как правило, я стараюсь избегать круговой зависимости, как чума, потому что это заставляет вещи причинять боль и создавать их. Это также указывает на то, что круглозависимые объекты очень плотно связаны. Хотя это может быть необходимо, если оно представляет собой существенную сложность в вашей проблеме, эта связь должна быть выражена более просто и чисто в этих случаях. Это может указывать на то, что вам было бы лучше использовать наследование, если один объект явно является «базовым» объектом, а другой - явно «настраиваемым» объектом. В частности, круговая зависимость является сильным намеком на то, что вы должны использовать шаблон метода шаблона вместо шаблона стратегии. Круговые зависимости также могут указывать на то, что вам было бы лучше using a third class to model your problem.

0

Как еще один читатель указал, что вы хотите, чтобы ваши классы имели низкую сцепку и высокую сцепленность. Если у ваших классов есть риск круговых зависимостей, это звучит так, как будто у вас плохой запах кода.

Рассмотрите взаимосвязь в многоуровневом обращении сверху вниз. т. е. какой класс имеет смысл сдерживать другое? Если это не так, и вам нужны функциональные возможности обоих классов, тогда рассмотрим класс составных адаптеров, содержащий оба.

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