AShape
は、それがどのように描かれたかについて何も知らないはずです。設計するプロジェクトが大きくなるほど、この決定はより重要になります。
私にとって、それはすべて循環依存関係に帰着します。
Model View Controllerの基本的な原則は、ユーザーが行うこと(動詞、または「ビュー」) が、操作または分析されるもの(名詞、または「コントローラー」)から明確に分離されているということです。 プレゼンテーションとロジックの分離. 「モデル」は中間者です。
それは単一責任の原則でもあります。「...すべてのクラスは単一の責任を持つべきであり、その責任はクラスによって完全にカプセル化されるべきです」
その背後にある理由は次のとおりです。循環依存とは、何かへの変更がすべてに影響することを意味します。
単一責任の原則からの別の (簡潔にするために編集された) 引用: 、したがって、別々のクラスまたはモジュールにする必要があります。異なる時期に異なる理由で変更される2つのものを結合するのは悪い設計です。」(私のものを強調)
最後に、関心の分離の概念: 「目標は、機能を他の機能とは独立して最適化できるようにシステムを設計することであり、1 つの機能の障害が他の機能の障害を引き起こさないようにし、一般的に理解しやすくすることです。 、複雑な相互依存システムを設計および管理します。」(私のものを強調)
これはプログラミング設計の問題だけではありません。
Web サイトの開発を考えてみてください。「コンテンツ」チームは、スクリプト (「開発」チームによって作成されたもの) の周りに非常に穏やかに言葉や書式設定、色、写真を配置する必要があります。そうしないと、すべてが壊れてしまいます。コンテンツ チームは、スクリプトがまったくないことを望んでいます。言葉を変更したり、画像を微調整したりするためだけに、プログラミングの方法を学ぶ必要はありません。また、開発チームは、コーディングの仕方を知らない人が行ったマイナーな視覚的変更のすべてが、自分たちのものを壊す可能性があることを心配する必要はありません.
自分のプロジェクトに取り組むとき、私は毎日このコンセプトについて考えています。2 つのソース ファイルを相互にインポートする場合、いずれかを変更すると、両方を同時に再コンパイルする必要があります。大規模なプロジェクトでは、些細な変更で数百または数千のクラスの再コンパイルが必要になる可能性があります。私が現在関わっている 3 つの主要なプロジェクトには、約 1000 の異なるソース コード ファイルがあり、この種の循環依存関係は1 つだけです。
ビジネスのチームでも、ソース コード ファイルでも、プログラミング オブジェクトの設計でも、絶対に必要でない限り、循環依存関係は避けることをお勧めします。
したがって、少なくとも、私は draw 関数を に入れませんShape
。設計されているプロジェクトのタイプとサイズに大きく依存しますが、レンダリングはRenderingUtils
、作業の大部分を行う public static 関数だけを含むクラスによって行うことができます。
プロジェクトが適度に大きいものであれば、さらに進んでRenderable
、モデル レイヤーとしてインターフェイスを作成します。Aは をShape
実装Renderable
するため、それがどのように描画されるかを認識したり気にしたりしません。そして、図面がShape
.
これにより、 に影響を与える (または再コンパイルする必要がない!) ことなく、レンダリングの実行方法を完全に変更できる柔軟性が得られます。また、描画コードを変更することなく、 とはShape
大きく異なるものをレンダリングすることもできます。Shape