問題タブ [information-hiding]
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.
oop - デリゲート パターンはカプセル化を破りますか?
デリゲートを取るクラスがあるとしましょう:
ご覧のとおり、デリゲートの doSomethingOnlyForThisPurpose() メソッドは、デリゲート クラスによって呼び出されるためにのみ存在します。ただし、このメソッドはパブリックであり、何からでも実行できる必要があります。アタッチされている委任クラス以外によって絶対に実行されるべきではない場合 (特に、委任クラスが依存関係で渡される場合)、これはカプセル化を破りませんか? これを回避するために私が考えた唯一の方法は、呼び出されたすべてのメソッドに渡される委譲クラス (内部クラス) によってのみインスタンス化できるオブジェクトを考案することです。ただし、これは非常に複雑で、とにかく完全ではありません。これを回避する方法はありますか、それとも病理学的ですか?
注: この合成アプローチに固執したいので、継承には頼りません。
java - 静的メソッドの可視性を下げる
私は、子が非静的メソッドの可視性を低下させることができないことを知っており、その理由を理解しています。
ただし、「静的メソッドは再宣言によって非表示にすることができる」と読みました。ただし、Javaでこれをどのように実現できるかわかりません。
これは本当に可能ですか?はいの場合、それを行う方法 (コード例) と、なぜそれが導入されたのか (インターフェイスの可視性を低下させないという原則に反しているようです)?
oop - 簡単にするために巨大なクラスは大丈夫ですか?
私は映画再生関連のアプリに取り組んでおり、現在いくつかの設計上の問題に直面しています。
ご想像のとおり、ファイル パス、ファイル サイズなどのプロパティを持つムービー クラスがあります。ムービー クラスは、ムービーの内部構造について何も認識せず、ムービー ファイルを直接デコードしません。
それを達成するために、別の大きなクラスがあります: デコーダーです。このクラスは、継続時間、フレーム レートなどのすべてのムービーの内部情報を認識します。また、ファイルからビデオまたはオーディオ データを取得するメソッドも提供します。デコーダはサードパーティのライブラリを使用し、多くの C ポインタを渡す必要があるため、デコーダを小さなチャンクに分割することはあまり意味がありません。メモリ管理などを簡単にするために、それは避けたいと思います。
ムービーは、デコーダー自体がムービー クラスの戦略パターンを使用して実装されているため、明確に定義されたインターフェイスを備えたデコーダーを保持します。
この設計は情報隠蔽と SRP の点で優れているかどうか疑問に思っています。外部のすべてのクラスは、ムービーに一連のプロパティを持つデコーダーがあることを認識しています。映画があることだけを知ってもらったほうがいいのではないか。しかし、ムービー クラスが巨大になり、デコーダのプロパティにのみアクセスするスタブ メソッドが多数存在することになります。
アドバイスをいただければ幸いです。
編集:
Facade パターン (@Erik の回答に触発されたもの) を詳しく調べたところ、ここで完全に一致しているように見えます。Movie クラスをさらに細分化することはできますが、「外の世界」は複雑さを避けるために詳細を知る必要はありません。ただし、これにより、多くのメソッドを持つ Facade クラスが生成されます。
したがって、外側から見ると巨大なクラスのように見えますが、内側を見ると論理的なレンガにうまく分離されています。それで大丈夫だと思いますか?
jquery - FullCalendar + Google カレンダーで説明のないイベントを非表示にする
FullCalendar 2.3.1 と Google カレンダー フィードを使用しています。
デフォルトでは表示されないイベントの特定の部分を表示/非表示にするように設定できることを知ってeventRender
います (イベントのイベントの説明を追加するなど)。event.description
コールバックを使用して「ない場合はイベントを表示しない」ように機能できるかどうか疑問に思っていました。
これは、表示時event.location
にevent.description
イベント ブロックに追加するために使用したコードです。agendaDay
event.description
そして、それはうまく機能するので、現在フィールドに何もないイベントを非表示にするために実行できるこの種の機能の変更はありますか?
すべてのヘルプは大歓迎です!!
encapsulation - 特定の場合に、オブジェクトはそのユーザーについて知る必要がありますか?
潜在的なゲームの基礎をレイアウトしていますが、カプセル化された効率的なクラスを設計するのに苦労しています。
一般に、モジュール性とカプセル化を維持するために、オブジェクトは相互にほとんど依存するべきではないと人々は言います。
ただし、あるオブジェクトがお互いを認識していることが便利な場合もあります。
Dogというクラスがあるとしましょう。
犬には飼い主がいるので、犬の飼い主クラスがあります。
Dog
では、 があり、その所有者がいない場合はどうなるでしょうか。getOwner()
のメソッドを作るのは理にかなっているようですDog
。
ただし、これはDog
に関する情報を提供DogOwner
するようになりました。これは、情報隠蔽に違反しているようです。、およびがあるDog
ため、冗長性も作成されているようです。 DogOwner
DogOwner
Dog
飼い主を見つけるもう 1 つの方法は、単純にすべての飼い主を調べて、対応する犬を見つけることです。Dog
これはとの依存関係を作成しませんがDogOwner
、すべての所有者を循環する必要があるため、必要以上にコストがかかるようです。
では、方法Dog
があってもgetOwner()
よろしいでしょうか。Dog
そうでない場合、所有者のみがわかっている場合に所有者に効率的にアクセスするために、他にどのような選択肢がありますか?