我的C#计算是对的吗?

时间:2012-11-01 08:36:00

标签: c#

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

金卡优惠券规则:

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

代码:

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 个答案:

答案 0 :(得分:3)

我建议您查看unit testing.

使用测试框架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;
    }
}

答案 1 :(得分:2)

您无需检查'余额&gt; 2500',因为它首先检查是否有statament。

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;

}

答案 2 :(得分:2)

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

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

以下是使用NUnit test framework

的示例
[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));             
    }
}

答案 3 :(得分:1)

最后一个应该是

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

如果你的年份恰好是2,你就会得到0。

-update-这样根据你的规格,但是你的规格没有提到什么时候金额恰好是2500.它只谈到2500或更低。