gpt4 book ai didi

oop - 为什么类 Money 通过示例扩展 Kent Beck 的 TDD 中的表达式?

转载 作者:行者123 更新时间:2023-12-04 15:28:58 26 4
gpt4 key购买 nike

我正在研究TDD by Example,到目前为止,我发现它是一本很棒的书。但有一点他告诉我们要写:

// in class Money:
Expression plus(Money addend) {
return new Money(amount + addend.amount, currency);
}

除非我们声明,否则不会构建:

class Money implements Expression {...

这对我来说真的没有意义。作者创建了 Expression 作为 Sum 的接口(interface),而 MoneySum 没有任何共同之处。后来,他为两个类添加了共同的方法 reduce(),但在 Money 中 reduce 仅返回 this

Making Money implement Expression 只是从 plus() 方法中消除错误的最省力的途径,但它填补了带有不必要信息的代码(由于这个决定,它必须实现 reduce())并增加熵。

我没有考虑太多,但做这样的事情不是更干净吗?

class Money {        
Money plus(Money addend) {
return new Money(amount + addend.amount, currency).reduce();
}
}
// edited this, it previously returned Expression

编辑:在下一章中,作者在另一个类(名为 Bank)中实现了一个 reduce() 方法,该方法在货币之间转换 Money。我仍然觉得这是一个奇怪的解决方案,SumExpression 名称暗示我们应该有一个转换表达式类来代替这个任务。作者可能打算做的是使用递归来添加不同货币的钱。无论哪种方式,在我看来他都做了一些超前的计划,这似乎与书中介绍的 TDD 不相容。

最佳答案

提前规划

TDD 并不禁止提前计划。这个过程是关于获得对你的计划的快速反馈,而不是浪费数天(或数周)来制定详尽的计划,结果却看到它们“无法在与现实的接触中幸存下来”(用 Helmuth von Moltke 的话说)。提前考虑是可以的。

不过,Kent Beck 在第 17 章中透露这不是他的第一个牛仔竞技表演:

"I have programmed money in production at least three times that I can think of. I have used it as an example in print another half-dozen times. I have programmed it live on stage [...] another fifteen times. I coded another three or four times preparing for writing [...] Then, while I was writing this, I thought of using expression as a metaphor and the design went in a completely different direction than before."

所以,如果您认为他在作弊:是的,他是。不过,他对此持开放态度。我认为动机是提出一个令人信服的例子。他还写道,这部分是基于对该书的早期评论。

关于API

这并不能解释为什么代码看起来像这样,但这是有原因的。它实际上是一个不错的 API。

为什么你不能写类似return new Expression(amount + addend.amount, currency).reduce()这样的东西?

你不能,因为 reduce 方法不是空的。它需要争论。您必须同时提供银行(持有货币兑换率)和目标货币。

请记住代码正在解决的问题。人们总是弄错这个问题,我认为 Kent Beck(无意中)通过命名示例 Money 加剧了这种混淆。

问题不是为金钱建模,而是为不同货币的投资投资组合建模。如果您有 25.000 美元和 10.000 瑞士法郎的投资组合,将其简化为单一货币会隐藏重要细节。通过多种货币的投资组合,您可以分散风险。投资组合所有者将希望看到其投资组合的不止一种 View 。有时,他们希望看到按货币分组的投资组合,而在其他时候,他们希望看到以单一货币呈现的投资组合的“当前总值(value)”。

书中的 API 支持这两种 View 。

底层“隐喻”被称为表达式 的原因是 API 只是一个专门的表达式树。不过,结果相当不错,因为它是合法的。限于书中介绍的子类型,it informally gives rise to a monoid .

关于oop - 为什么类 Money 通过示例扩展 Kent Beck 的 TDD 中的表达式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61667891/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com