0

これは以下の質問で、私のコードが正しいかどうか疑問に思っていました。間違っている場合は修正してもらえますか? ありがとう:

ゴールドカードクーポンのルール:

  • 残高が $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

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

if statament が最初にチェックインされるため、'balance > 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

ランダムな Web フォーラムを使用してコードの正確性を検証しないでください。

(自動化された) テスト (つまり、単体テスト) を使用して、コードの正確性を検証する必要があります。そのためのテストです。単体テストでは、基本的に、コード (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 に答える