1

次の例は、書籍Programming in the Key of C#からのものです。

プログラムの最初の繰り返しは典型的な C の方法であり、次の生まれ変わりはよりオブジェクト指向です。このプログラムは、特定のイベントが発生した日付を計算する簡単な例です (12 月 31 日は 365 日、閏年の場合は 366 日です)。

using System;

class StructureAndMethodsTwo
{
    static void Main()
    {
        Date dateMoonWalk = new Date();

        dateMoonWalk.iYear = 1969;
        dateMoonWalk.iMonth = 7;
        dateMoonWalk.iDay = 20;

        Console.WriteLine("Moon walk: {0}/{1}/{2} Day of Year: {3}", 
            dateMoonWalk.iMonth, dateMoonWalk.iDay, dateMoonWalk.iYear,
            Date.DayOfYear(dateMoonWalk));
    }
}

struct Date
{
    public int iYear;
    public int iMonth;
    public int iDay;

    public static bool IsLeapYear(int iYear)
    {
        return iYear % 4 == 0 && (iYear % 100 != 0 || iYear % 400 == 0);
    }

    static int[] aiCumulativeDays = { 0, 31, 59, 90, 120, 151,
                                        181, 212, 243, 273, 304, 334 };

    public static int DayOfYear(Date dateParam)
    {
        return aiCumulativeDays[dateParam.iMonth - 1] + dateParam.iDay +
            (dateParam.iMonth > 2 && IsLeapYear(dateParam.iYear) ? 1 : 0);
    }
}

DayOfYearプログラムの次のバージョンは、次のようになるメソッドを除いて同じです。

public int DayOfYear()
{
return aiCumulativeDays[iMonth -1] + iDay+ (iMonth > 2 && IsLeapYear(iYear) ? 1:0);
}

最初のバージョンよりも OOP フレンドリーになっている 2 番目のバージョンで正確に何が起こっているのでしょうか? 最初の反復でDateメソッドによってタイプのオブジェクトが作成されていますか? DayOfYearメソッドのインスタンス バージョンが構造体のフィールドに直接アクセスできることは知っていますが、その明確な利点については認識していません。

4

3 に答える 3

1

2 番目のバージョンでは、静的コンテキストの日付パラメーターではなく、オブジェクト自体がすべての情報を提供しています。メソッドが、オブジェクトが何であるかについてパラメーターによって「通知」されるのではなく、オブジェクト自体のデータを使用している場合、それはよりオブジェクト指向です。

于 2012-09-21T14:59:21.470 に答える
1

年の日は、最初のバージョンで日付を作成していません。パラメータを評価しているだけです。2 番目のバージョンは、静的メソッド呼び出しではなく、クラスのインスタンスで動作するため、よりオブジェクト指向です。これにより、通常、物事がより整理され、オブジェクト指向になります。

于 2012-09-21T15:00:41.327 に答える
1

iYear, iMonth and iDay例 2 では、Date 構造体の内部変数を使用しています。最初の例では、不要な DayOfYearFunction に渡す Date オブジェクトの別のコピーを使用しています。

編集:

最初の例では、Date 構造体のインスタンスを使用し、それをパラメーターとして DayOfYear 関数に渡します。Date (dateParam) のインスタンスがスタックに割り当てられ、より多くのメモリを使用し、CLR からの追加のガベージ コレクション呼び出しが必要になります。クリーンアップが必要なとき。

パフォーマンスの問題: IMO では、わずかに多くのメモリが使用されますが、プログラムの性質上、パフォーマンスの問題はほとんど発生しません。これは単なる冗長パラメータです。

于 2012-09-21T15:01:01.000 に答える