198 lines
No EOL
7.5 KiB
Markdown
198 lines
No EOL
7.5 KiB
Markdown
# Новая архитектура команд 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** принципам |