問題タブ [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 投票する
3 に答える
2733 参照

language-agnostic - カプセル化について説明できますか?

間違っていることが判明した、最も長く保持されていたプログラミングの仮定は何ですか? 質問、間違った仮定の 1 つは次のとおりです。

そのプライベート メンバー変数は、クラスではなくインスタンスに対してプライベートでした。

(リンク)

私は彼が話していることを聞き取れませんでした.誰かが例を挙げてそれについて間違っている/正しいことを説明できますか?

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

service - 嘲笑に関するさらに別の質問

最初に、TDD の初心者であるにも関わらず、TDD の利点を十分に理解しています。モックの使用を検討するのに十分な進歩があり、モックが OOP に適合する場所を理解することになると、実際のレンガの壁にぶつかったように感じます。

この件に関する関連する投稿/記事をできるだけ多く読んだことがありますが ( FowlerMiller )、どのように、またはいつモックするかについてはまだ完全には明確ではありません。

具体例を挙げましょう。私のアプリにはサービス レイヤー クラス (アプリケーション レイヤーと呼ぶ人もいますか?) があり、メソッドは特定のユース ケースに大まかにマッピングされます。これらのクラスは、永続層、ドメイン層、さらには他のサービス クラスと連携する場合があります。私は良い小さな DI 少年であり、依存関係を適切に分解して、テスト目的などでサブベッドできるようにしました。

サンプル サービス クラスは次のようになります。

}

NMock を使用して、依存関係 (DocumentDao、PatientSnapshotService) を分離してこのメ​​ソッドをテストするプロセスを実行しました。テストの様子はこちら

嘲笑へのこの小さな進出についての私の考えは次のとおりです。

  1. このテストは、多くの基本的な OO の原則を破っているように見えます。カプセル化は特にそうです。私のテストは、テスト対象のクラスの特定の実装の詳細 (つまり、メソッド呼び出し) を完全に認識しています。クラスの内部が変更されるたびに、テストの更新に多くの非生産的な時間が費やされているのを目にします。
  2. 現時点では、私のサービス クラスがかなり単純化されているためかもしれませんが、これらのテストがどのような価値をもたらすかはよくわかりません。特定のユースケースが指示するように、コラボレートするオブジェクトが呼び出されることを保証しているということですか? コードの重複は、このようなわずかなメリットに対してとてつもなく高いようです。

私は何が欠けていますか?

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

java - 列挙型からクライアントクラスのメンバー変数へのメソッドのリンク

次の列挙型構造は、クライアント クラスにとらわれずに特定の操作を実行します (カプセル化の理由により)。

クライアントクラス

私の質問は、MyEnum.A と MyEnum.C に属する method1() の特定の実装をリンクして Client クラス メンバー varY で動作するようにする方法と、MyEnum.B と MyEnum.D の method1() 実装をリンクしてのみ動作させる方法です。クライアント クラス メンバー変数 varX。

たとえば、main() メソッド内では次のようになります。

したがって、現在の列挙型の状態に応じて、上記のステートメントは varX または varY でのみ動作し、aClient の状態を変更する必要があります。

言いましょう:

varYで表されるaClientの状態をvarY+2に変更する必要があります。varX は変更しないでください。

単純な命名規則からわかるように、現時点では MyEnum の varX は Client クラスの varX にリンクされていません。私の考えは、変数の型に傾いています。私はプリミティブ(int)を扱っているので、区別する方法はありません..

Client クラスで varX と varY のそれぞれに異なるカスタム タイプを作成することをお勧めしますか (何とかラップしますか?)。

質問が冗長すぎないことを願っています。よくわからない場合はお知らせください。どうもありがとう。

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

coding-style - スコープとカプセル化に関する質問

スコープとカプセル化について一般的な質問があります。2つのシナリオを取ります。

シナリオ1:

シナリオ2:

機能的に言​​えば、これら2つのコードスニペットはまったく同じことを行います。私はコーディングスタイルのより細かい点を理解しようとしていますが、なぜ一方の方法がもう一方の方法よりも優先されるのでしょうか。カプセル化の観点からは、シナリオ2の方が優れているようです。ただし、シナリオ1は、条件付きのブール値が1つの場所、つまりグローバル定数からのみ取得されるという点で、より確実です。パラメータを正しく受信しているときに間違った値を渡す可能性がある関数呼び出しについて心配する必要はありません。ただし、シナリオ2は、定数の依存関係を削除し、関数をより動的に動作させることができるため、価値があるように思われます。これについて何か考えはありますか?私が見ている他のトレードオフはありますか?

同じ概念と質問がオブジェクトとクラスにも適用されます。ただし、コード例を簡単にするために、関数の観点から例を示しています。

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

python - Pythonモジュールをカプセル化する方法は?

Python モジュール 'mechanize' と 'BeautifulSoup' を単一の .py ファイルにカプセル化することは可能ですか?

私の問題は次のとおりです。mechanize と BeautifulSoup を必要とする Python スクリプトがあります。PHPページから呼び出しています。ウェブホスト サーバーは Python をサポートしていますが、モジュールがインストールされていません。だからこそやりたい。

