0

多項式を定義する Term クラスがあります。

public class Term
{
    final private int coef;
    final private int expo;

    private static Term zero, unit;

    static
    {
        try
        {
            zero = new Term(0, 0); // the number zero
            unit = new Term(1, 0); // the number one
        }
        catch (Exception e)
        {
            // constructor will not throw an exception here anyway
        }
    }

    /**
     * 
     * @param c
     *            The coefficient of the new term
     * @param e
     *            The exponent of the new term (must be non-negative)
     * @throws NegativeExponent
     */
    public Term(int c, int e) throws NegativeExponent
    {
        if (e < 0)
            throw new NegativeExponent();
        coef = c;
        expo = (coef == 0) ? 1 : e;
    }

    final public static Term Zero = zero;
    final public static Term Unit = unit;

    public boolean isConstant()
    {
        boolean isConst = false;
        if (this.expo == 0)
        {
            isConst = true;
        }
        return isConst;
    }
}

そして、私は次のようにJUnitテストを持っています:

 /*
 *      const1      isConstant(zero)        =>      true    (0,0)
 *      const2      isConstant(unit)        =>      true    (1,0)
 *      const3      isConstant(0,5)         =>      true
 *      const4      isConstant(5,1)         =>      false
 */

 @Test 
 public void const1() throws TError { assertTrue(Term.Zero.isConstant()); }

 @Test 
 public void const2() throws TError { assertTrue(Term.Unit.isConstant()); }

 @Test 
 public void const3() throws TError { assertTrue(new Term(0,5).isConstant()); }

 @Test 
 public void const4() throws TError { assertFalse(new Term(5,1).isConstant()); }

テスト 2 と 4 は正常にパスしますが、テスト 1 と 3 は失敗として表示され、「ゼロ」が多項式を (0,0) として定義し、もう一方が (0,5) として定義している理由がわかりません。 . したがって、私の考えでは、指数が 5 であるため、1 番目のテストでは緑色のチェックマークが表示され、3 番目のテストでは赤いクロスが表示されるはずです。

何か案は?

4

2 に答える 2

2

コンストラクターを確認してください。

public Term(int c, int e) throws NegativeExponent{
    if (e < 0) throw new NegativeExponent();
    coef = c;
    expo = (coef == 0) ? 1 : e;
}

の場合coef == 0、expには。が割り当てられ1ます。

これはそうzeroでは(0,1)ありません(0,0)。これが、以下のようなテスト結果の理由です。

    const1 -> false as expo = 1-->failure as expecting true
    const2 -> true as expo = 0 -->success as expecting true
    const3 -> false as expo = 5.-->failure as expecting true
    const4 -> false as expo = 1.-->success as expecting false

編集: テストケースに合格するようにコードを逆修正するには、コンストラクターを次のように更新できると思います。

public Term(int c, int e) throws NegativeExponent{
    if (e < 0) throw new NegativeExponent();
    coef = c;
    expo = (c == 0 && e != 0) ? 0 : e;
}

ここでは、コンストラクターを更新して0に設定しました。これは、coef0のexpoが重要ではないため0expoの場合です。coef

于 2012-11-16T02:48:52.580 に答える
1

Yogendra は、最初のテストが失敗する理由について説明しました。new Term(0, 5) には 5 の expo があり、coef の 1 b/c に置き換えられますが、1 はまだ 0 ではないため、(少なくとも私にとっては) const3() は失敗します。 new Term(0, 5 ) は定数ではありません。

あなたが尋ねたわけではありませんが、将来のための一般的な Java ポインターもいくつか提供します...

1) 静的定数にはすべて大文字を使用する

 public static final Term ZERO = new Term(0, 0);
 public static final Term UNIT = new Term(1, 0);

これは、Java コミュニティが期待する規則にすぎません。

2) テスト ケースに意味のある名前を付けます。テスト ケースの強力な用途の 1 つは、その時点での仮定のドキュメントとしても機能することです。仲間の開発者に何も伝えない const1() ではなく、zeroShouldBeAConstant() のようなわかりやすい名前を使用してください。これは、あなたのコードを次に見る人に、このシステムでは Zero を定数と見なす必要があることを伝えます。

3) ブール変数を返すときはいつでも、ステートメントを返すことを検討してください。以下の関数をあなたの関数と比較して、どちらが読みやすいか教えてください:

public boolean isConstant()
{
   return expo == 0;
}

コードが少なくなり、読みやすくなっています。

幸運を!

于 2012-11-16T02:58:00.323 に答える