最佳实践:默认使用受保护或私有方法和测试驱动开发(TDD)

4

类似问题

我的问题

很多人都认为只有在有理由使用保护方法时才应该使用它们。测试驱动开发模型如何考虑这个问题?(特别是涉及到伪造对象时。)我有一个朋友是TDD和BDD的忠实粉丝,是一名C#开发者,他告诉我他几乎从不使用private关键字。在他说完后,我一直将其用于字段,但默认所有方法都使用protected。StackOverflow上的一些人也同意默认情况下应该使用protected,请问有些人能否权衡一下这个问题?使用protected的最好理由是什么(因为上面的线程解释了不使用的原因)?

编辑:根据Oded的评论,使用protected作为默认值和开放封闭原则有什么影响?(一个类应该对扩展开放,对修改关闭)


2
除了TDD之外,您可能还想考虑OCP(开闭原则)。 - Oded
@Oded 谢谢,那绝对是相关的。 - Keith Pinson
2
为什么我要将除最不可访问选项之外的任何东西都设为默认值?将所有内容设为protected/public的好处是什么?测试只需要通过其公共接口来操作对象。测试将帮助你进行接口发现。 - Gishu
我也认为单元测试应该覆盖对象的接口,而不是内部实现。 - Vengarioth
1个回答

10
以下是我认为的最佳实践,我在开发中都会采用,并向所有客户建议:
  1. 从测试(或者如果你使用BDD,则是规范)开始。从测试中提取的生产类和方法应该是public
    • 注意:如果你在.NET中开发,你可能希望考虑使用 internal 关键字(并添加 InternalsVisibleTo 程序集属性到你的生产程序集中,以便让你的测试项目可以使用代码)。然后,只有在另一个生产程序集依赖它时才将其设置为public
  2. 在TDD的重构阶段中创建的任何方法都应该设为private
  3. 仅当派生的生产类需要时,将帮助方法设置为protected
  4. 在重构阶段创建的任何方法(现在是私有或受保护的),如果你需要在另一个生产类中使用,就应该将它们提取到一个帮助类中,并将其设为public(或在支持这个概念的任何语言中设为internal)。
  5. 如果在另一个程序集中需要该帮助类,则:
    • 如果其他程序集已经依赖于帮助类的程序集,请将帮助类设置为public(如果它还没有)。
    • 如果其他程序集没有依赖于帮助类的程序集,请将帮助类提取到一个帮助程序集中(最佳选项或新选项),并将其设为public。如果原始程序集还没有引用新的帮助程序集,请确保引用它。
这基本涵盖了所有场景。
希望对你有所帮助。

我会写博客的,先生,这是一条实用的建议。 :) - ElvisLives

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接