设计选择:将服务传递给对象或服务对象?

Dec*_*ler 2 language-agnostic oop design-patterns

这个问题可能会引起辩论和/或争论,所以如果它被关闭,我认为这个问题的答案将是:它取决于.但希望这个问题可以通过一个很好的理由来回答,而选择一个设计决策而不是另一个.

当我看到这个答案时,对于一个关于OOP的问题,我突然意识到我有时会问这个问题.

我们假设,项目的要求和技术允许您选择以下任一选项:

选项a:

$service = new SendService();
$recipient = new Recipient( 'John', 'Doe', 'john.doe@example.com' );
$message = new Message( $service );
$message->setContent( 'Lorem ipsum...' );
$message->send( $recipient );
Run Code Online (Sandbox Code Playgroud)

换句话说:让消息在内部与服务通信,并让它将接收者和自己传递给服务.

选项b:

$service = new SendService();
$recipient = new Recipient( 'John', 'Doe', 'john.doe@example.com' );
$message = new Message();
$message->setContent( 'Lorem ipsum...' );
$service->send( $message, $recipient );
Run Code Online (Sandbox Code Playgroud)

换句话说:让客户端代码将消息(和收件人)传递给服务.

是否有任何特定(设计)理由选择一个而不是另一个,或者这只是一个偏好问题?

在这种特殊情况下,我认为后一种选择更像是一个真实的例子,例如将邮政卡发送到邮局,而不是将邮局塞进邮政卡,如果你得到我的漂移.因此选择该选项更有意义.或者现实生活中的隐喻不能证明设计选择的合理性?

Pab*_*dez 5

在我看来,用例可以恢复为:

我有一个message,一个message service.我需要以message某种方式发送 ,使用message service

替代方案是:

A - message知道message service并且知道如何发送自己.

和:

B - message不知道的message service.的message service接收message和发送.

正如我所看到的,在第一种情况下,像这样的事情正在发生声纳或更晚(伪代码):

Message {

   send(MessageService) = {

    // Do lot's of stuff.
    MessageService.send(this)
   }
}
Run Code Online (Sandbox Code Playgroud)

那么,为什么不B首先选择选项呢?