我正在做一个项目,该项目在一个应该可以被其他人轻松扩展的框架中做很多不同的、非常复杂的事情。
起初,班级很大,做的事情很多。为了改变这些行为,您必须扩展这些类。这些方法都是虚拟的,不会改变对象的状态,所以很容易做到这一点。
但是随着系统的发展,框架最终会变成一系列单体对象,每个对象都有很长的继承链,这一点变得越来越清楚。这也导致了意外的依赖关系——一个抽象方法采用类 X 的集合来生成在基类中定义的对象 Y,这要求每个人都必须这样做,即使它对继承树的一半没有意义。这也导致了需要数十个单元测试才能使代码覆盖率超过 80% 的大量类,而且复杂性如此之大,以至于您不确定是否正确地涵盖了所有内容。很明显,这种设计会导致框架非常僵化和不灵活。
因此,我们按照 SRP 线重新设计了所有内容。您将拥有您的接口、一个基类,并且可能还有一个或多个实现类。每一个都组成执行整个过程的关键功能的不同对象。如果你想改变一个部分,你没有重写一个方法,你会产生另一个对象来扩展必要的接口/基类并以不同的方式执行它的工作。SRP 甚至被分解为类方法的参数和返回值。对于那些需要灵活的系统部分,而不是传递用于生成 Y 对象的 X 类的集合,创建了一个类来封装 Y 对象的生成过程。然后系统中的组件将传递这些生产者,将它们与其他生产者组合(生产者的责任),并最终使用它们来生产 Y。这允许创建不同类型的生产者,所有这些都可以完全按照相同的,尽管他们做了截然不同的事情。此举还大大减少了每个类的代码库,并使它们更容易测试。
我想说的是,作为一个新开发者,将所有内容分解到这个级别是非常困难的。您几乎必须编写一大堆泥巴,了解它的工作原理,然后将其重新设计为几个不同的组件,每个组件负责整体的一部分。