Вводить объект-переводчик, чтобы перевести мое сообщение или перевести его извне? Какой правильный путь ОО?

0

У меня есть общий вопрос относительно правильного кода OO. У меня есть два класса: MyClass и MyMessage, и я хочу перевести сообщение MyMessage :: message.

Теперь у меня есть два варианта выбора:

В первом примере объект трансляции вводится, и сообщение несет ответственность за перевод моего сообщения.

  • Один из возможных я могу представить, что MyMessage и возможные подклассы могут возвращать отформатированную строку, которую они хотят!
  • Один из противоречий состоит в том, что оба класса должны иметь дело с зависимостью, такой как Translator

Во втором примере MyMessage - это просто тупой объект, который содержит данные, и клиент несет ответственность за его перевод.

  • Pro: Зависимость Translator используется только в MyClass.
  • Contra: MyMessage не может перевести нужную строку.

Мой вопрос: какой из них лучше?

class MyMessage
{    
    private $message; 
    private $args;

    public function getMessage(TranslatorInterface $translator)
    {
        return $translator->trans($this->message, $this->args);
    }
}

class MyClass
{
    public function execute()
    {
        $myMessage = new MyMessage();
        ...
        $translatedMessage = $myMessage->getMessage($translator);
    }

}

..или это:

class MyMessage
{    
    private $message; 
    private $args;

    public function getMessage()
    {
        return $this->message;
    }

    public function getArguments()
    {
        return $this->args;
    }

}

class MyClient
{
    public function execute()
    {
        $myMessage = new MyMessage();
        ...
        $translatedMessage = $translator->trans(
             $myMessage->getMessage($translator), 
             $myMessage->getArgs($translator)
        );
    }

}
  • 1
    ИМХО, более правильным ООП-подходом будет создание третьего класса, который принимает объекты, реализующие интерфейс, обеспечивая присутствие метода getMessage и обеспечивающий этот класс для вывода (перевод, представление). В терминах MVC Сообщение - это модель данных, Клиент - это контроллер / класс обслуживания, что означает, что транслятор является компонентом представления. Все три имеют разные обязанности, следовательно, все три должны быть отдельными классами, которые существуют независимо
Теги:
oop

1 ответ

1

Я бы выбрал первый подход, в который вводится объект перевода/переводчика. Это позволит вам отделить логику поиска сообщений от логики перевода. Если в какой-то момент вы хотите использовать другой механизм хранения сообщений - переместитесь между XML, SQL или любым другим - или измените логику перевода (TMX/SQL/whatever), вы можете изменить ее, не затрагивая другую. Кроме того, вы можете вводить макет транслятора для целей модульного тестирования.

Инъекционная инъекция не является проблемой, и это избавит вас от многих головных болей.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню