Должен ли я использовать абстрактный базовый класс для этой цели в настоящее время? - PullRequest
4 голосов
/ 23 июля 2010

Я совсем недавно начал профессионально развиваться.Я изучал ООП, когда учился в университете, но не чувствую, что когда-либо действительно использовал его в сценарии «реального мира».

По сути, при попытке создать / манипулировать определенным типом документа в организации,Я создал для него класс, полагая, что в любое время, когда мы захотим создать / манипулировать этим конкретным типом документа, мы можем просто создать его экземпляр и предоставить ему определенную информацию, чтобы он позаботился о себе сам.

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

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

Я предполагаю, что мои вопросы:
1) Должен ли я даже использовать абстрактный класс здесь.Например, это похоже на правильное использование одного или я полностью упустил суть?
2) Если я должен использовать один, я не должен использовать это так рано?Я имею в виду, должен ли я подождать, пока передо мной действительно будет несколько документов, чтобы я мог на самом деле определить, какая функциональность распределена между всеми ними, а не что-то вроде предположения, которое я знаю сейчас, даже если у меня есть только один класс, реализующий его?

Спасибо.

Ответы [ 4 ]

3 голосов
/ 23 июля 2010

Абстрактный класс звучит прямо из вашего описания: существуют определенные свойства и поведения, которые являются общими для всех производных типов (некоторые из них могут быть поведениями по умолчанию, которые могут изменить производные классы). Однако некоторые из производных классов могут иметь дополнительное / альтернативное поведение от других. Если бы не было поведения по умолчанию и только спецификация метода, тогда интерфейс был бы более подходящим.

Что касается того, слишком ли рано: Насколько вы уверены, что вам определенно понадобится более одного производного класса? Я бы не стал настраивать абстрактные базовые классы, пока не возникло никаких сомнений в том, что это будет необходимо. Это известно как ЯГНИ (Вам это не понадобится); не создавайте код до последней возможной минуты, иначе он может вам никогда не понадобиться, и вы обременены дополнительным возможным обслуживанием.

2 голосов
/ 23 июля 2010

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

0 голосов
/ 24 июля 2010

Я бы предположил, что может быть полезно определить как абстрактный класс, так и один или несколько интерфейсов. Обычно используют параметры и переменные типов интерфейса, за исключением подпрограмм, которые имеют дело с созданием объекта (используйте для этого абстрактный класс). Базовый документ и интерфейс могут поддерживать некоторые базовые функции, такие как GetPageCount, RenderToScreenBitmap, RenderToPrinter, RenderToHtml, GetVersionInfo и т. Д. Класс документа, который наследуется от абстрактного класса документа, может использовать логику по умолчанию для любой из тех функций, которые ему не нужно изменять. Однако использование интерфейса, а не базового типа, позволило бы кому-то модифицировать другой тип документа (который может наследовать что-то совершенно другое), чтобы его можно было использовать в вашей системе, добавив необходимые функции интерфейса.

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

0 голосов
/ 23 июля 2010

Если это будет абстрагировано: Да.

Ибо, если вы будете использовать его так раноДа, это простое правило 1, 2, 3.Если вам нужно что-то написать один раз, хорошо.Дважды подумайте о том, чтобы сделать его обычным в зависимости от его размера.Три раза определенно это распространено.

Я большой поклонник создания как можно более общих вещей.Я злюсь, когда мне приходится писать одно и то же несколько раз.

...