問題タブ [open-closed-principle]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c# - オープン・クローズ原則の克服
ユーザーから提供されたマウスデータに基づいて幾何学的図形を描画する簡単なプログラムがあります。マウスの追跡を処理する 1 つのクラス (マウスの移動履歴を含むリストを取得します) と、Shape という抽象クラスが 1 つあります。このクラスから、Circle、Rectangle などの追加の Shape をいくつか派生させます。それらのすべてが抽象 Draw() 関数をオーバーライドします。
それはすべてうまく機能しますが、ユーザーが目的の形状を手動で切り替えられるようにしたい場合に問題が発生します。私はマウスデータを取得し、どのような形状を描くべきかを知っています. 問題は、どのオブジェクトを作成し、適切なパラメーターをコンストラクターに渡す必要があるかをコードに認識させる方法です。また、この時点で新しい Shape 派生物を追加することもできません。これは明らかに間違っています。
私は明らかに次のようなコードを出したくありません:
上記のコードは、オープンクローズ原則に明らかに違反しています。問題は、それを乗り越える方法がよくわからないことです。主な問題は、さまざまな Shape にさまざまなパラメーターを持つコンストラクターがあり、これがさらに面倒なことです。
これはよくある問題だと確信していますが、それを乗り越える方法がわかりません。アイデアはありますか?
java - Google Guavas Predicates を使用してフィルター メソッドをクラスから切り離すのは良い設計ですか
今日、Google Guavas Predicates を使用して設計の拡張性を高める方法について、ブログに次の記事を書きました。これにより、次の質問を自問するようになりました:「このソリューションの必要性は、より深い設計上の欠陥によって引き起こされたものですか?」. このタイプの拡張性を実現する別の「よりクリーンな」方法はありますか? 私はこれについて深く考えすぎていますか?
java - 訪問者パターンとオープン/クローズの原則: 新しい訪問可能なオブジェクトを追加する方法は?
私は訪問者パターンを研究していますが、このパターンがオープン/クローズの原則とどのように関連しているのか疑問に思っています。いくつかのウェブサイトで、「オープン/クローズの原則に従うのは 1 つの方法です。」 (ウィキペディアから引用)を読みました。
別のWebサイトで、「既存のコードを変更せずに既存の機能を拡張する」ために、プログラムに新しい訪問者を簡単に追加できるように、オープン/クローズの原則に従っていることを知りました。その同じ Web サイトでは、このビジター パターンには大きな欠点があると述べています。
さて、このソリューションはちょっとしたハック ソリューションではありませんか? つまり、他のブログでもこの解決策を見つけましたが、コードは回避策のように見えます!
ビジター パターンの既存の実装に新しいビジタブルを追加するというこの問題に対する別の解決策はありますか?
design-patterns - OCP なしの戦略パターンをまだ持っていますか?
今日はデザインパターンの試験でした。答えがわからない質問が1つあり、とても興味があります。
正しいか間違っているか
私は教授に「鍵」とは何を意味するのかを尋ね、明確にしました。
アイデアはありますか?
java - メソッドのオーバーライド: 同じ引数リストの型 (または COMPATIBLE 型)?
新しい Oracle Certified Professional - Java SE7 Programmer 試験の準備に使用する本で、メソッドのオーバーライドを扱うセクションで、次のことに遭遇しました。
オーバーライドするメソッドは、基本バージョンと同じ引数リストの型(または互換性のある型) を持つ必要があります。
「互換性のあるタイプ」とはどういう意味ですか? つまり、引数リストの型が異なるとすぐに、オーバーライドではなくオーバーロードします。
varargs 引数を取るメソッドを、同じ型の配列を取るメソッドでオーバーライドすることしか考えられません。コンパイラは警告を出しますが、それでもコンパイルします。
互換性のある型とはどういう意味ですか? 本の間違いですか?
java - 列挙型の静的およびインスタンスの初期化ブロックがクラスのブロックと異なる動作をするのはなぜですか
Java認定試験の勉強で、静的初期化ブロックはソースコード内の出現順に、クラスがロードされたときに1回実行されること、インスタンス初期化ブロックはインスタンスが作成されるたびに実行されること、コンストラクタ内のコードは毎回実行されることを学びましたその後、インスタンスが作成されます。いくつかの静的およびインスタンスの初期化ブロックを持つクラスと、印刷用のものを持つコンストラクターを作成したことをテストします。すべてが期待どおりに機能しました-「ロード」は実行時だけを意味すると思っていましたが、クラスのインスタンスを少なくとも1つ作成しない限り、出力がまったく得られないため、最初のインスタンスが作成されたときに発生すると思います。次に、列挙型で同じことを試みましたが、順序はすべてオフでした。まず、列挙型がコードで最初に参照されるときに、列挙型が持つ各値に対して初期化ブロックが 1 回実行されます。第 2 に、インスタンスの初期化ブロックであると想定した後に静的実行とマークされた初期化ブロックです。これは私の予想とは逆です。これが私の質問の内訳です。
- static run とマークされた init ブロックが列挙型の最後にあるのはなぜですか?
- 列挙型はインスタンスの初期化ブロックを持つことができますか?
- インスタンスの初期化ブロックだと思っていたブロックが、新しい enum 値が参照されるたびにではなく、enum がロードされたときに 1 回だけ実行されるのはなぜですか?
- クラスの静的初期化ブロックは、クラスが「ロード」されるときに実行されます。ロードされた とはどういう意味ですか? オブジェクトがクラスでインスタンス化されるときに一度だけ発生しますか?
ありがとう!これは私を非常に混乱させます。
java - カプセル化が開閉原理に反しているように見えるのはなぜですか?
カプセル化では、OCP を実現するプライベートを宣言することで、クラスがその変数で行っていることを隠すという考え方です。しかし、なぜ getter と setter を追加して変数を変更できるようにするのでしょうか?
わざわざ変数をプライベートに設定してから、それらにパブリック セッターを追加するのはなぜでしょうか。これはカプセル化の考え方の 1 つであり、それほど制限的ではないようです。