問題タブ [class-visibility]

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 投票する
2 に答える
369 参照

c++ - C++ DLL および H ファイルを顧客と共有する

私のプロとしての人生で初めて、基本的な汎用ソフトウェアと、顧客が望むように動作させ、顧客が入力をフィードして出力を読み取れるようにするインターフェイスを含む DLL を顧客に提供する必要があります。

ここでの私の大きな問題は、知的財産のために、顧客が絶対に知る必要のないものを顧客に見せない可能性があることです. これにはデータ型が含まれるため、内部メソッドの署名を彼に示すことさえできません。私は、私たち自身の内部のものを模倣するデータ型と構造を作成しましたが、たとえば、不要な属性/要素を自発的に省略したり、プライベートな内部ロジックへのヒントを隠すために別の名前を付けたりします。そして、データを取得するメソッドは、独自のデータ構造をマップし、それらに型付けします。あなたは絵を手に入れます。

また、今回は純粋なソフトウェア アーキテクチャの観点から、特定のメンバー、属性、変数にアクセスしてほしくありません。喜んで、彼がどのように喜ぶか。ただし、それらはそのインターフェイスにのみ関連しており、社内ソフトウェアの一部ではありません。

私が今持っているのは、彼がインスタンス化できるインターフェイスとして機能するクラスです。基本的には、出力用の get メソッド、入力をフィードして更新計算を起動するメソッド、およびその他のパラメーターと値 (ソフトウェア バージョンや現在の状態など) 用の getter と setter を提供します。これらのパラメータおよびその他の変数の実際のデータ変数は、DLL にコンパイルされる私の CPP ファイルに隠されているため、私が彼に渡す H ファイルのインターフェイスとして使用するクラスの属性としてさえ宣言されていません。プライベートとして、彼はそれらについて知りません-彼はゲッターとセッターしか持っていません。

ここでどのデザインパターンを使用する必要がありますか? 顧客と共有する H ファイルに変数をクラスの属性として、 private として実際に配置できますか? しかし、その後、彼はそれらをプライベートからパブリックに変更し、クラスの新しいメソッドを記述し、それらにアクセスして、コンパイラが文句を言うことなく自由に変更できるでしょうか? それ以外の場合、クラスに貢献して、CPP ファイルまたは彼がアクセスできない他の H ファイルでそれを拡張できますか?

それは私にとってすべて新しいものなので、非常に多くの質問があります。しかし、全体像はわかります。厳密に必要な最小限の情報をこの H ファイルで顧客と共有して、顧客が私の DLL を機能させ、データ出力を取得できるようにしたいと考えています。そしてもうありません。

前もって感謝します、チャールズ

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

class - 他人だけが変更できるクラス属性のパターン

では、Door クラスと Lock クラスがあるとします。Door クラスlockのインスタンスには、Lock クラスのインスタンスであるプロパティがあります。

ドアにロックのインスタンスを「所有」させたいのですが、ドアが独自のロックを変更できるようにしたくありません。たとえば、これを可能にしたくない:

しかし、ドアのロックに他のクラスがアクセスできるようにしたい. たとえば、ドアのロックとロック解除を行うには、DoorMan クラスが必要です。したがって、すべての Lock プロパティを非公開にするだけでは簡単ではありません。

これを行うためのパターンはありますか?私は主に PHP で作業していますが、答えは言語固有である必要があります。前もって感謝します。

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

java - 有効な Java アイテム 13 と TDD

「Joshua Bloch TDD」をグーグルで検索したところ...あまり出てきませんでした。この件について彼が何を言わなければならないかを本当に知りたいので、これは非常に残念です。

項目 13 (第 2 版を見ています) は、「クラスとメンバーのアクセシビリティを最小限に抑える」というタイトルです。数ページの後、彼は次のように述べています。

