Как можно именовать классы заказов в контексте паттерна «Состояние»?

У меня есть заказ с моделью Order, который может находиться в двух состояниях: платный (сумма больше нуля) и бесплатный (сумма равна нулю). В зависимости от статуса заказа в сервисе применяется различная логика. Я хочу использовать паттерн "Состояние", но не могу определить, как лучше назвать эти состояния. В данный момент я придумал абстрактный класс MoneyState и два класса-состояния: HasMoney и NoMoney. Однако мне нужно использовать метод getRedirectUrl, и связь с использованием $money->getRedirectUrl() кажется нечитабельной. Как лучше назвать состояния и соответствующие классы?
  • 7 сентября 2024 г. 14:12
Ответы на вопрос 2
Использование паттерна «Состояние» в вашем случае действительно подразумевает наличие абстрактного класса и конкретных классов-состояний. Поскольку вы хотите, чтобы использование метода `getRedirectUrl` было более интуитивным и читабельным, возможно, стоит рассмотреть более семантические имена для классов.

Вот несколько подходов к именованию классов-состояний:

1. **PaymentState** (абстрактный класс)
   
   - `PaidState` (класс для платного состояния)
   - `FreeState` (класс для бесплатного состояния)

   ```php
   abstract class PaymentState {
       abstract public function getRedirectUrl();
   }

   class PaidState extends PaymentState {
       public function getRedirectUrl() {
           // логика для платного состояния
       }
   }

   class FreeState extends PaymentState {
       public function getRedirectUrl() {
           // логика для бесплатного состояния
       }
   }
   ```

2. **OrderState** (абстрактный класс)
   
   - `OrderPaid` (класс для платного состояния)
   - `OrderFree` (класс для бесплатного состояния)

   ```php
   abstract class OrderState {
       abstract public function getRedirectUrl();
   }

   class OrderPaid extends OrderState {
       public function getRedirectUrl() {
           // логика для платного состояния
       }
   }

   class OrderFree extends OrderState {
       public function getRedirectUrl() {
           // логика для бесплатного состояния
       }
   }
   ```

3. **OrderPaymentStatus** (абстрактный класс)

   - `Paid` (класс для платного состояния)
   - `Free` (класс для бесплатного состояния)

   ```php
   abstract class OrderPaymentStatus {
       abstract public function getRedirectUrl();
   }

   class Paid extends OrderPaymentStatus {
       public function getRedirectUrl() {
           // логика для платного состояния
       }
   }

   class Free extends OrderPaymentStatus {
       public function getRedirectUrl() {
           // логика для бесплатного состояния
       }
   }
   ```

Когда вы будете использовать эти классы, код станет более читаемым:

```php
$order = new Order();
$order->setState(new Paid());
$url = $order->getRedirectUrl();
```

Каждый из этих вариантов улучшает читаемость, так как названия состояний явно указывают на их эффект и контекст, а метод `getRedirectUrl` остаётся простым и понять, что данная логика связана именно с состоянием заказа. Выбор подходящего названия также зависит от общего контекста вашей системы, поэтому выбирайте то, что будет легче воспринимать вам и вашей команде.
В компьютерных науках есть только две сложные проблемы – инвалидация кэша и именование переменных
называй как тебе будет понятней, с опытом будешь точнее попадать.

это абстрактный класс MoneyState и два класса-состояния с логикой HasMoney и NoMoney.
не видя общую картинку как ты у тебя там выдаются названия, можно предлагать как OrderState, StandartOrderState и FreeOrderState, так и BaseState, State и FreeState, и т.д, и т.п.
Похожие вопросы