дизайн иерархии классов - PullRequest
       4

дизайн иерархии классов

1 голос
/ 01 февраля 2012

Я хочу определить иерархию классов для моего проекта Java. Мое намерение состоит в том, чтобы получать электронные письма от учетной записи электронной почты и сохранять их в базе данных либо с IMAP, либо с POP3 в зависимости от веб-сайта (например, gmx поддерживает IMAP и yahoo поддерживает POP3). Я использую API Java для этого. Предположим, у меня есть 2 подкласса с именами IMAP и POP3. Их соответствующие методы, как показано ниже:

POP3

  1. Execute_Parser
  2. Fetchemails
  3. CreateMSGDigest
  4. Get_Foldername
  5. Scan_Table
  6. Store_Emailinfo

IMAP

  1. FetchEmails
  2. CreateMSGDigest
  3. Scan_Table
  4. Store_Emailinfo

Как видите, POP3 необходимо реализовать 2 дополнительных метода, которые не нужны IMAP. Реализация общих методов будет одинаковой для обоих классов. Может кто-нибудь предложить, пожалуйста, какие методы я должен поместить в базовый класс? Я предполагаю, что все методы IMAP, которые являются общими для обоих классов. но тогда как насчет двух других методов POP3 (Execute_Parser и Get_Foldername)?

Ответы [ 2 ]

0 голосов
/ 08 февраля 2012

tl; dr Подклассификация не имеет смысла, поскольку между POP3 и IMAP нет отношения IS-A

При использовании подклассов используются совершенно иные семантики / мотивации. Во-первых, вы пытаетесь смоделировать некоторые естественные отношения IS-A между двумя сущностями в вашем контексте. Вопрос в вашем контексте заключается в том, существует ли взаимосвязь IS-A между протоколом IMAP и POP3. Ответ здесь - нет! Протокол IMAP не является производным от POP3, он не совместим и т. Д. Другая семантика иерархий классов концентрируется на концептуальных интерфейсах, что означает, что вы моделируете иерархию классов для фактического использования экземпляров классов единообразным и полиморфным способом. Альтернативой этому подходу является не использование подклассов, которое приводит к тесной связи классов, а использование интерфейсов и общий код с помощью шаблонов композиции.

Я бы пошел за использование интерфейсов и поделился общим кодом через композицию, потому что при таком подходе вы избегаете жесткой привязки классов, которые не имеют отношения IS-A.

0 голосов
/ 01 февраля 2012

Возможно, вы захотите добавить все 6 методов в ваш базовый класс и предоставить пустую реализацию по умолчанию.В вашей реализации Pop3 вы переопределяете все 6 методов, а в классе Imap только 4, которые вам нужны.

Теперь, в зависимости от ваших потребностей, вы можете добавить другие методы для запроса объекта, нужно ли вам вызывать методы Get_Foldername и Execute_Parser (например, boolean isUseParserRequired ()).Если мы предполагаем, что вы создаете EmailProtocol абстрактный базовый класс и хотите использовать его универсальным образом, вам может потребоваться добавить такие вспомогательные методы.Это позволит вам использовать универсальный интерфейс при манипулировании EmailProtocol экземплярами, а не полагаться на if/else, чтобы определить, какой у вас экземпляр, а затем вызывать соответствующие методы.

И, как упоминает JB Nizet, вам определенно следует придерживаться соглашений об именах Java.

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