Могу ли я использовать фасад внутри класса, который его создает?

Как правильно организовать использование PriceConvert в классе CheckStatus, если фасад Payments служит точкой доступа для большинства операций в системе? Следует ли вызывать метод PriceConvert через фасад Payments::priceConvert, учитывая, что он реализован на более низком уровне, или лучше создать объект PriceConvert непосредственно? Мне не хочется создавать объекты, когда уже есть фасад, но при этом я не совсем уверен, как это правильно реализовать с точки зрения архитектуры, чтобы сохранить эстетику кода и его удобочитаемость. Какие подходы к этой ситуации наиболее целесообразны?
  • 13 октября 2024 г. 18:02
Ответы на вопрос 2
Использование фасадов в архитектуре приложения подразумевает абстрагирование сложной логики и предоставление простого интерфейса для работы с системой. В случае с классами `CheckStatus`, `Payments` и `PriceConvert`, вы можете рассмотреть несколько подходов.

### Подходы к организации взаимодействия

1. **Использование фасада**: Это наиболее простое и эффективное решение. Если `Payments` уже служит точкой доступа к `PriceConvert`, то вызов `Payments::priceConvert()` является правильным выбором. Это позволяет вам не заботиться о том, как именно реализован `PriceConvert`, и может облегчить тестирование и поддержку кода.

    ```php
    class CheckStatus {
        public function check() {
            $price = Payments::priceConvert($somePrice);
            // Логика проверки статуса
        }
    }
    ```

2. **Инъекция зависимостей**: Если `PriceConvert` является важным компонентом, вы можете рассмотреть возможность инъекции его зависимостей при создании объекта `CheckStatus`. Это сделает `CheckStatus` более независимым от реализации `Payments`, что может упростить юнит-тестирование.

    ```php
    class CheckStatus {
        protected $priceConverter;

        public function __construct(PriceConvert $priceConverter) {
            $this->priceConverter = $priceConverter;
        }

        public function check() {
            $price = $this->priceConverter->convert($somePrice);
            // Логика проверки статуса
        }
    }
    ```

3. **Комбинированный подход**: Вы можете использовать фасад для упрощения доступа к функциям, но при этом сохранять возможность внедрения зависимостей. Например, в случае, если вы хотите протестировать `CheckStatus`, вы можете заинжектировать мок-объект `PriceConvert`, а в реальном коде использовать фасад.

### Рекомендации

- **Используйте фасады для простоты и удобства**: Если фасад предоставляет необходимый функционал и упрощает код, следует использовать его.
- **Инъекция зависимостей**: Это хорошая практика для повышения гибкости и тестируемости вашего кода. Если `PriceConvert` специфичен для бизнес-логики, имеет смысл его инъекционировать.
- **Следите за чистотой кода**: Если вы чувствуете, что использование фасада делает код более читаемым и простым, выбирайте его. Главное, чтобы ваш код соответствовал принципам SOLID и был легко тестируемым.

Подводя итог, используйте тот способ, который лучше всего соответствует вашим требованиям по читаемости, удобству сопровождения и тестируемости.
Весь вопрос звучит как какой-то оверинжиниринг. 
0. Без диаграмм вообще поток мыслей сложно понять.
1. Фасад - это не способ легализовать божественный класс.
2. Циклические зависимости - это не всегда смертельно плохо, но всегда очень подозрительно.
3. Не нужно накидывать все паттерны, какие ты знаешь, если только что прочитал какую-то умную книжку или статью. Иногда лучше всё-таки сделать по принципу KISS и YAGNI.

Или мне нужно создать объект PriceConvert и вызвать нужный метод?

Зачем на каждую мелкую операцию делать отдельный класс и создавать постоянно новые объекты?

Просто с одной стороны фасад Payments лежит ниже чем эти классы - это просто точка доступа для контроллеров итд.

Фасад же типа по определению должен быть выше всех, как наиболее высокий уровень абстракции. С чего это вдруг он оказался ниже всех? И что у тебя подразумевается под контроллерами? Обычно контроллерами в вебе называют обработчики http-запросов. Тогда контроллеры должны зависеть от фасада, а не наоборот.

и у них внутренние связи налажены через parent
.
Что это вообще значит?

Payments::priceConvert

Почему вообще платежи отвечают за конвертацию курсов валют? Или что делает priceConvert?
Похожие вопросы