Перейти к основному содержимому

6.11. Типы классов

Разработчику Архитектору Аналитику

Типы классов

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

Многие программисты чуть ли не дерутся за соблюдение каких-то принципов, паттернов, но если рассматривать всё это комплексно, то я бы сказал, что происходит просто структурирование системы. Конечно, мы говорим об ООП, поэтому имеем в виду, что выстраивается некий набор каталогов, классы выделяются по коду, и раскладываются по обязанностям и категориям. Но какие бывают эти типы классов?

Важно запомнить, что использование подходов, паттернов и принципов это не обязательные требования, и не стандарты, а скорее архитектурные соглашения и практические рекомендации. В больших проектах важно разделять логику на ответственные части, чтобы код был лёгким, и по названию файла/папки/элемента легко можно было понять, что он делает и зачем он нужен. Имена классов вроде Service, Handler, Listener и т.д. дают семантическую нагрузку (сразу понятно, что делает класс).

Handler (Обработчик) например, обрабатывает какое-то событие, запрос или действие, HTTP-запросы, события UI, сообщения из очередей вроде MQTT, Kafka, часто используется в REST API, и может быть частью шаблона «Цепочка обязанностей» (Chain of Responsibility). Примеры - UserLoginHandler, PaymentRequestHandler, WebSocketMessageHandler.

Listener (Слушатель) ожидает и реагирует на события. Используется в GUI (клики, движения мыши), серверах для ожидания подключений, асинхронных задач. Реализует паттерн «Наблюдатель» (Observer), может работать в фоне и запускать обработчики при наступлении события. Примеры - ButtonClickListener, OrderCreatedEventListener, WebSocketConnectionListener.

Service содержит какую-то бизнес логику, выполняет операцию, используя API, файлы, вычисления и прочие бизнес-правила вне UI. Примеры - UserService, PaymentService, NotificationService.

Creator, Factory, Builder ответственные за создание объектов (реализация порождающих паттернов). Примеры - UserFactory, ReportBuilder, DocumentCreator.

Updater или Modifier изменяют состояние объекта или системы (обновление данных, изменение состояния сущности). Примеры - UserProfileUpdater, OrderStatusUpdater, SettingsModifier.

Repository или DAO взааимодействуют с базой данных или источником данных для чтения, записи, маппинга. Примеры - UserRepository, ProductDAO, FileStorageAdapter.

Provider предоставляет данные или сервисы другим частям приложения (используется в DI или для получения данных из внешнего источника). Примеры - ConfigurationProvider, CurrencyRateProvider, AuthenticationProvider.

Manager обобщённый, может управлять какими-либо сущностями или процессами. Примеры - SessionManager, DownloadManager, CacheManager. Validator проверяет корректность данных. Примеры - EmailValidator, OrderValidator, InputSanitizer.

Helper или Utility бывает статическим классом или набором функций для вспомогательных задач (форматирование, работа с датами, конвертация). Примеры - StringUtils, DateUtils, MathHelpers.

Constants / Consts / Config хранят в себе неизменяемые значения, к примеру, настройки или идентификаторы. Примеры - AppConstants, ApiEndpoints, FeatureFlags.

Controller принимает входящие запросы и направляет их в нужные части приложения (мост между UI и бизнес-логикой). Примеры - UserController, ProductController, ApiController.

Model / DTO / Entity представляет данные в виде объектов. Примеры - UserEntity, OrderDTO, ProfileModel.

Всё это перечислять слишком подробно смысла особого нет, однако ознакомиться стоит. Важно придерживаться порядка, к примеру, вместо магического Abracadabra4 лучше класс назвать как UserLoginHandler. Ну или AbracadabraHandler, тогда хотя бы понятно будет, что это обработчик сущности Abracadabra. Словом, главное правильно всё это спроектировать, разделить и потом только писать.

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

Абстрактные классы

Абстрактные классы - это интерфейсы, абстракции и контракты.

