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

11
静的は単体テストでは普遍的に「悪」であり、そうである場合、Resharperがそれを推奨するのはなぜですか?[閉まっている]
私は、C#.NETで静的であるユニットテスト(モック/スタブ)依存関係に3つの方法しかないことを発見しました。 ほくろ TypeMock ジャストモック これらの2つが無料ではなく、1つがリリース1.0に達していないことを考えると、静的なものをモックするのは簡単ではありません。 それは静的な方法とそのような「悪」(ユニットテストの意味で)を作りますか?もしそうなら、なぜ再シャーパーは私に静的なもの、静的なものを作ることを望んでいますか?(再シャーパーも「悪」ではないと仮定します。) 明確化: メソッドのユニットテストを行い、そのメソッドが別のユニット/クラスで静的メソッドを呼び出す場合のシナリオについて説明しています。単体テストのほとんどの定義では、テスト対象のメソッドが他の単体/クラスの静的メソッドを呼び出すようにした場合、単体テストではなく、統合テストになります。(便利ですが、単体テストではありません。)

7
プライベート静的メソッドがあるのはなぜですか?
質問を解決したかっただけです。プライベートな可視性を持つ通常のメソッドとは対照的に、プライベートな静的メソッドを持つことのポイントは何ですか? 静的メソッドを持つことの利点は、クラスのインスタンスなしで呼び出すことができることだと思っていましたが、そのプライベートは静的であるというポイントさえありますか? 私が考えることができる唯一の理由は、オブジェクトレベルではなく、クラスレベルでメソッドを概念的に理解するのに役立つということです。

