0

Easter という名前のクラス (以下を参照) と EasterTester という名前のテスター クラス (これもその下) を作成して、それを実行し、年の値をプラグインしました。目標は、指定された年の復活祭の日曜日の月と日を計算するためのガウスのアルゴリズムを実装することです。

私のコードは正常に動作しますが、フォローしている本と少し混乱しています。最初のコード リンクの下部にある 2 つの getter メソッドは、「必要ない」ため実装しないように指示されています。私のコードが立っているので、私は間違いなくそれらを必要としています。それに関して私が見逃しているものはありますか?

さらに、次のように使用することをお勧めする「Easter Class Public Interface」がリストされています。

calculateEaster(int aYear): 文字列

「UML メソッドの構文は、メソッドが整数パラメータを取り、文字列を返すことを示しています。」私はこのコメントを理解していないため、これらのガイドラインに従うためにコードを編集する方法がわかりません。

誰かがジレンマ/質問について明確にすることができれば、私は非常に感謝しています!

コード: /** * * @author b_t * */

クラスイースター{

/**
 * @param n is the month
 * @param p is the day
 */
private int n;
private int p;

// Comments via Cay Horstmann's "Big Java" 4th ed. on page 169; p.4.19

// Let y be the year (such as 1800 or 2001).

/**
 * 
 * @param y this will hold the year that users enter
 */
Easter(int y) {

    // Divide y by 19 and call the remainder a. Ignore the quotient.
    int a = y % 19;

    // Divide y by 100 to get a quotient b and a remainder c.
    int b = y / 100;
    int c = y % 100;

    // Divide b by 4 to get a quotient d and a remainder e.
    int d = b / 4;
    int e = b % 4;

    // Divide 8 * b + 13 by 25 to get a quotient g. Ignore the remainder.
    int g = (8 * b + 13) / 25;

    // Divide 19 * a + b - d - g + 15 by 30 to get a remainder h. Ignore the quotient.
    int h = (19 * a + b - d - g + 15) % 30;

    // Divide c by 4 to get a quotient j and a remainder k.
    int j = c / 4;
    int k = c % 4;

    // Divide a + 11 * h by 319 to get a quotient m. Ignore the remainder.
    int m = (a + 11 * h) / 319;

    // Divide 2 * e + 2 * j - k - h + m + 32 by 7 to get a remainder r. Ignore the quotient.
    int r = (2 * e + 2 * j - k - h + m + 32) % 7;

    // Divide h - m + r + 90 by 25 to get a quotient n. Ignore the remainder.
    n = (h - m + r + 90) / 25;

    // Divide h - m + r + n + 19 by 32 to get a remainder p.
    p = (h - m + r + n + 19) % 32;

}
/**
 * 
 * @return n returns the month in which a given year's Easter Sunday will take place
 */
public int getEasterSundayMonth() {

    return n;
}
/**
 * 
 * @return p returns the day in which a given year's Easter Sunday will take place
 */
public int getEasterSundayDay() {

    return p;
}

}

テスタークラスは次のとおりです。

public class EasterTester {

public static void main(String[] args)

   {
      Easter myEaster = new Easter(2002);

      System.out.println("In 2002, Easter Sunday is: " + "month = " + myEaster.getEasterSundayMonth() + " and day = " + myEaster.getEasterSundayDay());

      Easter myEaster2 = new Easter(2012);

      System.out.println("In 2012, Easter Sunday is: " + "month = " + myEaster2.getEasterSundayMonth() + " and day = " + myEaster2.getEasterSundayDay());

   }
}
4

1 に答える 1

4

この本の UML の使用法は次のとおりです。

calculateEaster(int aYear): String

実際は、次のようなパブリック メソッドがあることを意味します。

public String calculateEaster(int aYear)

(ちなみに、パラメータ名はひどいものです。名前の前にa, an,myまたはの接頭辞を使用することを本が提案している場合はthe、無視してください...そうすれば、より良い本を入手できる可能性があります。)

インターフェイスは(Java構文で)よりもはるかに優れていると私は主張します

public LocalDate calculateEaster(int year)

... Joda TimeLocalDateクラスを使用します。それを使用したくない場合は、 ajava.util.Calendarまたは潜在的に aを返すようにしjava.util.Dateます。(これらのクラスはどちらも、その名前が意味するものを実際に意味するものではなく、どちらも理想的ではありませんが、ここまでです...)

String...本が推奨しているように返すのではなく。ただし、オブジェクトのインスタンスが何を意味するかという点では、基本的に違いがあります。あなたの場合、それは年の 1 日を表します (奇数ですが、どの年かは覚えていません)。この本の推奨事項は、インスタンスの状態があってはならないということですEasterCalculator。イースターの単一のインスタンスを表すのではなく、 を構築することになります。

余談ですが、このコードは悪いです:

/**
 * @param n is the month
 * @param p is the day
 */
 private int n;
 private int p;

Javadoc コメントは、1 つのフィールドを 2 つのパラメーターを持つメソッドであるかのように文書化しようとしています。有効な Javadoc の場合は、次のものが必要です。

/** The month of the year */
private int n;

/** The day of the month */
private int p;

ただし、フィールドに文書化が必要であるという事実は、それらの名前が不適切であることを示しています。代わりに彼らmonthに電話してみませんか?day

于 2012-09-24T06:20:49.680 に答える