問題タブ [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.
encapsulation - 抽象化 VS 情報隠蔽 VS カプセル化
ソフトウェア開発における抽象化と情報隠蔽の違いは何ですか?
私は混乱しています。抽象化は、詳細な実装を隠し、情報を隠して、何かの詳細全体を抽象化します。
更新:これら 3 つの概念に対する適切な答えを見つけました。そこから取られたいくつかの引用については、以下の別の回答を参照してください。
c++ - なぜ「PIMPL」イディオムを使用する必要があるのですか?
バックグラウンダー:
PIMPLイディオム(Pointer to IMPLementation) は、パブリック クラスがその一部であるライブラリの外では見ることができない構造またはクラスをパブリック クラスがラップする実装隠蔽の手法です。
これにより、内部実装の詳細とデータがライブラリのユーザーから隠されます。
このイディオムを実装するとき、パブリック クラス メソッドの実装はライブラリにコンパイルされ、ユーザーはヘッダー ファイルしか持っていないため、パブリック クラスではなく pimpl クラスにパブリック メソッドを配置するのはなぜですか?
説明のために、このコードはPurr()
実装を impl クラスに置き、それもラップします。
パブリック クラスに Purr を直接実装してみませんか?
python - Python の「プライベート」メソッドが実際にはプライベートではないのはなぜですか?
Python では、次のように名前の前に 2 つのアンダースコアを追加することで、クラス内に「プライベート」メソッドと変数を作成できます__myPrivateMethod()
。では、これをどのように説明できますか
どうしたんだ?!
よく分からないという方のために少し説明します。
パブリック メソッドとプライベート メソッドを持つクラスを作成し、インスタンス化します。
次に、パブリック メソッドを呼び出します。
次に、そのプライベート メソッドを呼び出してみます。
ここではすべてが良さそうです。私たちはそれを呼び出すことができません。実は「プライベート」です。ええと、実際にはそうではありません。オブジェクトでdir()を実行すると、すべての「プライベート」メソッドに対して Python が魔法のように作成する新しい魔法のメソッドが明らかになります。
この新しいメソッドの名前は、常にアンダースコア、その後にクラス名、その後にメソッド名が続きます。
カプセル化はここまでですよね?
いずれにせよ、私はいつも Python がカプセル化をサポートしていないと聞いていました。何を与える?
information-hiding - 入れ子関数とは何ですか?それらは何のため?
私はネストされた関数を使用したことはありませんが、いくつかの言語でそれらへの参照を見たことがあります(また、ネストされたクラスは関連していると思います)。
- 入れ子関数とは何ですか?
- なぜ?!?
- 他の方法ではできない入れ子関数で何ができるでしょうか?
- 入れ子関数を使用すると、これは困難またはエレガントではありません。入れ子関数なしでは何ができますか?
ネストされた関数は、すべてをオブジェクトとして扱うことのアーティファクトであると思います。オブジェクトに他のオブジェクトを含めることができる場合は、それに従います。
関数内の変数がスコープを持っているのと同じように、ネストされた関数はスコープを持っていますか(一般的に、言語はこれで異なると思います)?
答えが言語に依存しないかどうかわからない場合は、参照している言語を追加してください。
-アダム
language-agnostic - 情報隠蔽による効果的なカプセル化の素晴らしい例は?
「抽象化とカプセル化は補完的な概念です。抽象化は、オブジェクトの観察可能な動作に焦点を当てています...カプセル化は、この動作を引き起こす実装に焦点を当てています...カプセル化は、ほとんどの場合、すべてを隠すプロセスである情報隠蔽によって達成されます本質的な特性に寄与しないオブジェクトの秘密の。」-オブジェクト指向の分析と設計におけるGrady Booch
情報を隠すことによるカプセル化の利点について、説得力のある例をいくつか教えていただけますか?
security - サーバーからクライアントへの状態更新の難読化または隠蔽
私は実際にこのソフトウェアを自分で書いているわけではありませんが、問題を解決する方法がわからないことに気づきました。この問題を説明する最善の方法として、架空のマルチプレイヤー ファーストパーソン シューティング ゲームの特定のシナリオについて説明します...
- プレイヤーAは西向きの茂みに隠れている
- プレイヤー B が東からプレイヤー A に忍び寄る、またはプレイヤー A の後ろに忍び寄る
このゲーム用に書かれた人気のある「ハック」は、プレーヤー A がプレーヤー B の位置を示すレーダーを持つようにするもので、画面にプレーヤー B が表示されず、ゲームはレーダーをサポートしていません。このハッキングが可能になるのは、サーバーが特定の範囲内 (おそらくプレーヤー A のクリッピング プレーン内) 内のすべてのプレーヤーのプレーヤー A のクライアントに情報を送信しているためです。サーバーがプレーヤーAのビューフレーム内のプレーヤーのプレーヤーAのクライアントにのみ情報を送信しようとするのは現実的ではありません(私が知る限り)。サーバーは近くにいるすべてのプレイヤーに関する情報をプレイヤー A のクライアントに送信する必要があるため、プレイヤー A は自分の画面にレーダーをオーバーレイするハックを作成できます。このレーダーは、クライアントに送信されたデータを監視し、敵プレイヤーの状態の更新を引き出すことによって生成されます。これらは一般的に「レーダー」または「」として知られていると思います。
クライアントに送信される情報で、敵プレイヤーの状態の更新を難読化または非表示にする方法はありますか? 私が理解していることから、暗号化はリアルタイム ソリューションには適していないのでしょうか? サーバーがプレイヤー A のビュー フレーム内のプレイヤーの状態更新のみを送信できたとしても、プレイヤー A のハックは、カモフラージュまたはカバー オブジェクト (マイナーな方法でおそらく透明である) の後ろに隠れているプレイヤーを表示することができます。
私が本当に考えることができる唯一のことは、ある種の「パンクバスター」ソリューションを実装することです. つまり、プレイヤー A のクライアントに不正なプロセスを定期的にスキャンさせます。人気のあるハッキングが監視されるという考えです。人気のないハッキングは、十分に小さいプレイヤーベースに影響を与えるため、小さすぎて追跡できません.
language-agnostic - *interface* または *object* をパラメーターとして関数に渡す方が良いですか?
関数は、オブジェクト自体ではなく、インターフェイスをパラメーターとして使用する必要があることを同僚に納得させようとしています。小さなオブジェクトは渡しても問題ないと思いますが、大きなオブジェクトの場合は、インターフェイスを与えて、すべてではなく、単に i/f を渡します。
これらの大きなクラスは 1 つしか存在しないことに注意してください。i/f が別のオブジェクトに使用されることはありません。これは単にオブジェクトの実装を隠すためのものです。
大きなクラスをインターフェースに分離することは良い習慣だと思いますか?
これを行うことの欠点はありますか?
例:
refactoring - コードリファクタリングを行う場合、どのくらいの情報隠蔽が必要ですか?
どのくらいの情報隠蔽が必要ですか?レコードを削除する前にボイラープレートコードがあります。次のようになります。
注:ボイラープレートコードは、「using(var cmd = new NpgsqlCommand(...)」を含むコード生成されます。
しかし、ボイラープレートコードをリファクタリングすることを真剣に考えています。もっと簡潔なコードが欲しかったのです。これは私がコードをリファクタリングすることを想像する方法です(拡張メソッドでより良くなりました(唯一の理由ではありません;))
executecalarとボイラープレートコードをextensionメソッドの中に入れたかったのです。
上記の私のコードでは、コードのリファクタリング/情報の隠蔽が保証されていますか?リファクタリングされた操作が不透明すぎませんか?
delphi - GUI 情報を隠すための Delphi でのフレームの使用
私は過去 3 年間、趣味/職業レベルで Delphi を学んでいます。初期のコードを恐怖と恥ずかしさで振り返ることができるところまで進歩したことを嬉しく思います。そのため、初期のアプリのいくつかを調べて、それらを書き直し/リファクタリングしています。
私がやめようとしている悪い習慣の 1 つは、あるフォームのコンポーネントに別のユニットからアクセスすることです。これを強制するために、私は情報隠蔽の方法としてフレームを使用する実験を行ってきました。コンポーネントを含むフォームを作成する代わりに、すべてのフォーム コンポーネントを保持するフレームを作成し、そのフレームをフォームに配置して、フレーム宣言をプライベート宣言に移動します。
次に、フォーム初期化セクションにフレームを登録します
次に、フレームとそのコンポーネントにアクセスできるフォーム ユニットのパブリック セクションで、必要なプロパティを宣言します。
また、フレームを使用して、頻繁に繰り返されるコンポーネント グループを統合しています。
これは私が望む目的 (Myframe とそのコンポーネントを非表示にする) で機能しているようですが、この方法の経験がある人はいますか?
フレームの使用に欠点はありますか? これを行うことで実際に利益を得ていますか?フレーム内でネストされたフレームを使用する際に問題はありますか? Delphi でフレームを使用するための適切なガイドはありますか? Delphi に隠れている GUI 情報に関して、同じ効果を達成するためのより良い/簡単な方法はありますか?
HMcG
image - jpg または gif 写真内の情報を非表示にするにはどうすればよいですか?
画像を破壊することなく、jpg や gif などの写真ファイル内に情報を書き込むにはどうすればよいですか? もちろん、全体的なアイデアは、写真のファイル内の情報を誰にも検出されずに送信することであるため、写真に表示することはありません (ある程度のセキュリティ/プライバシーを提供するため)。