1

質問を非常にうまく表示するデモ スクリプトがあるので、スクリプトを表示してから質問します。

class Program
{
    static void Main(string[] args)
    {
        Dog dog = new Dog() { Age = 4 };

        //This approach (version A)
        dog.DisplayDogYears();

        //Or this approach (version B)
        displayDogYears(dog);

        Console.ReadKey();
    }

    private static void displayDogYears(Dog d)
    {
        Console.WriteLine("The dog is {0} years old in human years.", d.Age * 7);
    }
}

public class Dog
{
    public int Age { get; set; }

    public void DisplayDogYears()
    {
        Console.WriteLine("The dog is {0} years old in human years.", Age * 7);
    }
}

同じことを行う 2 つのアプローチがあります (アプローチ A と B)。スケーラビリティと読みやすいコードの観点から、あるアプローチを別のアプローチよりも優先する理由はありますか? アプローチ A の利点の 1 つは、このメソッドが Dog クラスのすべてのインスタンスで使用できることです (非常に素晴らしく、スケーラブルで、再利用可能で保守可能ですが、デバッグするときは、異なるクラス間を移動する必要があることを意味します (VS は1 つのファイルだけですべてを表示するのではなく、別のファイルにジャンプするなど)。

何かご意見は?

デイブ

4

9 に答える 9

7

クラス Dog にメソッドを用意したいと思います。

public int GetAgeInHumanYears()
{
    return Age*7;
}

そして、好きなフォーマット文字列でメインからこのメソッドを呼び出します。

于 2012-07-19T13:37:43.683 に答える
4

デバッグするときは、1つのファイルですべてを表示するのではなく、異なるクラス間を移動する必要があることを意味します(VSは異なるファイルにジャンプする必要があります)。

すべてのキーが1つの巨大なキーリングにありますか?すべての紙のファイルが机の上に山積みになっていますか?

メソッドをそれらが属するクラスに分けます。犬の年(または一般的に動物の年)から人間の年に変換するには、実際には3番目のクラスが必要かもしれません。すべてを1つ(またはいくつか)のクラスに含めると、再利用、保守性(デバッガーでプログラムを実行して、プログラムが何をしているのかを理解する必要があります)、および拡張性が制限されます。

于 2012-07-19T13:45:45.533 に答える
4

この場合、Dog オブジェクトに固有の機能であるため、メソッドはクラス (Dog) にある必要があります。

ちなみに、犬 -> 人間の年齢は単純な幾何学的な乗算ではありません。犬が年をとるにつれて曲線が滑らかになり始めるため、乗数は減少します。

犬の年

于 2012-07-19T13:42:07.267 に答える
3

デイブ、それは分離の問題です。Catクラスを追加する場合はどうなりますか?DisplayCatYearsという新しいメソッドを追加しますか?Dogクラスにある場合は、これに共通のインターフェイスを抽出し、ポリモーフィズムを利用して、動物の年齢を書き込む1つのメソッドをパラメーターとして渡すことができます。

さらに、プログラムが数画面の長さを超え、すべてが1つのファイルに含まれる場合、快適に感じるとは思いません。

于 2012-07-19T13:45:47.477 に答える
3

このアプローチはさらに優れています。クラスは直接何も出力していないためです。そのため、すべてがmainクラスによって制御されます。これにより、コードが何をしているかを読むのがずっと簡単になります。

class Program
{
    static void Main(string[] args)
    {
        Dog dog = new Dog() { Age = 4 };

        //This approach (version A)
        Console.WriteLine(dog.DisplayDogYears());

        Console.ReadKey();
    }


}

public class Dog
{
    public int Age { get; set; }

    public String DisplayDogYears()
    {
        return("The dog is {0} years old in human years.", Age * 7);
    }
}
于 2012-07-19T13:39:22.707 に答える
2

ベストプラクティスでは、各クラスを独自に設定することも示されているため、Dogクラスはアプリケーションの主要部分には含まれませんが、個別に保持されます。このロジックにより、そのクラスに関連する各メソッドをクラス内に配置するのが最適です。たとえば、20のクラスがあり、それぞれが年齢の計算方法が異なる20の動物がいる場合、20のクラスすべてと20のメソッドすべてを同じページにランダムにスローしますか?はい?さて、あなたに何か問題があります!

コードをクリーンでアクセスしやすくし、各クラスを独自に、各クラスをその中のそのクラス専用にする必要があります。たとえば、犬のクラスは猫の年がどのように計算されるかを知る必要はなく、それ自体とは無関係です。したがって、猫のクラスの猫の年、犬のクラスの犬の年、

これは、よりきれいで、使いやすく、読みやすく、再利用性にも優れています。別のプロジェクトで犬のクラスを使用したいとすると、最初にクラスを切り取ってから、コードの行を調べて、クラスに必要なすべてのメソッドを探す必要があります。それらがすべて1つの場所にある場合は、コーディングが高速化され、より大きな課題に進むことができます。

再利用を容易にするために、再利用する予定のクラスは共有ライブラリ内にある必要があることについても言及しません。

于 2012-07-19T13:46:25.663 に答える
2

それは本当に好みの問題です。

私はこれの残りの部分をひどく表現しているかもしれませんが、あまり深入りすることはありません:

考慮すべきいくつかの要因があります。

  • 可読性
  • コードの再利用
  • それを維持しなければならない貧弱な保守プログラマー。(しかし、それはおそらく読みやすさです)

この例では、すべての要因が Dog クラスにあることを示していると思います。

コード内のクラスは、実際のオブジェクトを反映する必要があります。

  • 読みやすさ: 私にとって、犬には年齢と犬年があるので、それは犬の所有物であるべきです。(それはオプションCです-質問には表示されていません)呼び出し元プログラムのメソッドではありません。
  • コードの再利用: Dog クラスを使用する必要があり、Dog Years で年齢を取得する必要がある別のアプリを作成する場合は、コードを書き直す必要があります。

要するに、実生活からコードオブジェクトへのマッピングは、犬の年が呼び出しプログラムではなく犬の一部であるということです。

于 2012-07-19T13:41:39.237 に答える
0

依存します、

メソッドをさまざまなクラスで呼び出すことができるようにする必要がありますか?つまり、再利用可能にする必要がありますか?Aを選択します。

1つのクラス/メソッド使用Bでのみ呼び出されていますか?

于 2012-07-19T13:58:29.990 に答える
0

Dogクラスをクラスから切り離しますが、クラスが独自の年齢を表示Consoleできるようにします。Dog

public class Dog
{
    public int Age { get; set; }
    private int dogYears { get { return Age * 7; } }

    public void DisplayDogYears(TextWriter writer)
    {
        writer.WriteLine(
            "The dog is {0} years old in human years.", 
            dogYears);
    }
}

次に、犬の年を any に表示できますTextWriter

static void Main(string[] args)
{
    var dog = new Dog { Age = 4 };

    // This will output to the console
    dog.DisplayDogYears(Console.Out);

    // This will output to the 'sb' StringBuilder
    var sb = new StringBuilder();
    dog.DisplayDogYears(new StringWriter(sb));
}
于 2012-07-19T13:52:15.847 に答える