КлассОписаниеПаттерны
InterfaceИнтерфейс описывает контракт поведения без реализации.Strategy, Factory, Observer
Abstract ClassАбстрактный класс представляет собой базовый класс с частичной реализацией.Template Method, Abstract Factory
ContractКонтракт по сути то же, что и интерфейс, но чаще используется в доменных слоях DDD.Clean Architecture
Service InterfaceИнтерфейс для выполнения бизнес-операций.MVC, MVP, MVVM, DDD
Repository InterfaceКонтракт для работы с хранилищем данных.DDD, Clean Architecture
DAO (Data Access Object Interface)Абстракция доступа к данным.DAO Pattern, CRUD
Фабрика (Factory Interface)Определяет методы создания объектов.Factory Method, Abstract Factory
Билдер (Builder Interface)Определяет шаги построения сложного объекта.Builder Pattern
Стратегия (Strategy Interface)Определяет взаимозаменяемые алгоритмы.Strategy
Команда (Command Interface)Представляет операцию в виде объекта.Command Pattern
Обработчик (Handler Interface)Обрабатывает запросы, ошибки или события.Цепочка обязанностей (Chain of Responsibility), Middleware
Прослушиватель (Listener Interface)Реагирует на события (уведомления).Observer, Event Listener
Наблюдатель (Observer Interface)Подписывается на изменения состояния другого объекта.Observer
Адаптер (Adapter Interface)Согласует несовместимые интерфейсы.Adapter
Модель (Model Interface)Представляет данные предметной области.MVC, MVP, MVVM
Презентер (Presenter Interface)Передаёт данные между моделью и представлением.MVP
Представление (View Interface)Отвечает за отображение данных пользователю.MVC, MVP
Юзкейс (Use Case Interface)Описывает бизнес-сценарии или действия пользователя.Clean Architecture
Итератор (Iterator Interface)Обеспечивает последовательный доступ к элементам коллекции.Iterator
enum / EnumТип с фиксированным набором значений. Универсальный компонент модели.Domain Model
Specification (Интерфейс спецификации)Определяет логические правила для проверки объектов.DDD, Specification Pattern
Specification ValidatorПроверяет соблюдение условий заданной спецификации.DDD
PortИнтерфейс для взаимодействия с внешними системами или средами.Hexagonal Architecture
SubjectОбъект, который уведомляет подписанные на него объекты об изменениях.Observer
Aggregate Root InterfaceКорневой объект агрегата в DDD, управляющий доступом и целостностью.DDD
Value Object InterfaceОбъект, идентифицируемый по совокупности значений, а не по ID.DDD
Domain Service InterfaceСервис, реализующий поведение, не принадлежащее конкретной сущности.DDD
Entity InterfaceОбъект с уникальной идентичностью и жизненным циклом.DDD
Specification CompositeКомпозиция спецификаций для построения сложных правил проверки.DDD, Composite
Mapper InterfaceИнтерфейс для преобразования данных между уровнями (например, DTO Entity).DTO, DAL, BLL

Конкретные классы

Конкретные классы - это реализация и функционал.