これがばかげた質問である場合は申し訳ありません。

編集:ご回答いただきありがとうございます。これに対する解決策は、virtualenv 周辺で解決すると思います。誰かが私にこれを非常に簡単な言葉で説明してくれるほど親切でしょうか? virtualenv ページを読みましたが、まだ非常に混乱しています。もう一度ありがとう。

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

c# - イベントを介したユーザー コントロールとの対話

サイトの質問を閲覧しましたが、まだ適切な回答が見つかりません。

私の問題は、すべてのイベントとメソッドが原因で、メイン フォーム クラスが雑然としていることです。

フォームをユーザー コントロールに分割することにしました。残念ながら、他のユーザー コントロールからの情報にアクセスできません。

たとえば、いくつかの情報を出力するユーザー コントロールがあります。しかし、その情報の一部は別のユーザー コントロールにあります。そのデータを取得するにはどうすればよいですか?

私が読んだ解決策の 1 つは、デリゲートを Print User コントロールに渡すことでした。デリゲートには、コントロールからデータを返す Information User Control のメソッドが含まれます。したがって、印刷イベントが呼び出されるたびに、その関数を呼び出します。

私が持っていた他の解決策は、イベントを情報 User Control に添付することでした。ユーザー コントロールの情報が変更されるたびに、印刷変数を更新していました。

0 投票する
26 に答える
225906 参照

java - Integer.parseInt()をカプセル化する良い方法

Integer.parseInt()文字列をintに変換するためによく使用するプロジェクトがあります。何かがうまくいかない場合(たとえば、Stringは数字ではなく文字aなど)、このメソッドは例外をスローします。ただし、コード内のあらゆる場所で例外を処理する必要がある場合、これは非常にすぐに醜く見え始めます。これをメソッドに入れたいのですが、変換がうまくいかなかったことを示すためにクリーンな値を返す方法がわかりません。

C ++では、intへのポインターを受け入れ、メソッド自体がtrueまたはfalseを返すようにするメソッドを作成できました。しかし、私が知る限り、これはJavaでは不可能です。true / false変数と変換された値を含むオブジェクトを作成することもできますが、これも理想的ではないようです。同じことがグローバル値にも当てはまり、これによりマルチスレッドで問題が発生する可能性があります。

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

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

c# - クラスメソッドの複数のパラメーター

全くの初心者質問。int Quantity と小数点以下の価格に基づいてオブジェクトの合計価格を計算するクラスのメソッドを作成しようとしています。これらは両方とも非公開で、インスタンス変数のプロパティの割り当てがあります。メソッドで 2 つの個別のパラメーターを使用している場合、それらにアクセスして計算する方法がわかりません。問題のメソッドは GetInvoiceAmount です。どんな提案でも大歓迎です

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

c++ - カプセル化の「頂点」 - 効果的な C++ からのアドバイスに関する質問

効果的な C++ 状態の項目 23: メンバー関数よりも非メンバー非フレンド関数を優先します。

このアイテムの全体的な目的は、パッケージの柔軟性と機能拡張性だけでなく、カプセル化を促進することでしたが、私の質問は、このアドバイスをどこまで受け入れるかということです。

たとえば、クラス、プライベート データ メンバーを用意し、パブリック関数をプライベート データ メンバーのアクセサーやミューテーターのみに減らすことで、最小限のアプローチを取ることができます。次に、他のすべての関数が非メンバー関数になる可能性があります。

しかし、アクセサーやミューテーターがいたるところにあるため、コードの明瞭性が犠牲になる可能性がありますが、カプセル化を増やしてもよろしいですか? 線引きはどこに?

0 投票する
7 に答える
3074 参照

java - Java のプライベート Collection フィールドへのアクセス

私のクラスの 1 つに、セットを含むフィールドがあります。このフィールドは、コンストラクターでのみ入力され、他のクラスによって読み取られます。もともと私は次のようなものを持っていました:

しかし、これは、myItems を非公開にし、setter と getter を介してのみアクセスする必要があるという OO のベスト プラクティスに反します。それで、私はそれを次のように変更しました:

これで myItems は非公開になりましたが、 getItems() を呼び出す人は誰でも自由にアイテムを追加/削除できます。これは基本的に以前と同じ状況です。(私は実際に誰かがアイテムの内容を変更することを心配していません。これはより理論的な質問です)

そこで、配列を返すように getItems() を変更しました。

今、私のアイテムは本当にプライベートです。残念ながら、アイテムを読み取るオブジェクトが実際に Set を操作する必要があることはわかっているため、配列をすぐに元に戻す必要があります。myItems のコピーを返すこともできます。

これにより、呼び出し元に必要なものが提供されますが、アクセスごとに新しい Set が作成されます。

このような状況であなたはどうしますか? プライバシーを何としても保護し、元の構造の変換/コピーを受け入れるか、コレクションの内容に対する制御を犠牲にして責任ある呼び出し元に依存しますか?