В последнее время меня беспокоит использование абстрактных классов.
Иногда абстрактный класс создается заранее и работает как шаблон того, как будут работать производные классы. Это означает, более или менее, что они предоставляют некоторые функциональные возможности высокого уровня, но не учитывают некоторые детали, которые должны быть реализованы производными классами. Абстрактный класс определяет потребность в этих деталях, создавая некоторые абстрактные методы. В таких случаях абстрактный класс работает как проект, высокоуровневое описание функциональности или как вы хотите это назвать. Он не может использоваться сам по себе, но должен быть специализированным для определения деталей, которые были исключены из реализации высокого уровня.
Иногда случается, что абстрактный класс создается после создания некоторых «производных» классов (поскольку родительского / абстрактного класса там нет, они еще не были получены, но вы понимаете, что я имею в виду). В этих случаях абстрактный класс обычно используется как место, где вы можете поместить любой тип общего кода, который содержат текущие производные классы.
Сделав вышесказанное, мне интересно, какой из этих двух случаев должен быть правилом. Должны ли какие-либо подробности передаваться абстрактному классу только потому, что они в настоящее время являются общими для всех производных классов? Должен ли существовать общий код, который не является частью высокоуровневой функциональности?
Должен ли быть код, который может не иметь никакого значения для самого абстрактного класса, только потому, что он является общим для производных классов?
Позвольте мне привести пример: у абстрактного класса A есть метод a () и абстрактный метод aq (). Метод aq () в обоих производных классах AB и AC использует метод b (). Должен ли b () переместиться в A? Если да, то если кто-то смотрит только на A (давайте притворимся, что AB и AC не существуют), существование b () не имело бы особого смысла! Это плохо? Должен ли кто-то иметь возможность взглянуть на абстрактный класс и понять, что происходит, не посещая производные классы?
Честно говоря, в момент, когда я спрашивал об этом, я склонен полагать, что написание абстрактного класса, который имеет смысл без необходимости смотреть на производные классы, это вопрос чистого кода и чистой архитектуры. Really на самом деле не нравится, что идея абстрактного класса, который действует как дамп для любого вида кода, часто встречается во всех производных классах.
Что ты думаешь / практикуешь?
Writing an abstract class that makes sense without having to look in the derived classes is a matter of clean code and clean architecture.
-- Почему? Разве не возможно, что в ходе проектирования и разработки приложения я обнаружил, что несколько классов имеют общие функциональные возможности, которые естественно могут быть преобразованы в абстрактный класс? Должен ли я быть достаточно ясновидящим, чтобы всегда предвидеть это, прежде чем писать какой-либо код для производных классов? Если мне не удастся быть таким проницательным, запрещено ли мне проводить такой рефакторинг? Должен ли я выбросить свой код и начать все сначала?