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。

有任何想法吗?

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;
}

在这里,我将构造函数更新为设置expo为 0,如果coef为 0,因为 coef 0 的任何博览会都不重要。

于 2012-11-16T02:48:52.580 回答
1

Yogendra 介绍了您的第一次测试失败的原因。您的 const3() 失败(至少对我而言),因为 new Term(0, 5) 的 expo 为 5,它被 coef 的 1 b/c 取代,但 1 仍然不是 0 所以 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) 给你的测试用例起有意义的名字。测试用例的一个强大用途是它们可以兼作您当时假设的文档。而不是 const1() 告诉其他开发人员什么都没有,而是使用一个描述性的名称,如 zeroShouldBeAConstant()。这告诉下一个查看您的代码的人,零应该被视为该系统中的常数。

3) 每当您返回布尔变量时,请考虑只返回语句。将下面的函数与您的函数进行比较,并告诉我哪一个更具可读性:

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

它的代码更少,希望更容易阅读。

祝你好运!

于 2012-11-16T02:58:00.323 回答