問題タブ [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.

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

actionscript-3 - 簡潔なライブラリを構築して複雑さを隠す

私は連動する部品 (サーバー、クライアント、ライブラリなど) を多数備えた製品を開発しています。そのうちの 1 つは、ユーザーが独自のクライアント側コード (Flickr API のようなもの) にリンクする小さなライブラリです。 Google マップ API)。そのライブラリを組み込むと、連動するすべてのビットが魔法のように接続されます。したがって、API の簡素化は主要かつ重要な目標です。

私がユーザーに公開する API には、合計 2 つのクラスと 7 つのパブリック メソッドがあります。簡単にピージー、レモン絞り。

しかし、そのシンプルさは注意深く作られた幻想です。私が配布しているライブラリは、実際には別のライブラリに依存しており、独自の 136 のクラス (および 1000 以上のパブリック メソッド) があります。ビルド プロセス中に、API コンシューマによる統合と展開を容易にするために、2 つのライブラリを 1 つの成果物にリンクします。

私が今直面している問題は、エンド ユーザー (自分のソフトウェアを統合して独自の機能を強化するアプリケーション開発者) に、不必要な複雑さの嵐に溺れて、余計な面倒なことに悩まされたくないということです。

外から見ると、ライブラリにはちょうど 2 つのパブリック クラスと、ちょうど 7 つのパブリック メソッドが含まれているように見えるはずです。

自分のプロジェクトでは、この種のことをどのように処理していますか? 私は、言語にとらわれないソリューションや、さまざまな言語、コンパイラ、ビルド ツールのさまざまな手法に興味があります。

私の特定のケースでは、SWC ライブラリ ファイルを使用してフラッシュ プラットフォーム (AIR/Flex/Actionscript) 用に開発しています。ビルド方法は Java プラットフォームに類似しており、すべてのクラスが同じ可視性を持つ zip コード モジュールにバンドルされています (Actionscript SWC ファイルは、概念的には Java JAR ファイルとほぼ同じです)。

.NET には、クラスとメソッドの「内部」修飾子がありませんか? それはまさに私が探しているものであり、SWC 境界間のクラスの可視性を隠すためのトリッキーなテクニックを誰かが知っているなら、ぜひ聞いてみたい.

0 投票する
5 に答える
1013 参照

abstraction - 情報の非表示と非表示の依存関係

プロシージャ (または関数、モジュールなど) の設計における一般的なベスト プラクティスは何ですか?

より具体的に言うと、getEmployeePhoneNbr(employeeId) というプロシージャをコーディングするとします。内部的には、このプロシージャは、employeeId をキーとするデータベース テーブルをクエリすることによって実装されます。これらの実装の詳細を非表示にしたいのですが、手順が外部ファイルに依存するようになり、環境が変わるとその使用が妨げられます。

プロシージャが外部リソース (ファイル、データベースなど) を使用するときはいつでも、同じ状況が発生します。プロシージャ内でそのリソースの使用をハードコードするのは、どういうわけか間違っているように感じますが、代替手段が何であるかはわかりません。

私はオブジェクト指向言語で作業していないことに注意してください。可能な限り、あらゆる種類の言語に広く適用できる回答に最も関心があります。

ありがとう、マット

0 投票する
11 に答える
13975 参照

java - javaでプログラム実行間でデータを保存する最良の方法は?

次へ: Javaでプログラム実行間でデータを保存する最良の方法は何ですか? テキスト ファイルを使用してそのように情報を保存できることは既に知っていますが、プログラムの実行の間にプログラムによって生成された情報を保存するためのより良い方法があるかどうか疑問に思っていました。

また、情報を安全に保つためにそれを行う方法はありますか? 具体的には、エンドユーザーがアクセスできないようにしたいです。

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

javabeans - JavaBeans の設計は情報隠蔽とどのように対応していますか?

2学期前、私には次のような教授がいました。

一部のユーザーは、すべてのプライベート インスタンス変数に対して常にセッター メソッドとゲッター メソッドを含めるように言われています。これは情報の隠蔽を破り、多くの場合、不変条件を強制できないシステムになると私は言います。

今、それは私には正しいように聞こえます。しかし、これらの種類のセッター/ゲッターを含めることは、JavaBeans を作成するためのコア部分ではありませんか? もしそうなら、なぜですか?そうでない場合、JavaBeans について何を誤解していますか?

0 投票する
2 に答える
1090 参照

oop - カプセル化は抽象化のサブセットですか?

カプセル化と抽象化の両方が情報の隠蔽に関連しているので、カプセル化を抽象化のサブセットとして理解できますか?

0 投票する
2 に答える
136 参照

c# - 1回を除くすべてのクラスからデータを非表示にするにはどうすればよいですか?

全体を書き直すことなく、一部のソフトウェアで最近遭遇した設計上の欠陥を修正しようとしています。一部のサーバーからデータを受信し、受信したすべてのデータを格納する別の DLL (StaticDataClass と呼びます) 内のクラスにそれを書き込むメッセージ リスナー スレッドを持つ .exe があります (ほとんどが静的です)。起動時にデータベースからプルされます)。このクラスは、他のクラスがデータを取得するために使用できるメソッドも提供します。問題は、ストア (セット) メソッドがすべてパブリックであるため、他のクラスがこのデータを上書きして、アプリケーション全体を壊す可能性があることです。実行可能ファイル自体に含まれるオブジェクトを除くすべてのオブジェクトのデータを保護する (set/store メソッドを非表示にする) には、どうすればよいでしょうか?

