単一の真実の出所と単一の責任の原則の違いは?


9

そのため、プログラミングコードインタビューに関するビデオシリーズを見て、単一の真の情報源という用語を見つけました。

私が理解したことから、それは真実の単一のソースが複数回使用される可能性のあるあらゆるタイプの操作/ロジックのカプセル化であることを意味しました。

SRPは、何度も使用される可能性のある特定の操作やロジックをカプセル化するという意味でほぼ同じものです。

ここで私が見逃している非常に微妙なものはありますか?

いつもありがとうございました。

回答:


12

これらは2つの異なる原則です。彼らが共通して持っているものはほとんど「単一」という言葉だけです。

Single Source of Truthは、データベース正規化するプロセスの最終結果です エンティティ情報のすべての部分は、一度だけ保存されます。

Single of Source of Truthは、顧客を1つの表に、製品を別の表に入れる理由を説明しています。CustomerProductsテーブルを使用して顧客を製品に関連付けることにより、顧客または製品の2つの異なる場所への格納を回避し、代わりに各顧客および製品を指すポインターをCustomerProductsテーブルに配置します。これにより、製品名や価格などの情報を複製することなく、複数の顧客を1つの製品に関連付けたり、複数の製品を1つの顧客に関連付けたりすることもできます。

単一のソースの真実(各データは1か所にのみ保存されます)を持つということは、そのデータを変更すると、システム全体が同じ瞬間に同じ変更を認識することを意味します。それが格納されているすべての場所でデータを変更する必要がある真実の複数のソースとは対照的です。システムの異なる部分では、少なくとも一時的に、同じデータムに対して2つの異なる値が表示される場合があります。

単一責任原則(SRP)とは、クラスには1つの責任または変更する1つの理由のみが必要であることを意味します。Fowlerが提供する例は、モデムクラスの例です。

interface Modem
{
    public void dial(String phoneNumber);
    public void hangup();
    public void send(char c);
    public char recv();
}

このクラスは、接続の確立とデータの送信という2つの大きな責任があるため、SRPに違反しています。 この問題を修正するには、インターフェースを2つの異なるインターフェース(接続インターフェースと通信インターフェース)に分割します。最初のインターフェイスには、dialメソッドとhangupメソッドが含まれ、2番目のインターフェイスには、sendメソッドとreceiveメソッドが含まれます。

SRPは法律ではなく、単なる原則です。SRPは、便宜上またはその他の理由で違反する場合があります。データベースの正規化についても同様です。パフォーマンスやその他の理由により、データが非正規化された形式(一部の重複を含む)で保持される場合があります。

Persistence IgnoranceはSRPの別の形式です。クラスは、それ自体をデータストアに保存する方法を知らないはずです。 それはその責任ではありません。それは他のクラスの責任です。そうでない場合、データストアを他のタイプのデータストアに変更する場合は、データストアを使用するすべてのクラスを変更する必要があります。


7

うーん、違う?あなたはかなり重要な違いを見逃しているようです!

単一責任の原則は何もカプセル化しません。ビヘイビア/コード/ロジックの重複は排除されません。クラスが行うべきことは1つだけです。同じことを行う2つのクラスを保持できます。原則はそれで全く問題ありません。

唯一の真実の情報源は何もカプセル化していません。これは、設計を明確にするのに役立つガイドラインです。多くの場合、同じデータの2つ以上のバージョンがあります。1つはデータベース、1つはキャッシュ、1つはメモリ、1つはクライアントサイド、もう1つはPCのどこかにあるsqlliteにあります...真実の単一のソースは、指定したものです。あなたが言うことをあなたのソースが一致しないとき、1が勝ちというものです。そのバージョンは真実です。

つまり、これらは明らかに無関係です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.