[編集]
私の最初の質問は、「なぜ静的か非静的かを決定するのですか?どちらも同じことをします...」でした。
残念ながら、私が本当に避けたかったC#固有の質問に編集されました。
だから、私はいくつかの追加をしましょう:
私がインターフェイスと言うとき、私は C# キーワード インターフェイスを意味するのではなく、C++ インターフェイスのようなものを意味します: オブジェクトを操作するための明確に定義された関数のセット。インターフェイスを弱めると言うときは、同じことを行うさまざまな関数 (静的/非静的) があることを意味します。同じことを行うさまざまな機能がある場合、私のインターフェースはもはや明確に定義されていません。
したがって、Bob the Janitor が投稿したように、Validate() 関数を実装できます。
Document.Validate(myDocumentObject);
だけでなく、
myConcreteDocumentObject.Validate();
私の Copy() の例に戻るには、次のように Copy() を実装できます。
myConcreteDocument.Copy(toPath);
だけでなく、
Document.Copy(myConcreteDocumentObject, toPath)
また
Document.Copy(fromPath, toPath)
私のドキュメントに属するすべてのファイルを含むフォルダーを考えるとき (この場合、私は具体的なインスタンスに依存していませんが、他のものに依存しています:))。
一般的に、静的クラスではなく静的メソッドについて話しているのです (申し訳ありませんが、言及するのを忘れていたら)。
しかし、Anton Gogolev が言ったように、私の Document クラスは良い例ではなく、適切に設計されていないと思うので、Single Responsibility Principle を確認する必要があると思います。
DocumentClass で動作するある種の ManagerClass を実装することもできます。
例えば:
myDocumentManagerObject.Copy(myConcreteDocumentObject, toPath);
また
myDocumentManagerObject.Copy(myConcreteDocumentObject, toPath);
しかし、アプローチ 1 を参照すると、DocumentObject で何かを行う他のオブジェクト (DocumentManager) ではなく、自分自身でタスクを実行するオブジェクトを作成する傾向があります。
(これがOOPについての宗教的な議論の方向に向かわないことを願っています;))
[/編集]
古いバージョン:
最初は、これは「いつ静的メソッドを使用し、いつ使用しないか」などの非常に基本的な質問のように見えますが、これは私が時々直面するものです (そして、本当の問題が何であるかを説明するのは困難です; おそらくそれは単に1) を使用する (しない) 理由、または 2) を使用する (しない) 理由を取得します。
(私は C# 構文を使用していますが、これは C# 制限の問題ではありません)
OOP では、オブジェクトを操作する (とりわけ) 2 つのアプローチがあります。
1) オブジェクトに何かをさせたい場合は、そうするように伝えます。
myConcreteObject.DoSomething();
物と話しているのと同じです。
2) または、静的メソッドのファンの場合:
ObjectClass.JustDoIt();
ある意味で、静的関数は「気分が良くなる」だけだと思います。そのため、私は静的メソッドを頻繁に使用する傾向があります (具体的なインスタンスから独立するために - 独立性は常に良いことです)。
そのため、クラスを設計するときは、アプローチ 1) とアプローチ 2) のどちらを採用するかを決定しなければならないことがよくあります。
データベースに保存する必要があるドキュメントを表す "Document" クラスがあるとします。
文書
- ファイルシステムからの 1 つまたは複数の画像ファイルで構成されます (これらは単一のドキュメント ページになります)
- 参考文献のようなものがあります-ユーザーがドキュメントに関する情報を追加できるフィールド-追加のファイルに保存されます
- Copy()、AddPage()、RemovePage() などの操作が必要です。
今、私はこのクラスを作成するいくつかの方法に直面しています:
//----- 1) non static approach/talking to objects -----
Document newDocument = new Document();
// Copy document to x (another database, for example)
newDocument.Copy(toPath);
私はこれが好きです: ドキュメントに自分自身をデータベース x にコピーするように指示すると、オブジェクトはそれ自体でコピーを行います。良い。
//----- 2) static approach ----------------------------
Document.Copy(myDocumentObject, toPath);
なぜだめですか?また、いいですね、とても便利に感じます...
では、どれを実装しますか?両方?それとも、一種のヘルパー クラスに静的アプローチを適用しますか? または、アプローチ 1) を選択し、ドキュメント クラスのインターフェイスを弱体化させないように固執しますか?
両方のアプローチについて考えると、(理論的には)任意の関数を静的関数として実装できるという結論に達しました。
Class.Function(aConcreteClassObject, parameters);
非静的でもあります:
aConcreteObject.DoSomething(parameters);
実際の例を挙げると、次のようになります。
[EDIT(パラメータ fromPath を追加「すみません、忘れました」)]
//----- 2) static approach ----------------------------
File.Copy(fromPath, toPath); // .Net-Framework-like
[/編集]
だけでなく:
//----- 1) non static approach ------------------------
ExampeFileClass fileObject = new ExampleFileClass();
fileObject.Copy(toPath);
または(一種のOOP-Overkill):
//----- 1) non static approach, too -------------------
fileObject.ToPath = @"C:\Test\file.txt"; // property of fileObject
fileObject.Copy(); // copy to toPath
では、なぜ 1) を使用する (しない) か、または 2) を使用する (しない) のか?
(Document クラスの例にはあまり集中しません。これは、優れたクラス設計に関する一般的な質問だからです。)