問題タブ [encapsulation]

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.

0 投票する
4 に答える
183 参照

api - API で公開する低レベルのものはどれくらいですか?

ジェネリック ライブラリのパブリック API を設計する場合、内部で使用される低レベルのものをどれだけ公開する必要がありますか? 一方では、ユーザーは実装の詳細に過度に依存するべきではなく、低レベルの関数/クラスが多すぎると API が乱雑になる可能性があります。したがって、ひざまずく応答は「なし」である可能性があります。一方、低レベルの機能の一部は人々にとって役立つ可能性があり、それをさらに公開することで、抽象化の逆転 (高レベルの構成の上に低レベルの構成を再実装すること) を防ぐことができます。

さらに、より低レベルの詳細を公開すると、パフォーマンスのショートカットが提供される可能性があります。たとえば、配列の中央値を求める関数があるとします。最小驚きの原則では、配列を複製して、API のユーザーがその実装に要素の並べ替えの副作用が伴うことを気にする必要がないようにする必要があります。この場合、 median() はメモリ割り当てを必要とし、割り当てをバイパスする別の関数を提供するが、ユーザーの入力を任意に並べ替えることに注意する必要がありますか?

この種の詳細をどの程度公開するかについての一般的なガイドラインは何ですか?

0 投票する
6 に答える
537 参照

c++ - カプセル化されたオブジェクトのライフタイム管理

オブジェクトをカプセル化し、その有効期間を管理するための最良のアプローチは何ですか? 例: タイプBのオブジェクトを含み、それを単独で担当するクラスAがあります。

解決策 1 、 bオブジェクトのクローンを作成して、 Aのみがクリーンアップできるようにします。

解決策 2、渡されたオブジェクトを直接使用します。ここで二重解放の可能性があります。

私の実際のケースでは、ソリューション #2 が最適です。ただし、文書化されていても、誰かがAの動作を知らない可能性があるため、これは悪いコードと見なされるのではないかと思います。これらのシナリオを考えることができます:

または、

A の動作を適切に文書化すれば、これらの問題を無視できますか? 責任を宣言し、ドキュメントを読むのを他の人に任せるだけで十分ですか? これはコードベースでどのように管理されていますか?

0 投票する
3 に答える
7911 参照

java - Java クラス メンバーのアクセス レベル

これは非常に基本的な質問であることは承知していますが、常に私を悩ませてきた質問です。私が理解しているように、Javaでフィールドをプライベートに宣言すると、そのクラスの外では見えません。保護されている場合は、継承されたクラスと同じパッケージ内のすべてで使用できます (これらの定義のいずれかが正しくない場合は修正してください)。

これは、継承されたクラスのみがアクセスでき、同じパッケージ内の他の継承されていないクラスにはアクセスできないフィールドを宣言することはできないということですか?

これを回避する方法があることを感謝しますが、この種の動作をしたい場合はありますか?

明らかに、上記の質問はメソッドだけでなくフィールドにも当てはまります。

どうもありがとう。

0 投票する
1 に答える
767 参照

java - 保護/プライベート-なぜわざわざ?

DUPE:実際のプライベートメンバーとパブリックメンバー(カプセル化はどれほど重要ですか?)

Javaでプログラムを作成する過程で、将来のプロジェクトでの使用の可能性を確認できるいくつかのライブラリを抽象化しました。

これらの方法のいずれかに制限付きアクセス(プライベート/保護)を設定する必要があるのはなぜですか?

これは私の人生を将来もっと複雑にするようです。すべてにpublicを使用すれば、他のクラスから何かを呼び出すことができるかどうかを心配する必要はありません。私は自分のコードで、パブリック以外のものを使用することが理にかなっているケースをまだ見たことがありません。

すべてに「public」を使用するのはとても間違っていますか?私はジャワの神々に打たれるのでしょうか?

0 投票する
12 に答える
7163 参照

oop - 関数はカプセル化の例ですか?

機能を関数に入れることによって、それだけでカプセル化の例が構成されますか、それともオブジェクトを使用してカプセル化する必要がありますか?

カプセル化の概念を理解しようとしています。私が考えたのは、次のようなものから行く場合です:

n = n + 1

これは大量のコードの一部として実際に実行され、それを取得してこのような関数に入れ、その加算ロジックをメソッドにカプセル化しました。

それとも、addOne の詳細を外の世界から隠している場合は、カプセル化のみであるというケースが多いのでしょうか?それがオブジェクト メソッドであり、private/protected のアクセス修飾子を使用している場合のように?

0 投票する
8 に答える
686 参照

c++ - C++での仮想メソッド実装の防止

C++には次のクラス階層があります。

実装レベルのクラスがapplyの独自の実装を提供せず、derived_specialtyのみを実装することを保証したいと思います。Derivedから継承するクラスがapplyを実装しないことを保証する方法はありますか?そのため、Derived :: apply実装が使用されますか?私の理解では、C ++では、Baseクラスで仮想化されたメソッドは、継承階層のずっと下まで仮想化されていますが、C ++で達成するためのトリックがある場合は、それらについて聞きたいと思います。

私はいつもC++で許可されていることに驚いているので、尋ねる価値があると思いました。:)

0 投票する
3 に答える
5587 参照

c# - メソッド/プロパティを 1 つのクラスに表示し、他のクラスには非表示にする

ServerIRC のサーバー接続と通信するクラスがあります。既知の のリストを保持し、User必要に応じてそれらを作成します。

Userクラスに関連する2つの問題があります。

  1. のインスタンスは誰でも作成できますUserServerクラスでこれができるようにしたいだけです。
  2. ユーザー (User記述されているもの) が自分の名前 (または参加しているチャンネルなどのその他の情報) を変更した場合、Serverクラスはそれ自体を変更できます。ただし、他のクラスも可能です。他のクラスがこの情報に触れることを禁止したい (読み取り専用にする)。

この2つの問題を解決するにはどうすればよいですか?C++ では、friendキーワードを使用して ctorsetNameなどを非公開にすることで解決できます。

特定のメソッドが指定されたクラスからアクセスできるようにする C# キーワードはありますか? これで私の問題は解決します。

0 投票する
28 に答える
1142 参照

java - Javaでは、オブジェクトのメンバーを公開するのは悪い考えですか?

アプリケーションにデータ クラスがあります。私のアプリケーションがパブリック API として使用されることは決してなく、プロジェクト内でコードを開発するのは私だけです。

プロセッサとメモリの電力を可能な限り節約しようとしています。

ゲッターを使用する必要がないように、データ クラスのデータ メンバーを public/protected/default 保護にするのは悪い考えですか? ゲッターを使用すると、わずかに多くのメモリとスタックなどの作成が必要になります...これは必要ではないと思います。ゲッターを使用する唯一の理由は保護/プライバシーのためですが、私が唯一のコーダーであり、他の誰も私の API を使用しない場合、ゲッターを使用しないのは悪い考えですか?

これがばかげているかどうか教えてください。