У меня есть общий вопрос относительно правильного кода OO. У меня есть два класса: MyClass и MyMessage, и я хочу перевести сообщение MyMessage :: message.
Теперь у меня есть два варианта выбора:
В первом примере объект трансляции вводится, и сообщение несет ответственность за перевод моего сообщения.
Во втором примере 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)
);
}
}
Я бы выбрал первый подход, в который вводится объект перевода/переводчика. Это позволит вам отделить логику поиска сообщений от логики перевода. Если в какой-то момент вы хотите использовать другой механизм хранения сообщений - переместитесь между XML, SQL или любым другим - или измените логику перевода (TMX/SQL/whatever), вы можете изменить ее, не затрагивая другую. Кроме того, вы можете вводить макет транслятора для целей модульного тестирования.
Инъекционная инъекция не является проблемой, и это избавит вас от многих головных болей.
getMessage
и обеспечивающий этот класс для вывода (перевод, представление). В терминах MVC Сообщение - это модель данных, Клиент - это контроллер / класс обслуживания, что означает, что транслятор является компонентом представления. Все три имеют разные обязанности, следовательно, все три должны быть отдельными классами, которые существуют независимо