タグ付けされた質問 「static-methods」

4
静的メソッドを使用しているメソッドを単体テストするにはどうすればよいですか?
次のように、配列用の拡張メソッドをC#でbyte16進文字列にエンコードする拡張メソッドを記述したとします。 public static class Extensions { public static string ToHex(this byte[] binary) { const string chars = "0123456789abcdef"; var resultBuilder = new StringBuilder(); foreach(var b in binary) { resultBuilder.Append(chars[(b >> 4) & 0xf]).Append(chars[b & 0xf]); } return resultBuilder.ToString(); } } 次のように、NUnitを使用して上記のメソッドをテストできます。 [Test] public void TestToHex_Works() { var bytes = new …

5
「純粋な関数」ではなく、外部APIまたはハードウェアと相互作用するメソッドは静的である必要がありますか?
メソッドを静的にするかどうかについて読んだとき、この投稿で要約されているように、メソッドは状態を変更せず、結果がそれ。ただし、この投稿で最も投票数の多い回答には、可能な限り静的メソッドを使用する必要があると記載されています。この投稿の回答の多くは、最も論理的なことは何でもすべきだと言っています。 私の場合、複数の場所で使用され、どのモデルまたはビューモデル(C#MVVMを使用)のメンバーとしても意味がないため、共通のユーティリティクラスに〜15のメソッドがあります。パッケージを使用してさまざまなハードウェアコンポーネントと対話するvoidメソッドがあります(たとえば、National Instruments、OPCクライアントなど)。一部の入力を取得し、APIに対してGETまたはPUTを実行してから応答を返すメソッドもあります。これらのメソッドはHttpClientまたは類似のものを使用します。これらのメソッドは、のような入力に対する単純な演算子ではなくMath.Sqrt()、状態を変更しません。 それで、そのようなメソッド(そしてこの場合、クラス全体)は静的でなければなりませんか?静的メソッドを持つ静的クラスがあることには明らかな利点があります。オブジェクトを作成する必要がないため、安全で高速です。また、これらの静的メソッドはそれぞれ、APIとハードウェアの相互作用のためにより多くの静的メソッドとクラスを使用します。私が目にする唯一の欠点は、TypeMock Isolatorのような有料のフレームワークで単体テストを書かなければならないことです。TypeMock Isolatorなどの有料サービスを使用してモックを作成するのが答えである場合、コストは問題になりません。コンセンサスであればそれで結構です。新しい開発者を獲得したり、プロジェクトが成長したりするときに、適切にスケーリングし、技術的な負債をほとんど残さない決定をしたいだけです。 これをより明確にするためにさらに情報を提供する必要があるかどうかをお知らせください!

5
メソッドを静的にすると、多くのインスタンスを持つクラスのメモリを節約できますか?
アーロノートの質問への回答に応じて: すべての静的メソッドを使用することはできませんか? 静的メソッドに使用されるメモリは少なくありませんか?各オブジェクトインスタンスは、非静的メンバー関数の独自の実行可能バージョンを持ち歩いているように見えます。 OOの設計が不十分であっても、静的メソッドの呼び出しにどのくらいのオーバーヘッドが関係していても、将来の頭痛の種であっても、実行時に使用するメモリが少なくないのではないでしょうか。 次に例を示します。 ゼロで初期化されたオブジェクトのベクトルを作成します。各オブジェクトには、1つのデータ(9つのdoubleで構成される三角形)が含まれています。各オブジェクトは、.stlファイルから読み取られたデータから順に読み込まれます。必要な静的メソッドは1つだけです。適切なOO設計では、データを直接処理するメソッドを各オブジェクトに配布する必要があります。標準のOOソリューションは次のとおりです。 foreach(obj in vec) { obj.readFromFile(fileName); } 各objはreadFromFile、データとともにのコンパイル済みコードを保持します! この場合、パフォーマンスよりもメモリの方が問題であり、制約されたシステムには大量のデータがあります。 ソリューション: 名前空間メソッド(C ++には最適ですが、Javaでは不可能) objのクラスの1つの静的メソッド。実行可能コードは、実行時に1か所に保持されます。メソッドを呼び出すための小さなオーバーヘッドがあります。 objの派生元の親クラスreadFromFile。プライベートメソッドが含まれます。コールとsuper.callPrivateMethod()その呼び出しreadFromFile。乱雑ですが、各オブジェクトのメモリオーバーヘッドが多少あります。 readFromFileobjのスコープ外に実装するため、vecのクラスまたは呼び出し元のクラスに実装します。私の意見では、これはデータのカプセル化を壊します。 大量のデータの場合、三角形ごとに1つの明示的なオブジェクトを使用するのは最善の方法ではないことに気づきました。これは単なる例です。

1
大きな静的初期化子はコードの匂いですか?
SimpleExpandableListAdapterAndroidで拡張しています。Androidのアダプターは、コンストラクターにかなり複雑な引数が多数あり、セッターやビルダーがないため、あまりうまく実装されていないと思います。私のクラスでは、これらの引数のほとんどは呼び出し元のクラスに依存していないため、内部的に構築したいと思います。ただし、引数はネストされたListsであり、プログラムで構築する必要がある整数と文字列の配列です。 superコンストラクタの前に何もsuper呼び出すことができず、呼び出しが戻る前にインスタンスメソッドを呼び出すことができないため、現在、呼び出しから呼び出す静的メソッドがいくつかありsuperます。 super(getContext(), initGroupData(), groupLayout, initGroupFrom(), initGroupTo(), initChildData(), childLayout, initChildFrom(), initChildTo()); これを処理する方法は3つあります。今と同じように静的メソッドを呼び出す、おそらくこれらの同じメソッドを呼び出して静的変数を初期化して静的変数を初期化する大きな静的イニシャライザを使用するsuperか、これらのメソッドをすべてビルダーにカプセル化します。 今はビルダーに傾いていると思いますが、これを処理するためのより良い方法があるかどうか疑問に思っています。

6
静的関数とクラス
BigDecimals を使用していくつかの基本的な計算を行うためのユーティリティ関数を構築したいとします。たとえば、の平均を計算する関数が必要ですList<BigDecimal>。 最善のアプローチは何ですか?静的関数またはユーティリティクラス? public static BigDecimal computeAverage(List<BigDecimal> numbers) または public class BigDecimalUtil public computeAverage(List<BigDecimal> numbers)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.