ООП Дизайн Вопрос - Связь с прекурсорами - PullRequest
0 голосов
/ 18 сентября 2009

Я пишу программу для поиска и экспорта вывода.
У меня есть три основных объекта:

  • Запрос
  • Результаты поиска
  • ExportOutput

Каждый из этих объектов связан со своим предшественником.

Т.е.: ExportOutput -> SearchResults -> Запрос

Это нормально? Должны ли они быть как-то более слабо связаны?

Уточнение:

В последующих процессах используются свойства и методы для объектов-предшественников.

То есть:

SendEmail(output.SearchResults.Request.UserEmail, BODY, SUBJECT);

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

MailAddress UserEmail
{
  get { return SearchResults.UserEmail; }
}

что бы дать

SendEmail(output.UserEmail, BODY, SUBJECT);

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

Примечание: SearchResults реализует IDisposable, поскольку он ссылается на неуправляемые ресурсы (временные файлы), поэтому я действительно не хочу просто дублировать это в ExportOutput.

Ответы [ 2 ]

2 голосов
/ 18 сентября 2009

Если A использует B напрямую, вы не можете:

  • Повторное использование A без повторного использования B
  • Испытание A изолированно от B
  • Измените B, не рискуя сломать A

Если бы вместо этого вы проектировали / программировали интерфейсы, вы могли бы:

  • Повторное использование A без повторного использования B - вам просто нужно предоставить что-то, что реализует тот же интерфейс, что и B
  • Тест A изолированно от B - вам просто нужно заменить Mock Object.
  • Измените B, не рискуя сломать A - потому что A зависит от интерфейса, а не от B

Итак, как минимум, я рекомендую извлечь интерфейсы. Кроме того, это может быть полезно для вас: Принцип обращения зависимостей (файл PDF).

0 голосов
/ 18 сентября 2009

Не зная вашей специфики, я бы подумал, что результаты в любой форме будут просто возвращены из метода запроса (может быть более одного такого метода из настроенного запроса, например find_first_instance vs. find_all_instances). Тогда метод вывода Экспортера будет принимать результаты в качестве входных данных. Так что я вообще не предполагаю необходимости связывать объекты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...