0

所以这是下面的问题,想知道我的代码是否正确,如果我错了,你们能纠正我吗?谢谢:

金卡券规则:

  • 如果余额低于 $2500,则优惠券为余额的 3%
  • 如果余额超过 2500 美元,优惠券是 4% 如果他们的年限少于 2 年
  • 如果余额超过 2500 美元,则优惠券为 5%,如果他们的年限为 2 年或以上

代码:

public class GoldCard : Card
{
    int year;

    GoldCard(string id, string name, double balance, int year)
        : base(id, name, balance)
    {
        this.year = year;
    }

    public int Year
    {
        get { return year; }
        set { year = value; }
    }

    public double CalcCouponValue()
    {
        double Rate = 0;
        if (balance < 2500)
        {
            Rate = 0.03 * balance;
        }
        else if (balance > 2500 && year < 2)
        {
            Rate = 0.04 * balance;
        }
        else if (balance > 2500 && year > 2)
        {
            Rate = 0.05 * balance;
        }

        return Rate;

    }
4

4 回答 4

3

我建议你看看单元测试。

使用测试框架nUnit,您可以编写如下测试:

[TestFixture]
public class GoldCardTests
{
    [TestCase(2000, 1, 2000 * 0.03)]
    [TestCase(2500, 1, 2500 * 0.04)]
    [TestCase(2500, 2, 2500 * 0.05)]
    public void TestNameTest(double balance, int year, double expected)
    {
        var goldCard = new GoldCard("", "", balance, year);
        double calcCouponValue = goldCard.CalcCouponValue();
        Assert.AreEqual(expected,calcCouponValue);
    }
}

使用上面的代码,您可以单独测试 GoldCard 类并通过余额和年份的组合并测试结果是否符合预期。如果年份为负数,您还可以测试是否会引发异常。这与您在此处的帖子中写下的规则非常相似,但好处是测试仍然存在,如果您将来更改某些违反规则的内容,您将收到错误消息。测试未通过,因此您的计算(或测试)中存在错误

public class GoldCard : Card
{
    public GoldCard(string id, string name, double balance, int year)
        : base(id, name, balance)
    {
        this.Year = year;
    }

    public int Year { get; set; }

    public double CalcCouponValue()
    {
        double rate = 0;
        if (Balance < 2500)
        {
            rate = 0.03*Balance;
        }
        else if (Balance > 2500 && Year < 2)
        {
            rate = 0.04*Balance;
        }
        else if (Balance > 2500 && Year > 2)
        {
            rate = 0.05*Balance;
        }
        return rate;

    }
}

public class Card
{
    public string Id { get; set; }
    public string Name { get; set; }
    public double Balance { get; set; }

    protected Card(string id, string name, double balance)
    {
        Id = id;
        Name = name;
        Balance = balance;
    }
}
于 2012-11-01T08:40:12.150 回答
2

您不需要检查是否“余额 > 2500”,因为它会先检查是否存在。

public double CalcCouponValue()
{
    double Rate = 0;
    if (balance < 2500)
    {
        Rate = 0.03 * balance;
    }
    else if ( year < 2)
    {
        Rate = 0.04 * balance;
    }
    else if ( year >= 2)
    {
        Rate = 0.05 * balance;
    }

    return Rate;

}
于 2012-11-01T08:41:37.160 回答
2

您不应该使用随机的网络论坛来验证您的代码的正确性。

您应该使用(自动)测试(即单元测试)来验证您的代码的正确性。这就是测试的目的。使用单元测试,您基本上要做的是定义和验证您在代码 (c#) 中提到的规则。然后,您可以随时运行这些测试,并且一旦您对代码进行了更改,无论它是否破坏了您现有的某些功能(即现有规则),都可以立即获得反馈。

这是使用NUnit 测试框架的示例:

[TestFixture]
public class GoldCardTests
{
    [Test]
    // balance, year, expected result
    [TestCase(2400, 0, 72)]
    [TestCase(2500, 0, 72)] // you did not define a rule for this case
    [TestCase(2600, 1, 104)] 
    // add more test cases so all rules are defined
    public void CalcCouponValue_should_calculate_correctly(double balance, double year, double expectedResult)
    {
         // arrange your test (sut == system under test)
         var sut = new GoldCard(null, null, balance, year);

         // act (execute the test)
         var actualResult = sut.CalcCouponValue();

         // assert (verify that what you get is what you want)
         Assert.That(actualResult, Is.EqualTo(expectedResult));             
    }
}
于 2012-11-01T08:46:19.117 回答
1

最后一个应该是

else if (balance > 2500 && year >= 2)
{
    Rate = 0.05 * balance;
}

或者,如果您的年份正好是 2,您将得到 0。

-更新-这种方式根据您的规格,但是,您的规格没有提及金额何时恰好是 2500。它只谈论或多或少 2500。

于 2012-11-01T08:40:08.583 回答