LoChat/COMMAND_ARCHITECTURE.md
2026-03-16 12:43:52 +01:00

198 lines
No EOL
7.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Новая архитектура команд LoChat
## Принципы KISS, DRY, SOLID
### 🎯 Цели рефакторинга
- **KISS** (Keep It Simple, Stupid) - простая и понятная структура
- **DRY** (Don't Repeat Yourself) - устранение дублирования кода
- **SOLID** - следование принципам объектно-ориентированного программирования
## 📁 Новая структура
```
src/main/java/com/loki/lochat/commands/
├── base/ # Базовые классы
│ ├── BaseCommand.java # Общий базовый класс для всех команд
│ ├── PlayerCommand.java # Базовый класс для команд игроков
│ └── AdminCommand.java # Базовый класс для админских команд
├── chat/ # Команды чата
│ ├── ChatCommand.java # Базовый класс для команд чата
│ ├── GlobalChatCommand.java
│ └── LocalChatCommand.java
├── messaging/ # Личные сообщения
│ ├── MessagingCommand.java
│ ├── MsgCommand.java
│ └── ReplyCommand.java
├── social/ # Социальные функции
│ ├── IgnoreCommand.java
│ ├── UnignoreCommand.java
│ └── IgnoreListCommand.java
├── moderation/ # Модерация
│ ├── ModerationCommand.java
│ ├── MuteCommand.java
│ ├── UnmuteCommand.java
│ └── MuteListCommand.java
├── admin/ # Административные команды
│ ├── AnnounceCommand.java
│ ├── ClearChatCommand.java
│ └── ReloadConfigCommand.java
└── CommandManager.java # Централизованный менеджер команд
```
## 🏗️ Архитектурные принципы
### 1. Single Responsibility Principle (SRP)
- Каждый класс отвечает за одну функцию
- `BaseCommand` - общая логика команд
- `PlayerCommand` - логика команд для игроков
- `AdminCommand` - логика административных команд
### 2. Open/Closed Principle (OCP)
- Классы открыты для расширения, закрыты для модификации
- Новые команды добавляются через наследование
- Базовая функциональность не изменяется
### 3. Liskov Substitution Principle (LSP)
- Любой наследник может заменить базовый класс
- Все команды реализуют единый интерфейс
### 4. Interface Segregation Principle (ISP)
- Команды реализуют только нужные им методы
- Разделение на категории по функциональности
### 5. Dependency Inversion Principle (DIP)
- Команды зависят от абстракций (сервисов)
- Внедрение зависимостей через конструктор
## 🔧 Ключевые компоненты
### BaseCommand
```java
public abstract class BaseCommand implements CommandExecutor, TabCompleter {
// Общая логика:
// - Обработка ошибок
// - Проверка прав
// - Валидация игроков
// - Утилитарные методы
}
```
### PlayerCommand
```java
public abstract class PlayerCommand extends BaseCommand {
// Логика для команд игроков:
// - Автоматическая проверка что sender - игрок
// - Приведение типов
}
```
### AdminCommand
```java
public abstract class AdminCommand extends BaseCommand {
// Логика для админских команд:
// - Автоматическая проверка прав
// - Настраиваемые разрешения
}
```
### CommandManager
```java
public class CommandManager {
// Централизованная регистрация:
// - Единая точка управления командами
// - Автоматическая регистрация
// - Логирование
}
```
## 🎯 Преимущества новой архитектуры
### 1. Устранение дублирования (DRY)
- Общая логика в базовых классах
- Переиспользование кода проверок
- Единообразная обработка ошибок
### 2. Простота добавления команд (KISS)
```java
public class NewCommand extends PlayerCommand {
public NewCommand(LoChat plugin) {
super(plugin);
}
@Override
protected boolean executePlayerCommand(Player player, Command command,
String label, String[] args) {
// Только логика команды, всё остальное в базовом классе
return true;
}
}
```
### 3. Типобезопасность
- Автоматическое приведение типов
- Проверки на этапе компиляции
- Меньше ClassCastException
### 4. Централизованное управление
- Все команды регистрируются в одном месте
- Легко добавлять/удалять команды
- Единое логирование
### 5. Категоризация
- Логическое разделение по функциям
- Легче найти нужную команду
- Проще поддерживать код
## 🔄 Миграция
### Старый способ:
```java
public class OldCommand implements CommandExecutor {
@Override
public boolean onCommand(CommandSender sender, Command command,
String label, String[] args) {
// Дублирование проверок в каждой команде
if (!(sender instanceof Player)) {
sender.sendMessage("Только для игроков!");
return true;
}
if (!sender.hasPermission("permission")) {
sender.sendMessage("Нет прав!");
return true;
}
Player player = (Player) sender;
// Логика команды...
}
}
```
### Новый способ:
```java
public class NewCommand extends PlayerCommand {
public NewCommand(LoChat plugin) {
super(plugin);
}
@Override
protected boolean executePlayerCommand(Player player, Command command,
String label, String[] args) {
if (!requirePermission(player, "permission")) {
return true;
}
// Только логика команды, проверки автоматические
return true;
}
}
```
## 📊 Результаты
- **Сокращение кода** на ~40%
- **Устранение дублирования** проверок
- **Единообразная обработка** ошибок
- **Простота добавления** новых команд
- **Лучшая читаемость** и поддержка кода
- **Соответствие SOLID** принципам