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 |