10
すべての静的メソッドを使用することはできませんか?
以下の2つのUpdateSubjectメソッドの違いは何ですか?エンティティを操作する場合は、静的メソッドを使用する方が良いと感じました。どのような状況で非静的メソッドを使用する必要がありますか? public class Subject { public int Id {get; set;} public string Name { get; set; } public static bool UpdateSubject(Subject subject) { //Do something and return result return true; } public bool UpdateSubject() { //Do something on 'this' and return result return true; } } 私はこの本当に面倒な質問に対してコミュニティから多くのキックを得ることを知っていますが、私はそれを尋ねることを止めることができませんでした。 継承を扱う場合、これは非現実的になりますか? 更新: 職場で今起こっています。5人の開発者と6か月のasp.net …

7
テスト容易性を設計する際に静的ユーティリティクラスを処理する方法
TDDを使用して開発されたほとんどの部分で、テスト可能なシステムを設計しようとしています。現在、次の問題を解決しようとしています。 さまざまな場所で、ImageIOやURLEncoder(標準Java APIの両方)などの静的ヘルパーメソッド、および大部分が静的メソッド(Apache Commonsライブラリなど)で構成されるその他のさまざまなライブラリを使用する必要があります。しかし、このような静的ヘルパークラスを使用するメソッドをテストすることは非常に困難です。 この問題を解決するためのアイデアがいくつかあります。 静的クラス(PowerMockなど)をモックできるモックフレームワークを使用します。これは最も簡単な解決策かもしれませんが、どういうわけかあきらめたように感じます。 これらのすべての静的ユーティリティの周りにインスタンス化可能なラッパークラスを作成して、それらを使用するクラスに注入できるようにします。これは比較的クリーンなソリューションのように聞こえますが、これらのラッパークラスを大量に作成することになると思います。 これらの静的ヘルパークラスへのすべての呼び出しをオーバーライド可能な関数に抽出し、実際にテストするクラスのサブクラスをテストします。 しかし、TDDを行う際に多くの人が直面しなければならない問題であるに違いないと私は考え続けます。したがって、この問題の解決策はすでに存在しているはずです。 これらの静的ヘルパーを使用するクラスをテスト可能に保つための最良の戦略は何ですか?


15
「静的関数」はいつ使用されますか?
OK、静的関数とは何かを学びましたが、プライベートメンバー関数よりもなぜ静的関数が有用なのかまだわかりません。これはちょっと新しい質問かもしれませんが、プライベートメンバー関数をすべて静的関数に置き換えるだけではどうですか?

2
依存性注入と静的メソッド
文字列を受け取り、文字列を出力するメソッドを使用してクラスにアプローチする方法について、今日、別の開発者と興味深い議論をしました。 例の目的のために完全に構​​成されている次のようなものを想像してください public string GetStringPart(string input) { //Some input validation which is removed for clarity if(input.Length > 5) return input.Substring(0,1); if(input.Substring(0,1) == "B") return input.Substring(0,3); return string.empty; } 文字列入力に基づいたロジックを持つ関数は、DIを使用してプロジェクトに追加され、DIコンテナが配置されています。この新しいクラスをインターフェイスで追加し、必要な場所に挿入しますか、それとも静的クラスにしますか?それぞれの長所と短所は何ですか?どこで必要なときにアクセスするだけでなく、コンストラクター注入で使用するようにしたい(またはしたくない)のはなぜですか。

7
メソッドを呼び出すためだけにオブジェクトを頻繁に作成している場合、コードのにおいですか
次のようなコードがたくさんあるコードベースを継承しました。 SomeDataAdapter sda = new SomeDataAdapter(); sda.UpdateData(DataTable updateData); そして、sdaは二度と使用されません。 これらのメソッドは、実際には静的クラスメソッドである必要があることを示すコードの匂いですか?

5
静的メソッドをオーバーライドできないのはなぜですか?
この質問への回答で、一般的なコンセンサスは、静的メソッドはオーバーライドされることを意図していないということでした(したがって、C#の静的関数は仮想または抽象にできません)。ただし、これはC#の場合だけではありません。Javaもこれを禁止しており、C ++もそれを好まないようです。ただし、子クラスでオーバーライドしたい静的関数(ファクトリーメソッドなど)の多くの例を考えることができます。理論的には、それらを回避する方法がありますが、それらはどれもきれいでも単純でもありません。 静的関数をオーバーライドできないのはなぜですか?

1
静的メソッドを悪用していますか?
数ヶ月前、私は新しいプロジェクトで働き始めました。コードを調べてみると、使用されている静的メソッドの量が多くなりました。としてのユーティリティメソッドだけcollectionToCsvString(Collection<E> elements)でなく、多くのビジネスロジックも保持されます。 私はこの背後にある理論的根拠の責任者に尋ねたとき、彼はそれが春の専制政治から逃げる方法だと言った。この思考プロセスに何かがあります:顧客の領収書作成方法を実装するために、サービスがあります @Service public class CustomerReceiptCreationService { public CustomerReceipt createReceipt(Object... args) { CustomerReceipt receipt = new CustomerReceipt(); // creation logic return receipt; } } さて、この男は、基本的にはクライアントクラスがSpring Beanでなければならないという制限を課しているため、Springによって不必要に管理されるクラスを持つことを嫌うと言いました。最終的にすべてをSpringで管理することになります。これにより、手順を踏まずにステートレスオブジェクトを操作する必要が生じます。ここに記載されている内容は多かれ少なかれhttps://www.javacodegeeks.com/2011/02/domain-driven-design-spring-aspectj.html したがって、上記のコードの代わりに、彼は public class CustomerReceiptCreator { public static CustomerReceipt createReceipt(Object... args) { CustomerReceipt receipt = new CustomerReceipt(); // creation logic return receipt; } } …

3
ステートレスについての意味的な手がかりとしての「静的」?
私は最近、Javaの中規模プロジェクトをリファクタリングして、戻って単体テストを追加しました。シングルトンとスタティックをモックするのがどれほど苦痛であるかに気付いたとき、私はついにこれまで読んでいたものをついに「手に入れました」。(私は経験から学ぶ必要がある人の一人です。まあ。) ですから、Springを使用してオブジェクトを作成し、それらをワイヤリングするようになったのでstatic、左右のキーワードを取り除きました。(潜在的にそれをモックしたい場合、Math.abs()と同じ意味で本当に静的ではありませんよね?)問題は、staticメソッドが依存していないことを示すために使用する習慣になったことです任意のオブジェクト状態。例えば: //Before import com.thirdparty.ThirdPartyLibrary.Thingy; public class ThirdPartyLibraryWrapper { public static Thingy newThingy(InputType input) { new Thingy.Builder().withInput(input).alwaysFrobnicate().build(); } } //called as... ThirdPartyLibraryWrapper.newThingy(input); //After public class ThirdPartyFactory { public Thingy newThingy(InputType input) { new Thingy.Builder().withInput(input).alwaysFrobnicate().build(); } } //called as... thirdPartyFactoryInstance.newThingy(input); だから、ここが微妙な感覚になります。古い方法が好きだったのは、Math.sin(x)と同様に、ThirdPartyLibraryWrapper.newThingy(x)が毎回同じ方法で同じことをしたことを大文字が教えてくれたからです。オブジェクトに要求することをオブジェクトがどのように行うかを変更するオブジェクトの状態はありません。ここで私が検討しているいくつかの可能な答えがあります。 誰もこのように感じていないので、私には何か問題があります。たぶん、オブジェクト指向のやり方を実際に内部化していないだけかもしれません!たぶん私はJavaで書いていますが、FORTRANなどで考えています。(私がFORTRANを書いたことがないので、どれが印象的でしょう。) コードについての推論を目的として、不変性の一種のプロキシとして静的性を使用しているのかもしれません。そうは言っても、ステートフルなものとそうでないものを知るためにコードを維持するために、コードに手がかり はありますか? おそらく、良いオブジェクトのメタファーを選択した場合、これは無料で提供されるはずです。例えばthingyWrapper、Thingyそれ自体が可変である可能性のあるラップされた状態に依存していないように聞こえます。同様に、thingyFactoryサウンドは不変である必要がありますが、作成時に選択されるさまざまな戦略を持つことができます。

6
ほとんどのクラスをデータフィールドのみのクラスとメソッドのみのクラス(可能な場合)に分離することは、良いパターンですか、それともアンチパターンですか?
たとえば、クラスには通常、クラスのメンバーとメソッドがあります。例: public class Cat{ private String name; private int weight; private Image image; public void printInfo(){ System.out.println("Name:"+this.name+",weight:"+this.weight); } public void draw(){ //some draw code which uses this.image } } しかし、単一責任の原則とオープンクローズの原則について読んだ後、クラスをDTOと静的メソッドのみのヘルパークラスに分離することを好みます。例: public class CatData{ public String name; public int weight; public Image image; } public class CatMethods{ public static void printInfo(Cat …

3
C#のプライベート静的メソッドは何かを傷つけますか?
クラスで複数回発生する特定の検証用のプライベート検証メソッドを作成しました(検証されたデータをさまざまな理由で保存できません)。現在、ReSharperは、関数を静的にできることを示唆しています。静的メソッドの既知の問題のため、そうすることに少し消極的です。それはプライベート静的メソッドになります。私の質問は、プライベート静的メソッドは、パブリック静的メソッドのような同様の結合とテストの問題を引き起こす可能性があるのですか?それは悪い習慣ですか?私はそうは思いませんが、ここに落とし穴があるかどうかはわかりません。

2
単体テストユーティリティクラス
私たち全員が、さまざまなソースからの使用のために、静的メソッドのみを含むいくつかのユーティリティクラスを持っています。ここで、このコードのテストに向けて実行できる2つの方法があります。 アプローチ1: ユーティリティクラス用に個別の単体テストを用意します。それらが呼び出されているところはどこでも、PowerMockなどのプロビジョニングが用意されているテストフレームワークを使用して相互作用を模擬します。これは基本的に、ユーティリティクラスをシステムの個別のコンポーネントとして扱い、個別にテストして保守する必要があります。 アプローチ2: ユーティリティクラスの単体テストを記述しないでください。ただし、このユーティリティクラスと対話する他のコアクラス用に記述されたテストでは、その相互作用が発生します。これにより、このユーティリティクラスで記述されたコードがさまざまなユースケースに対して適切にテストされることが本質的に保証されます。何かが壊れた場合、他のコンポーネントのテストはそれをキャッチできるはずです。 どちらのアプローチが望ましいか、または他の方法でこれに取り組む方法があるかどうかについて、あなたの考えを共有してください。

4
静的メソッドを介してオブジェクトを渡すことが有利なのはなぜですか?
オブジェクトでメソッドを呼び出すよりも、静的メソッドを使用してオブジェクトへの参照をパラメーターとして渡すほうが有利なのはなぜですか? 私の意味を明確にするために、次のクラスを検討してください。 public class SomeClass { private double someValue; public SomeClass() { // Some constructor in which someValue is set } public void incrementValue() { someValue++; } } 静的メソッドを使用したこの代替実装と比較して: public class SomeClass { private double someValue; public SomeClass() { // Some constructor in which someValue is set } public static …

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.