2017-12-22 63 views
0

私はオープンとクローズド・プリンシプルに違反しているコントローラを持っています。私は特定の条件でこれを解決する方法を理解しようとしています。ここに実装があります。SOLIDに違反する違反を他の場所でロードすることなく、SOLIDに続くクラスをどのように設計できますか?

ここで問題となるのは、新しい録画設定がある場合は、設定コントローラーに戻って新しい録画設定を追加する必要があります。 BasicRecordingとAdvanceRecordingをNotSolidRecordingSettingsControllerに挿入すると、NotSolidRecordingSettingsControllerをインスタンス化するオブジェクトはBasicRecordingとAdvanceRecordingのインスタンス化を行う必要があります。しかし、その後、そのオブジェクトはOCPに違反します。誰かがオブジェクトを作成する必要があります。

Not OCPの一部を別のものにロードするだけで、これをOCPにする方法を教えてください。

この種の問題には特定のデザインパターンがありますか?

+0

クラスのパブリックメソッドを使用するクラスは、次のように見えますか? –

答えて

0

SOLIDの原則では、OCPは本当にSRPの結果であり、クラスは単一の責任を負うべきであり、そのコードは内部要件(その1つのジョブに関連する要件)が変更されたときにのみ変更する必要があります。

特に、クライアントが変更されるため、クラスを変更する必要はありません。それには多くのクライアントがいるかもしれませんし、新しいクライアントを得るたびにコードを混乱させたくない、あるいは既存のクライアントが何か違うことをする必要があります。したがって、OCP。 OCPでは、「変更のために閉じた」とは、それを使用するものを変更したときに、それを混乱させないことを意味します。 は、内部要件が変更されたときに変更します。それはちょうどメンテナンスです。

OCPはクラスがクライアントとどのように関係しているかについてですが、にはのクライアントがあるクラスがあります。彼らの仕事はサービスではなく、他のクラスやAPIの実装に使用されることはありません。これらのクラスは、自らの内部要件の変更以外は変更する必要がないため、OCPについて心配する必要はありません。

このようなクラスの大きな例は、「合成ルート」(googlable)と呼ばれることがあります。単一の責任は、システムがコンポーネントからどのように構築されるかを定義することです。これは、すべてのオブジェクトを作成し、必要な場所にそれらを挿入する人です。

設定ペインをコントローラに注入するコンポジションルートが必要です(switchToARというメソッドをもう使用できないため、コントローラを起動するコンポジションルートが必要です)。このクラスの仕事は、必要なオブジェクトを作成してシステムを定義することです。オブジェクトの配置を変更する必要がある場合、それは内部要件への変更であり、SOLIDに違反することなくコードを修正することができます。何

(またはあなたのすべてのものではなく、コンフィギュレーションから読み取ることができますが、それはだけではなく、あなたのプログラミング言語の設定で組成根を実施しています。時にはそれは良いアイデアです、そして時々ない)

関連する問題