1. 防御式编程
防御式编程的主要目的是保证一段代码在不可预见的情况下工作,提高理解力和可预测性,并简化维护。 为了保护程序,确保每个方法(以及类,变量,属性适用):• 有一个明确和单一的目的
• 有一个明确的意图(即匹配的实现) • 没有任何意外的副作用(即它不应该执行的操作是不期望的) • 是简短的 • 可测试 • 验证输入 • 异常处理 • 有明确的协议 • 具有合理的返回值 • 没有任何泄漏的抽象(内部细节和限制应保持内部) • 使用注释(适度)解释为什么做(如果你觉得你需要解释,你应该考虑如何做来代替重构代码)此外,确保你的代码遵循最佳实践指南,方法和编程技术,使其他程序员(和自己在一段时间后)很容易地掌握如何工作。
2. 单元测试
单元测试会减少错误的生产数量,使其风险较小的改变和重构代码,将防止任何回归重演。如果做得对,也可以让你写出更好的代码。当然,它可能是乏味的工作,需要时间来写,但它是完全值得的。在这里阅读更多关于单元测试:
3. 坚持SOLIOD原则
S.O.L.I.D.是一个缩写,说明面向对象的编程和设计的五个基本原则。这些原则,当结合在一起,使一个程序员开发的软件,易于维护和扩展。他们也很容易让开发者重构代码,避免代码的气味。S.O.L.I.D代表(很简单地说):
单一责任原则
每个类都应该有一个单独的责任,由软件提供的功能的一部分,而这个责任应该完全由这个类封装。如果一个类有一个以上的“理由改变”(即它试图解决许多问题),它应该被拆分。
开闭原则
应该有可能扩展一个类的功能(打开),但不修改类本身(关闭)。
这是一个,什么是“封闭”的例子:一个方法(makejuice)是以对象作为参数,实现特定的接口(ifruit”)。如果做的好,我们应该能够创造新的水果种类和运行它,但无需改变实施的方法makejuice,这意味着它是“封闭”。
Liskov替换原则
在程序中的对象应该是可替换的,而不改变程序的正确性的实例。
接口隔离原则
分离接口,这是从大变为更小,更具体的接口,因此,任何实施只需要知道对他们感兴趣的方法。
依赖倒置原则
如果一个类X依赖于另一个类Y,确保依赖于通过一个接口来完成。这意味着,你可以用另一个实现替换Y,而不必更改X。
4. 依赖注入/反转控制
控制的反转(IoC)是一种模式,你让一个框架提供了类的依赖实例。依赖注入是IoC的一个子类型,其中的依赖关系是通过构造函数来输入的。DI / IoC有几个好处:
- • 它分离代码,这反过来又增加了可重用性,使得它更容易测试,让你在更高层次上管理实例化对象 • 它是专门侧重于任务模块 • 更换一个模块时,它可以防止副作用 • 它使代码可测试 • 它促进良好的面向对象设计
在这阅读更多关于DI / IoC:
5. 使您的对象尽可能不改变
最后一次练习是从函数式编程中借用的东西—你永远都不能改变物体的思想。如果一个对象需要改变,它应该被重建。它们有几个好处:
- • 对象是线程安全的 • 它可以防止无效状态的对象 • 让外部代码改变你的对象的状态使代码难以阅读和掌握 • 不变性是使得它更容易去写,和使用代码的原因 • 不变性使得它更容易并行程序,同时对象之间没有冲突 • 对不可变对象的引用可以被缓存,因为它们不会改变
这是一个原则,可能很难生存,但你可以用以下的作为一个经验法则:除非类应该有一个很好的理由让他们变…如果一个类不能一成不变,尽可能限制它的易变性。