問題タブ [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.
c++ - クラスとメソッドを宣言しているがメンバーは宣言していないC++ヘッダーファイル?
クラスとそのパブリックメソッドを宣言するが、そのクラスのプライベートメンバーを定義しないC ++ヘッダーファイル(.h)を作成することは可能ですか?ヘッダーファイルでクラスとそのすべてのメンバーを宣言してから、cppファイルでメソッドを個別に定義する必要があるというページがいくつか見つかりました。Win32 DLLで定義されたクラスが必要であり、適切にカプセル化されている必要があるため、質問します。そのクラスの内部実装は、そのメンバーを含めて変更される可能性がありますが、これらの変更は、クラスを使用するコードには影響しません。 。
これがあれば、コンパイラがオブジェクトのサイズを事前に知ることができなくなると思います。ただし、コンパイラがコンストラクタを使用し、オブジェクトが格納されているメモリ内の場所へのポインタを渡すだけで、「sizeof(MyClass)」を実行させない限り、それで問題ありません。
更新: 回答してくれたすべての人に感謝します!単純なイディオムは、私が話していたことを達成するための良い方法のようです。私は似たようなことをするつもりです:
私のWin32DLLファイルには、次のような個別の関数がたくさんあります。
これは、MicrosoftがDLLファイルを書き込む一般的な方法であるため、おそらくそれには十分な理由があると思います。
しかし、C ++がクラスに対して持つ優れた構文を利用したいので、これらすべての関数をラップするラッパークラスを作成します。メンバーは1つで、「void*pimpl」になります。このラッパークラスは非常に単純なので、宣言してヘッダーファイルで定義するだけでもかまいません。しかし、このラッパークラスには、私が知る限り、C++コードをきれいに見せること以外の目的はありません。
java - 同じクラスの他のインスタンスでさえデータにアクセスできないように、オブジェクトはデータをカプセル化しますか?
ジャワでは、
同じクラスの他のインスタンスでさえデータにアクセスできないように、オブジェクトはデータをカプセル化しますか? 「プライベート」というキーワードが使用されている場合のみ?Javaの「アクセサメソッド」とは何ですか? getName()のようなメソッド?
ありがとう
java - Javaセキュアコーディングが重要なのはなぜですか?
Javaの安全なコーディングが重要である理由を理解するのに苦労しています。たとえば、変数をプライベートとして宣言することが重要なのはなぜですか?つまり、クラスの外部からこれらの変数にアクセスできなくなるということですが、クラスを逆コンパイルして値を取得するだけで済みます。同様に、クラスをfinalとして定義すると、このクラスをサブクラス化できなくなります。クラスのサブクラス化がセキュリティにとって危険なのはいつですか?必要に応じて、元のクラスを逆コンパイルし、必要な悪意のあるコードで再実装することもできます。アプリケーションがユーザーによって「信頼」されている場合に問題が発生しますか?そして、人々はこの信頼をどうにかして悪用する可能性がありますか?基本的に私が探しているのは、安全なコーディングガイドラインに従う必要がある理由についての良い例です。
c++ - プライベート、パブリック、保護された継承の違い
C++
public
の、private
、およびprotected
継承の違いは何ですか?
SOで見つけたすべての質問は、特定のケースを扱っています。
model-view-controller - テトリスときれいなグラフィック
Tetris ゲームを作成しているとします。適切なプログラマーであれば、一方にビュー ロジックがあり、もう一方にビジネス ロジックがあります。おそらく本格的なMVCが進行中です。
モデルがその を送信するupdate()
と、期待どおりにビュー自体が再描画されます。
しかし...たとえば、ラインを消すアニメーションを追加したい場合、それをビューにどのように実装しますか?
「すべてが適切にカプセル化されている」ことを除いて、必要な仮定を立ててください。
coding-style - 具象または抽象データ型を返しますか?
私は Code Complete を読んでいる最中で、本の終わりに向かって、リファクタリングに関する章で、著者は、リファクタリング中にコードの品質を向上させるためにすべきことをリストしています。
彼のポイントの 1 つは、特にコレクションやイテレータなどを返す場合は、常に可能な限り特定の型のデータを返すことでした。したがって、私が理解しているように、たとえば を返す代わりに、そのデータ型を使用する場合Collection<String>
は を返す必要があります。HashSet<String>
メソッドの内部。
彼は人々に情報隠蔽のルールを破るように勧めているように聞こえるので、これは私を混乱させます。さて、アクセサーについて話すとき、私はこれを理解しています。それは明確なケースです。しかし、データを計算してマングリングし、メソッドの抽象化のレベルが直接的なデータ構造を意味しない場合、データがバラバラにならない限り、可能な限り抽象的なデータ型Object
を返すのが最善だと思います (私はそうしません)。の代わりに戻りIterable<String>
ます。たとえば)。
だから、私の質問は: Code Complete のアドバイスの背後にあるより深い哲学はありますか?
database - データベースアクセスをカプセル化する方法は?
私は .NET でトランザクション アプリケーションを開発しており、次のようにデータベース アクセスを適切にカプセル化する方法について意見を求めたいと考えています。
- あちこちに接続文字列がありません
- 異なる関数から同じストアド プロシージャを複数回呼び出す
- またはさらに悪いことに、1 つの列が異なる複数のストアド プロシージャ
NHibernate のような ORM を使用すると、急速に変化するデータ モデルにさらに複雑なレイヤーが追加される可能性があり、アーティファクトをタイトなスケジュールで作成する必要があるため、有用かどうかを知りたいと思っています。
ORM パッケージ以外のメソッドやパターンに興味があります。
java - ロギングフレームワークを追加のレイヤーでラップする価値はありますか?
私は現在、中規模から大規模のJavaコードベースでロギングメカニズムをアップグレードすることを検討しています。メッセージは現在、Debug
クラスの静的メソッドを使用してログに記録されます。これからSLF4Jやcommons-loggingなどに切り替えることをお勧めします。
アプリケーションアーキテクトは、SLF4Jへの依存関係をカプセル化することを好みます(おそらく、前述のDebug
クラスにラップすることによって)。これにより、将来、ロギングの実装を簡単に変更できるようになります。
SLF4Jはすでに具体的なロギングの実装を抽象化しているため、これは私にはやり過ぎのように思えます。
SLF4Jのようなサードパーティのロギング抽象化を別の自家製の抽象化でラップする価値はありますか?
php - PHPの簡単な例でカプセル化とは何ですか?
PHPの簡単な例でカプセル化とは何ですか?