私のサンプルコードのどのバージョンが、オブジェクト指向の方が適切で正しいですか?サービスでクラスを渡すときとタイプヒントを使用するとき
1)
class ServiceA
{
private $serviceB;
public function __construct(ServiceB $serviceB)
{
$this->serviceB = $serviceB;
}
public function first() : int
{
return 1 + $this->serviceB->second();
}
}
class ServiceB
{
public function second() : int
{
return 2;
}
}
2)
class ServiceA
{
private $serviceB;
public function __construct($serviceB)
{
$this->serviceB = $serviceB;
}
public function first() : int
{
return 1 + $this->serviceB->second();
}
}
class ServiceB
{
public function second() : int
{
return 2;
}
}
クラスは汎用性と変更が容易でなければならない場合がタイプヒントであってはならないので、これは、タイプ・ヒンティングコンストラクタにすることなく、あります。
3)
class ServiceA
{
private $serviceB;
public function __construct()
{
$this->serviceB = new ServiceB();
}
public function first() : int
{
return 1 + $this->serviceB->second();
}
}
class ServiceB
{
public function second() : int
{
return 2;
}
}
私はいつも、このクラスでServiceBを使用したいので。しかし、それはデメテルの法律を破ることはありませんか?
4)
class ServiceA
{
private $serviceB;
public function first() : int
{
$this->serviceB = new ServiceB();
return 1 + $this->serviceB->second();
}
}
class ServiceB
{
public function second() : int
{
return 2;
}
}
これは私がそれをしたい場所私はそこServiceBを使用3.と同様です。
5)
class ServiceA
{
public function first() : int
{
$serviceB = new ServiceB();
return 1 + $serviceB->second();
}
}
class ServiceB
{
public function second() : int
{
return 2;
}
}
最も単純なバージョン。
すべての例では、ServiceAでは常にServiceBを使用する必要があることを意味します。 ServiceBをServiceCに変更したい場合は、ServiceAクラスの内容を変更する必要があります。この場合、例1を使用する必要がありますか?
私はこれらのクラスを1つの責任の原則を保つために分離しており、常に一緒に作業しなければなりません。さらに、ServiceBでは他の場所でも使用しています。
なし公開されていないメソッドの公開スコープ –
@LawrenceCherone彼はおそらくLaravelの[visual debt](https://laracasts.com/series/php-bits/episodes/1)フォロワーの1人です –
私は編集しました私の質問。 – veguv