КлассОписаниеПаттерны
MainТочка входа в приложение. Универсальный класс.Все
ControllerОбрабатывает HTTP-запросы.MVC, REST API
ServiceImplРеализация бизнес-сервиса.Всё — от Spring до чистой Java/PHP
RepositoryImplКонкретная реализация репозитория для работы с данными.DDD, Clean Architecture
DAOImplКонкретная реализация доступа к данным.DAO Pattern
ValidatorПроверяет данные на корректность и соответствие правилам.Validation Logic, Input Checks
LoggerЗаписывает логи выполнения приложения.Logging Frameworks, AOP
ExceptionHandlerЦентрализованно обрабатывает исключения в приложении.Global Exception Handling
ErrorHandlerОбрабатывает ошибки выполнения на уровне системы или среды.Middleware, Error Boundaries
Configurator / ConfigНастраивает параметры и поведение приложения.Configuration Management
RouterМаршрутизирует входящие запросы к соответствующим обработчикам.Web Frameworks, REST APIs
RequestHandlerОбрабатывает входящие запросы, может быть частью сервера или middleware.Web Servers, Microservices
ResponseBuilderФормирует структурированный ответ для отправки клиенту.REST, GraphQL
UserСущность, представляющая пользователя системы.DDD, Identity Management
AuthServiceОбеспечивает функциональность авторизации.OAuth, JWT, Login
AuthenticatorПроверяет подлинность учётных данных пользователя.Authentication Flow
AuthorizerПроверяет права доступа к ресурсам.RBAC, ACL
TokenManagerУправляет жизненным циклом токенов (создание, хранение, отзыв).OAuth, JWT
JwtProviderВыдаёт и проверяет JWT-токены.Security Layer
DatabaseSeederНаполняет базу данных тестовыми или справочными данными.Dev/Test Environments
MigratorПрименяет миграции базы данных для управления схемой.ORM, Schema Versioning
SchedulerЗапускает задачи по расписанию.Cron Jobs, Background Workers
TaskRunnerВыполняет фоновые или асинхронные задачи.Queues, Workers
NotifierОтправляет уведомления через различные каналы.Email, SMS, Push
MailerОтправляет электронную почту.Mail Services
SmsSenderОтправляет SMS-сообщения.External APIs
EventDispatcherРаспределяет события подписчикам.Event-Driven Architectures
EventListenerРеагирует на определённые события в системе.Event Bus, Observer
MessageProducerГенерирует сообщения и отправляет их в очередь.Kafka, RabbitMQ
MessageConsumerПолучает и обрабатывает сообщения из очереди.Message Queue Consumers
CacheManagerУправляет операциями кэширования (чтение, запись, инвалидация).Redis, Memcached
HttpClientВыполняет HTTP-запросы к внешним сервисам.REST Clients, Integrations
IntegratorИнкапсулирует взаимодействие с внешними системами.Third-party APIs
ParserАнализирует и преобразует сырые данные (например, JSON, XML).JSON/XML Parsing, Logs
FormatterФорматирует данные для вывода (даты, числа и т.д.).Dates, Numbers, Output
SerializerПреобразует объекты в сериализуемый формат (например, JSON).JSON, XML
DeserializerПреобразует данные из сериализованного формата обратно в объекты.JSON, XML
TransformerПреобразует один тип данных или модель в другой.DTO <-> Entity
MapperПреобразует структуры данных между уровнями (например, DAL → BLL).DTO Mapping, DAL-BLL
ConverterКонвертирует данные между различными форматами (CSV JSON и др.).CSV <-> JSON
LoaderЗагружает данные из источников (файлы, БД, кэш).Files, DB, Cache
SaverСохраняет данные в хранилище.Files, DB
ExporterЭкспортирует данные в заданный формат (CSV, PDF, Excel).CSV, PDF, Excel
ImporterИмпортирует данные из внешних источников.CSV, JSON, Excel
AggregatorСобирает и объединяет данные из нескольких источников.Reports, Analytics
AnalyzerАнализирует данные для извлечения метрик или инсайтов.Business Intelligence, Metrics
CalculatorВыполняет вычисления (финансовые, математические и др.).Financial, Math
ProcessorОбрабатывает данные или запросы (платежи, загрузки и т.п.).Payments, Uploads
ScannerСканирует файлы, данные или систему (например, на безопасность).Security, Logs
ScannerWorkerВыполняет задачи сканирования в фоновом режиме.Concurrent Processing
MonitorОтслеживает состояние системы (здоровье, доступность).Health Checks, Uptime
WatcherСледит за изменениями в файлах, событиях или состояниях.Filesystem, Events
PollerПериодически опрашивает источник данных или статус.API Polling, Status Checks
BootstrapperИнициализирует приложение и его зависимости.Startup Logic
RegistryХранит ссылки на зарегистрированные объекты или сервисы.Dependency Registry
LocatorНаходит и предоставляет нужные зависимости.Service Locator Pattern
ContainerУправляет созданием, внедрением и временем жизни зависимостей.DI Container (Spring, Dagger)
InjectorВнедряет зависимости в компоненты.DI Logic
FactoryСоздаёт объекты по заданному шаблону.Factory
SimpleFactoryПростая фабрика без интерфейса, часто как утилита.Utility Factory
SingletonОбеспечивает наличие только одного экземпляра класса.Singleton
ProxyПредставляет заместителя для другого объекта.Proxy, Lazy Loading
DecoratorДобавляет функциональность объекту без изменения его класса.Decorator
AdapterАдаптирует интерфейс одного класса под другой.Adapter
FacadeПредоставляет упрощённый интерфейс к сложной подсистеме.Facade
UnitOfWorkОтслеживает изменения объектов и координирует их сохранение.DDD, ORM
EntityОбъект с уникальной идентичностью и жизненным циклом.DDD
ValueObjectОбъект, идентифицируемый по значению, а не по ID.DDD
AggregateRootКорневой элемент агрегата, обеспечивающий целостность.DDD
DTO (Data Transfer Object)Объект для передачи данных между процессами или уровнями.Data Transfer
VO (Value Object)Неизменяемый объект, описывающий значение.DDD
POJO / Plain ObjectПростой объект без зависимости от фреймворков.General Purpose
BO (Business Object)Объект, содержащий бизнес-логику.BLL
DAOОбъект доступа к данным.DAL
ModelПредставляет данные предметной области.MVC, ORM
ViewModelМодель, адаптированная для представления.MVVM
PresenterУправляет логикой взаимодействия между моделью и видом.MVP
ViewОтвечает за отображение пользовательского интерфейса.UI Layer
ComponentСамостоятельный компонент пользовательского интерфейса.React, Vue, Angular
HelperВспомогательный класс с общими методами.Utility Methods
Utils / UtilitiesСтатические методы общего назначения.General Helpers
ExtensionРасширяет функциональность существующих классов.Extension Methods (C#), Mixins
WrapperОбёртка вокруг другого объекта для инкапсуляции.Инкапсуляция
StarterЗапускает приложение или процесс.CLI, Boot Process
StopperОстанавливает процессы корректным образом.Graceful Shutdown
TestRunnerЗапускает наборы тестов.Unit Testing
MockerСоздаёт заглушки (mocks) для тестирования.Testing
SpyОтслеживает вызовы методов в тестах.Testing
StubЗаглушка, возвращающая предопределённые значения.Testing
FixtureПодготовленные данные для тестового окружения.Testing
SpecТест-класс в BDD-подходе.BDD Frameworks
ScenarioОписание тестового сценария.BDD
DriverУправляет взаимодействием с устройством или протоколом.Drivers, Hardware
ClientКлиентская часть для взаимодействия с API.REST, gRPC
ServerСерверная часть, обрабатывающая входящие соединения.Network Apps
ConnectionManagerУправляет открытыми соединениями (БД, сокеты).DB, Sockets
PoolУправляет пулом ресурсов (соединения, потоки).Connection Pooling
BufferВременно хранит данные при чтении/записи.IO, Streams
InterceptorПерехватывает вызовы для добавления логики (логирование, безопасность).AOP, Middleware