1

次のようなクラスがあります。

class Date
{
    // Field variables
    private int day;
    private int month;
    private int year;

    // Default constructor
    public Date()
    {
        year = 2015;
        day = 0;
        month = 0;
    }

    // Overloaded constructor
    public Date(int _day, int _month, int _year)
    {
        setDay(_day);
        setMonth(_month);
        setYear(_year);
    }

    // Accessors
    public int getDay()
    {
        return day;
    }

    public int getMonth()
    {
        return month;
    }

    public int getYear()
    {
        return year;
    }

    // Mutators
    public void setMonth(int _month)
    {
        if (_month > 0 && _month <= 12)
        {
            month = _month;
        }
    }

    public void setYear(int _year)
    {
        if (_year >= 1700 && _year <= 2015)
        {
            year = _year;
        }
    }

    public void setDay(int _day)
    {
        if (_day > 0 && _day <= DateTime.DaysInMonth(year, month))
        {
            day = _day;
        }
    }

setDay()機能していない部分は、メソッド内で私の一日を検証しています。DateTime.DaysInMonth(year, month)(このメソッドは、うるう年と 2 月を考慮して、特定の年の特定の月の日数をチェックします) は、ユーザー/アプリケーション データが通過する前に、既定のコンストラクタ値 0 から呼び出して、1 ~ 12. DateTime を使用してすべてを検証することはできません。ユーザーが日または月に 0 の値を入力できるようにアプリケーションが設定されているため、最終的な形式で日または月が出力されないからです。

1 つの提案は、セッターを非公開にし、ユーザーが日、月、年を任意の順序で設定できるようにする 1 つの公開 setDate メソッドを作成することでした...しかし、私はそれを正しく実装できないようです:

public void setDate(int _day, int _month, int _year)
{
    day = _day;
    month = _month;
    year = _year;
}

これは、プライベート セッターでの検証をスキップするだけだからです。

正直なところ、これを従来とは異なる方法で機能させる方法はたくさんありますが、適切なクラス設計規則に適合するようにすべてをクリーンアップするのに助けが必要です..

4

2 に答える 2

0

ここで受け取った他の素晴らしい回答により、元の質問で言及した「提案」を理解したので、これを投稿しています。誰かがこのようにやりたい場合に備えて。

コンストラクターと他のすべてを同じ順序に保ちます。 setDate() のパブリック セッターを次のように作成すると、次のようになります。

public void setDate(int _day, int _month, int _year)
{
    setYear(_year);
    setMonth(_month);
    setDay(_day);
}

元のセッターをプライベートに変更し、フィールド変数に値を直接割り当てるのではなく、パブリック メソッドのメソッド呼び出しを介して( と の両方setYear()をのsetMonth()前に呼び出す必要があるため)、指定した任意の順序で呼び出すことができます。setDay()

于 2015-02-10T21:05:08.987 に答える