TranslateProject/published/202305/20210204 How to implement business requirements in software development.md
2023-05-31 23:15:39 +08:00

129 lines
5.6 KiB
Markdown
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

[#]: collector: (lujun9972)
[#]: translator: (toknow-gh)
[#]: reviewer: (wxy)
[#]: publisher: (wxy)
[#]: url: (https://linux.cn/article-15860-1.html)
[#]: subject: (How to implement business requirements in software development)
[#]: via: (https://opensource.com/article/21/2/exceptional-behavior)
[#]: author: (Alex Bunardzic https://opensource.com/users/alex-bunardzic)
ZOMBIES如何在软件开发中实现业务需求
======
> 完善你的电商应用,使它能够正确处理业务规则。
![][0]
在前面的文章中,我已经解释了为什么将编程问题看作一整群丧尸来处理是错误的。我用 ZOMBIES 方法来解释为什么循序渐进地处理问题更好。
ZOMBIES 表示以下首字母缩写:
- **Z** 最简场景Zero
- **O** 单元素场景One
- **M** 多元素场景Many or more complex
- **B** 边界行为Boundary behaviors
- **I** 接口定义Interface definition
- **E** 处理特殊行为Exercise exceptional behavior
- **S** 简单场景用简单的解决方案Simple scenarios, simple solutions
在系列的前三篇文章中,我展示了 ZOMBIES 方法的前五项。第一篇中 [实现了最简场景][2],它为代码提供了最简可行路径。第二篇文章中执行了 [单元素场景和多元素场景上的测试][3]。第三篇中介绍了 [边界和接口][4]。在本文中,我将带你了解倒数第二个方法:处理特殊行为。
### 处理特殊行为
在开发一个电子购物应用时,你需要从产品负责人或赞助商那里了解需要采用什么销售策略。
毫无疑问,与任何电子商业活动一样,你需要通过制定销售策略来诱导顾客进行消费。假设有如下的销售策略:订单金额超过 ¥500 时可以享受一定的折扣优惠。
现在将这个销售策略转换为可运行期望:
```
[Fact]
public void Add2ItemsTotal600GrandTotal540() {
        var expectedGrandTotal = 540.00;
        var actualGrandTotal = 0.00;
        Assert.Equal(expectedGrandTotal, actualGrandTotal);
}
```
这个正面样例表示的销售策略是,如果订单总额为 ¥600.00,那么 `shoppingAPI` 会将其减价为 ¥540.00。上面的代码伪造了一个失败验证用例。现在修改它,让它能够通过测试:
```
[Fact]
public void Add2ItemsTotal600GrandTotal540() {
        var expectedGrandTotal = 540.00;
        Hashtable item = new Hashtable();
        item.Add("00000001", 200.00);
        shoppingAPI.AddItem(item);
        Hashtable item2 = new Hashtable();
        item2.Add("00000002", 400.00);
        shoppingAPI.AddItem(item2);
        var actualGrandTotal = shoppingAPI.CalculateGrandTotal();
        Assert.Equal(expectedGrandTotal, actualGrandTotal);
}
```
在这个正样例中,你向购物框加入一件价值 ¥200 的商品和一件价值 ¥400 的商品,使总价达到 ¥600 。当调用 `CalculateGrandTotal()` 方法时,你期望总价是 ¥540。
这个微测试能够通过吗?
```
[xUnit.net 00:00:00.57] tests.UnitTest1.Add2ItemsTotal600GrandTotal540 [FAIL]
  X tests.UnitTest1.Add2ItemsTotal600GrandTotal540 [2ms]
  Error Message:
   Assert.Equal() Failure
Expected: 540
Actual: 600
[...]
```
很可惜,它失败了。你期望的结果是 ¥540但计算结果为 ¥600。为什么会这样呢那是因为你还没有告诉系统在订单总价大于 ¥500 时怎么进行折扣计算。
现在来实现折扣计算逻辑。根据上面的正样例可知,当订单总价为 ¥600超过了营销策略的阈值 ¥500期望的最终总价为 ¥540。也就是说系统需要从订单总额中减去 ¥60。刚好是是原订单总价的 10%。因此该销售规则就是当订单总额超过 ¥500 时享受九折优惠。
`ShippingAPI` 类中实现该处理逻辑:
```
private double Calculate10PercentDiscount(double total) {
        double discount = 0.00;
        if(total > 500.00) {
                discount = (total/100) * 10;
        }
        return discount;
}
```
首先,检查订单总额是否大于 ¥500 。如果是,则计算出总额的 10%。
你还需要告诉系统怎么从订单总额中减去 10%。改动非常直接:
```
return grandTotal - Calculate10PercentDiscount(grandTotal);
```
到此,所有测试都能够通过。你又一次享受到系统处于稳态的欢愉。你的代码通过处理特殊行为实现了需要的销售策略。
### 最后一步
现在我已经介绍完 ZOMBIE 了,只剩下 S 了。我将会在最后一篇中介绍它。
*题图MJ/7f8bf5d2-54ce-4d6e-9dbf-13abf6df966a*
--------------------------------------------------------------------------------
via: https://opensource.com/article/21/2/exceptional-behavior
作者:[Alex Bunardzic][a]
选题:[lujun9972][b]
译者:[toknow-gh](https://github.com/toknow-gh)
校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
[a]: https://opensource.com/users/alex-bunardzic
[b]: https://github.com/lujun9972
[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/team_dev_email_chat_video_work_wfm_desk_520.png?itok=6YtME4Hj (Working on a team, busy worklife)
[2]: https://linux.cn/article-15808-1.html
[3]: https://linux.cn/article-15817-1.html
[4]: https://linux.cn/article-15859-1.html
[5]: http://www.google.com/search?q=new+msdn.microsoft.com
[0]: https://img.linux.net.cn/data/attachment/album/202305/30/094226xz66t662t42auuht.jpg