現在、パブリックゲッターのみを定義するインターフェースをいじっています。次に、シングルトンクラスにそのインターフェースを実装させ、インスタンスプロパティがインターフェースタイプを返すようにして、インターフェースで宣言された get メソッドのみを使用できるようにします。 . しかし、実行可能ファイルが起動すると、インターフェイス タイプではなく StaticDataClass オブジェクトへの実際の参照が何らかの方法で取得されるため、store/set メソッドも呼び出すことができます。

これは完全な証拠ではありませんが、システムに精通していない一部の開発者が、これらのパブリック ストレージ メソッドを使用しても問題ないと考えるのを防ぎます。これは、Visual Studio の intellitype によって、コーディング中にそれらが可視化されるためです。代わりに、ストア メソッドを含む型としてオブジェクトをキャストすることによって、それを壊そうとする必要があります。

これを行うためのよりクリーンな方法はありますか?

0 投票する
2 に答える
243 参照

information-hiding - 情報を隠すことは、モジュール化にどのように役立ちますか?

情報隠蔽は、システムを構成するモジュールを分離するのにどのように役立ちますか?

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

c# - プライベート メソッドの単体テストはどこに配置しますか?

C# クラスのプライベート関数の単体テストはどこに配置しますか?

ウィキペディアの記事では、次のように提案されています。

  • テストしているメンバーと同じクラスにテストを配置する
  • 部分クラスの使用

個人的には、これらの方法はどちらも適切とは思えず、単体テストを完全に別のプロジェクトに配置することを好みます。

これについて何か考えはありますか?

(private メソッドをテストする必要があるかどうかについて、かなりの量の議論があることは知っています。議論の両方の側面を聞きたいです。)

0 投票する
5 に答える
6839 参照

asp.net-mvc - 情報の隠蔽に焦点を合わせながら、プロジェクトに堅牢なリクエストごとのセッションパターンを実装するにはどうすればよいですか?

私は現在、永続層としてNHibernateを使用してASP.NETMVCプロジェクトを構築しています。

今のところ、いくつかの機能が実装されていますが、ローカルNHibernateセッションのみを使用します。データベースにアクセスした(読み取りまたは書き込み)各メソッドは、「using()」句を使用して独自のNHibernateセッションをインスタンス化する必要があります。

問題は、NHibernateの遅延読み込み機能を利用して、プロジェクトのパフォーマンスを向上させたいということです。

これは、ビューがレンダリングされるまで、リクエストごとにNHibernateセッションが開いていることを意味します。さらに、同時リクエストをサポートする必要があります(同時に複数のセッション)。

どうすればそれをできるだけきれいに達成できますか?

Webを少し検索して、リクエストごとのセッションのパターンについて学びました。私が見た実装のほとんどは、セッションを格納するためにある種のHttp *(HttpContextなど)オブジェクトを使用していました。また、Application_BeginRequest / Application_EndRequest関数の使用は複雑です。これは、リクエストごとに1回だけセッションをインスタンス化する場合に、HTTPリクエスト(aspxファイル、cssファイル、jsファイルなど)ごとに起動されるためです。

私が懸念しているのは、ビューまたはコントローラーがNHibernateセッション(または、より一般的にはNHibernate名前空間とコード)にアクセスできないようにすることです。つまり、コントローラーレベルでもビューレベルでもセッションを処理したくないということです。

私はいくつかのオプションを念頭に置いています。どれが一番いいと思いますか?

  • コントローラーアクションの前後にトリガーされるインターセプター(GRAILSなど)を使用します。これらは、セッション/トランザクションを開いたり閉じたりします。これはASP.NETMVCの世界で可能ですか?
  • WebコンテキストでNHibernateによって提供されるCurrentSessionContextシングルトンを使用します。このページを例として使用すると、これは非常に有望だと思いますが、それでもコントローラーレベルでのフィルターが必要です。
  • HttpContext.Current.Itemsを使用して、リクエストセッションを保存します。これは、Global.asax.csの数行のコードと相まって、リクエストレベルでのセッションを簡単に提供できます。ただし、これはNHibernateと私のビュー(HttpContext)の間に依存関係が注入されることを意味します。

どうもありがとうございます!

0 投票する
5 に答える
166 参照

language-agnostic - クラス内でリストを公開する最も適切な方法は何ですか?

次のモデルを想像してください。

  • テーブルには多くの行があります
  • には多くのセルがあります

これらのクラスを「オブジェクト指向の方法」で処理するための好ましいインターフェースは何でしょうか?

1 - プロパティ/セルへのアクセスを提供します(必ずしも基になるデータ構造を公開する必要はありませんが、たとえばクラス RowCollection を作成します...)

2 - または、メソッドをTableおよびRowクラスに直接提供します

3 - 上記のいずれでもない...