3

私は C# でソフトウェアを開発していますが、次のような記事を読んだことを覚えています。

クラスのメソッドを次のように設計します。

  • クラス インスタンスの状態を変更するには、引数を指定してvoidメソッドを使用します。メソッドは、クラスのデータに対していくつかの変更を行います
  • クラスからデータを取得するために、引数のないメソッドで戻り値を使用します

私はもう記事を見つけることができず、私が書いているコードの品質と保守性を向上させるために、そのような規則の利点と欠点について疑問に思っています.

私の質問は、この質問の参照/記事を知っていますか? これらのステートメントに従うことは理にかなっていますか?

4

3 に答える 3

3

C#には、これらの提案の実用性を低下させると思われるプロパティがあります。ここで取り上げる重要な点は、クラス内のデータはカプセル化 (外部から直接アクセスできない) し、抽象化 (詳細は隠蔽) する必要があるということです。これは、クラスの主な目的の 1 つです。このため、プロパティを持たない C++ のような言語では、このアドバイスがより理にかなっていると思います。

ただし、問題の 1 つは、プライベート フィールドを持つクラスを作成し、プライベート フィールドごとにゲッター メソッドとセッター メソッドを作成する必要があり、ボイラー プレート コードが冗長になることです。プロパティは、カプセル化と抽象化を維持しながら、この戦略を合理化するのに役立ちます。例えば、

UserInfo user = new UserInfo();
user.Username = "foo";
Console.WriteLine(user.Password);

上記の例では、ユーザー名を foo に設定し、ユーザーのパスワードを取得しました。正確にどのように情報を設定および取得したかは隠されています。今は .xml ファイルに保存されているかもしれませんが、後でデータベースに保存するか、メモリに直接保存するように変更することにしました。このクラスを使用する外部の世界は決して賢明ではありません。これは、OOP の多くの優れた点の 1 つです。

質問の 2 つの箇条書きは、プロパティのゲッターとセッターに対応できます。引数なしでクラスからデータを取得したい場合は、プロパティを持つ方が理にかなっています。同様に、オブジェクトの状態を変更したい場合は、setter プロパティを使用できます。入力に対して検証を実行し、スレッド セーフにし、ログを追加し、1 つの引数を取るメソッドで実行できるすべてのことを行うことができます。

于 2013-05-15T09:00:27.663 に答える
2

箇条書きは、コマンドクエリの責任の分離について言及していると思います。実際には、たとえば結果をフィルタリングするために、何らかの引数を return メソッドに渡す必要がある場合があります。ボイドを使用して状態を変更することは賢明であり、状態を変更しないように戻りメソッドを作成することも適切ですが、実際に渡す引数の数は、ゲッター メソッドとセッター メソッドのどちらを使用するかによって決まりません。これは、メソッドがジョブを実行するために何を知る必要があるかという要素です。

ただし、渡す引数の量は最小限に抑える必要があります。複数の引数がある場合は、メソッドが複数のことを行っているかどうかを実際に検討する必要があります。メッセージは、「メソッドに 1 つのことを実行させ、それをうまく実行させる」ということだと思います。これについては、ボブおじさんから多くの情報を得ることができます。ボブ マーティンのクリーン コーダー シリーズは、このテーマに関する優れた情報源です。

于 2013-05-15T08:32:47.593 に答える