単一責任の原則と高/低凝集度の原則を理解していると思いますが、次の質問はまだ私にいくつかの混乱を引き起こしています
1)プロパティが任意に/ランダムにクラスに配置されると仮定Planet
します(つまり、必要なコードがないか、これら2つのプロパティによって返される2つのオブジェクトを操作します)-言い換えると、プロパティはCarクラスに属していませんBird
Car
Car
Planet
Bird
a)
SRPは、オブジェクトを変更する理由は1つだけであると述べています。
public class Car
{
public void StartEngine()
{ ... }
private Planet Planet
{
get { ... }
}
private Bird Bird
{
get { ... }
}
}
クラスはCar
SRPに違反していますか?変更Planet
やインスタンスがクラスBird
に伝播しないため、SRPが破損しないと思いますか?Car
b)
凝集度とは、クラス内でメソッドとクラスレベルの変数がどれだけ密接に関連しているかを指します。非常にまとまりのあるクラスでは、すべてのメソッドとクラスレベルの変数を一緒に使用して、特定のタスクを実行します。凝集度の低いクラスでは、関数がランダムにクラスに挿入され、さまざまな異なるタスクを実行するために使用されます
クラスにこれらの2つのランダムなプロパティが含まれていてもCar
、1つの特定のタスク(またはいくつかの密接に関連するタスク)を実行するとします。
それでも特定のタスク(またはいくつかの密接に関連するタスク)を実行しているにもかかわらず、それは凝集Car
度が 低いと言えますか?
2)とプロパティは、特定のタスクを実行するためにインスタンスのメソッドによって使用され、概念的には2つのプロパティが属していない場合でも、高い凝集度を持つPlanet
と想定します(したがって、代わりにインスタンスが次のように渡された方がよいでしょう)それらを操作するaのメソッドへの引数)Bird
Car
Car
Car
Planet
Bird
Car
ありがとうございました
HELTONBIKER:
1)
鳥と惑星を車の中にカプセル化したので(プライベートの場合はさらに悪いですが)、車のクラスには3つの変更理由があります。
Car
最初の質問ではCar's
メソッドが2つのプロパティでさえ機能せず、したがってパブリックAPIへの変更がクラスに影響を与えないPlanet's
ため、 3つの理由がどのように変更されるのかわかりません。Bird's
Car
2)
The problem here has two components:
1. Bird and Planet are contained (as opposed to aggregated) in Car class;
2. Bird and Planet are not conceptually related to Car, much less by some containment relationship.
a)これは紛らわしいです:インスタンスが含まれているか集約されている かどうかに関係なく、インスタンスCar
の変更のために変更する必要がある可能性は(少なくとも私の最初の質問では)まったく同じではありませんか?Planet
Bird
Planet
Bird
b)2番目の質問では、単一の特定のタスクCar
を実行するために2つのプロパティを操作する方法があります。したがって、概念的には少なくともある程度関連しているのではないでしょうか。2番目の質問クラスでも、単一のタスクのみを実行している(そして、タスクを実行するために2つのプロパティを使用している) にもかかわらず、凝集度が低いと思いますか?