功能编程,SRP,可测试性以及具有静态和实例可变字段的类

时间:2012-08-07 18:46:26

标签: unit-testing functional-programming functional-testing solid-principles single-responsibility-principle

我希望我能正确地说出这个问题。在处理具有静态和实例可变字段的类中的状态和测试能力时,我有一个问题。

由于静态字段的生命周期/范围不同,静态字段是否构成不同的类/责任/实例?

如果是这样的话:那么实例字段也不应该是一个单独的类/数据结构吗?

然后:如果是这样的话,那么所有类都不应该是无状态只接收它们对构造的依赖,那么它们应该都是不可变的吗?

最后,这是否意味着函数式编程也是进行面向对象编程的正确方法?

1 个答案:

答案 0 :(得分:3)

你不应该有(真的)可变的静态字段。这是糟糕的设计。功能编程使事情变得更容易。我会将这些问题分开:

  • 什么是数据,应该只有必要的代码来在类中操作它。比如“string”“Integer”“Person”,这些是实体
  • 什么操纵数据,取决于数据,但不应该有内部状态(格式化程序等)
  • 什么驱动执行,通常必须有一些内部状态,但它可以通过调用携带,或者像“配置”一样 数据库连接,请求等。这是来自活动的 请求,或者是纯配置(注入)
  • 什么观点的结果(纯粹的观点)本身应该是无国籍的,国家应该用上下文喂养它
  • 然后在它们之间有胶水,通常是毛茸茸的例外......最小化。

等。

可测试性

  • 数据应该可以模拟到假数据库。
  • “什么操纵数据”应该很容易测试,因为它是无状态的。
  • 上下文中包含的状态很容易被嘲笑。
  • “什么驱动执行”应该很容易测试,因为依赖项是可注入的,你可以逐个测试它。
  • 视图很容易测试,因为模拟状态可以输入它。困难来自实际验证“它看起来像什么”,但这取决于gui自动化或人类测试人员。

本质上,如果数据库(磁盘)和请求层(web,ui,等等)符合要求,所有这些都可以以功能方式完成。在实践中,您尝试在漂亮和功能性之间进行“纯粹”部分,并使用设计模式来保护它免受外部污垢的影响。