テストを容易にするために、クラス、インターフェイス、またはメンバー* をよりアクセスしやすくしたくなるかもしれません。... public クラスの private メンバーをテストするために package-private にすることは許容されますが、アクセシビリティをそれ以上に高めることは許容されません... 幸いなことに、それも必要ではありません。テストは、テスト対象のパッケージの一部として実行できるため、そのパッケージ プライベート要素にアクセスできます。

* 「メンバー」とは、「フィールド、メソッド、ネストされたクラス、およびネストされたインターフェース」を意味します。

TDD初心者ですが、徐々に足を踏み入れていると、現在のコンセンサスには、アプリコードパッケージを使用したテストクラスが含まれていないようであり、src\testとsrc\mainの下に一致する構造さえも含まれていないようです。ほとんどがTDDです。専門家は別の方法でテスト用ディレクトリを構成しているようです (たとえば、"unittests" という名前のディレクトリと "functionaltests" という名前のディレクトリと "e2etests" という名前のディレクトリがあります)。

具体的には、「テストによって導かれるオブジェクト指向ソフトウェアの成長」で、オークション アプリの TDD 開発を追跡しました。作成者は、何百ものパブリック メソッドを追加することに何の不安もありません。さらに、ある章の後、ダウンロードした「これまでの構造」を調べたところ、テストのディレクトリ構造を完全に変更して、テストのカテゴリに分けていました...

少なくとも過去に、これがジレンマの原因であることに気付いたベテランの TDD 担当者はいますか? もしそうなら、どのように解決しましたか?

実用的な例として、私は Lucene インデックス アプリを開発することで TDD 手法に慣れています。このアプリはドキュメントにインデックスを付け、クエリを実行できるようにします。現時点では、すべてのアプリ クラスが同じパッケージに含まれています。実際に公開する必要mainがある唯一のメソッドは、1 つのクラスにあります。それでももちろん、私は非常に多くのパブリック メソッドを持っています。TDD を使用しているという事実がなければ、それらはすべてパッケージ プライベートである可能性があります。

PS「メソッドの可視性」のタグがないため、「クラスの可視性」を選択しました

後で

「Growing Object-Oriented...」で採用されたアプローチによって、私はかなり不幸な道に導かれたようです.パブリックメソッドの過剰使用は、それがテクニックのデモンストレーションであるという理由だけで使用されたと思われます. ハ。

テストのカテゴリを分割したい場合、この種のアプローチを使用する人はいますか?

\src\unit_tests\java\core\MainTest.java

だけでなく、例えば:
\src\func_tests\java\core\MainTest.java

\src\e2e_tests\java\core\MainTest.java?

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

c# - C# でインスタンスをユーザー プロシージャに渡すときにメソッドの可視性を制限する

「私」がすべてのパブリック メソッドにアクセスできるクラスを定義しようとしていますが、インスタンスをユーザー提供の関数に渡すと、パブリック メソッドのサブセットにしかアクセスできません。これらの行に沿ったもの:

しかし、もちろん、上記で実装したように、ユーザーはそれを (MasterClass) に再キャストするだけで、Master メソッドにアクセスできます。UserClass を別の (ユーザー) 名前空間に配置しようとしましたが、UserFunction の呼び出しで「型 X を Y に変換できません」というコンパイル エラーが発生しました。

また、複数の Interface インスタンス (IMaster / IUser) でさまざまなことを試しましたが、どれも機能していないようでした。また、抽象クラスの使用をいくつか試しました (頭が痛くなり、より良い結果が得られませんでした)。

DID が機能しているように見えたのは、コード内で MasterClass を定義することでした。その後、UserFunction を呼び出すときに "(UserClass)" に再キャストでき、ユーザーは Master メソッドを認識できなくなります。ただし、そのようなクラスが (多数?) 必要になる場合があるため、プライマリ プログラム/ファイルが実際に乱雑になります。私がやりたいことを行うためのより良い/より良い/より簡単な/(?)方法があるかどうか知りたいですか?