たとえば、広く共有されているクラスと呼ばれるアプリケーションがあるとしUser
ます。このクラスは、ユーザー、ID、名前、各モジュールへのアクセスレベル、タイムゾーンなどに関するすべての情報を公開します。
ユーザーデータは明らかにシステム全体で広く参照されていますが、何らかの理由で、このユーザーオブジェクトをそれに依存するクラスに渡すのではなく、個々のプロパティを単に渡すようにシステムが設定されています。
ユーザーIDを必要とするクラスは、userId
パラメーターとしてGUID を必要としますが、ユーザー名も必要な場合があります。そのため、別のパラメーターとして渡されます。場合によっては、これは個々のメソッドに渡されるため、値はクラスレベルでまったく保持されません。
Userクラスから別の情報にアクセスする必要があるたびに、パラメーターを追加して変更する必要があり、新しいオーバーロードの追加が適切でない場合は、メソッドまたはクラスコンストラクターへのすべての参照も変更する必要があります。
ユーザーはほんの一例です。これは、コードで広く実践されています。
これはオープン/クローズの原則に違反していると思うのは正しいですか?既存のクラスを変更するだけでなく、そもそもクラスを設定して、将来的に広範囲の変更が必要になる可能性が非常に高くなりますか?
User
オブジェクトを渡したばかりの場合は、作業しているクラスに少し変更を加えることができます。パラメータを追加する必要がある場合は、クラスへの参照に数十の変更を加える必要があります。
この慣行によって他の原則が破られていますか?おそらく依存関係の逆転?抽象化を参照しているわけではありませんが、ユーザーは1種類しかないため、ユーザーインターフェイスを持つ必要はありません。
基本的な防衛プログラミングの原則など、違反している他の非ソリッドの原則はありますか?
私のコンストラクタは次のようになります:
MyConstructor(GUID userid, String username)
またはこれ:
MyConstructor(User theUser)
投稿編集:
「パスIDまたはオブジェクト?」で質問に回答することが提案されています。これは、どちらの方向に進むかの決定が、この質問の中心にあるSOLID原則に従う試みにどのように影響するかという質問には答えません。
I
でSOLID
?MyConstructor
基本的には「私は必要今言うGuid
とstring
」。なぜ提供するインタフェースがないGuid
とstring
、聞かせてUser
そのインターフェイスを実装してみましょうMyConstructor
そのインタフェースを実装するインスタンスに依存しますか?MyConstructor
変更の必要がある場合は、インターフェースを変更します。- プロバイダーではなく、消費者に「属する」インターフェースを考えるのに大いに役立ちました。ですから、「消費者として、私はこれを行うことができるプロバイダーとして」ではなく、「これを行う何かが必要です」と考えてください。