"31天重构系列笔记是关于软件开发中的重构技巧的记录,由Sean Chambers创作并发布在Lostechies博客上。这个系列共有31篇,旨在提供每日一贴的重构建议和实践,主要关注WPF领域的开发。相关的代码示例托管在GitHub上的'schambers/days-of-refactoring'仓库中。"
重构是一种改善现有代码结构而不改变其外在行为的方法,以提高代码可读性、可维护性和设计质量。在这个系列的笔记中,作者 Sean Chambers 分享了如何通过一系列小步骤改进代码,使其更高效、更易于理解和测试。其中一个具体的重构案例是关于封装集合(Encapsulate Collection)的。
在提供的代码片段中,展示了`Order`类,它包含了`_orderLines`私有成员,类型为`List<OrderLine>`,用来存储订单行。`Order`类提供了`OrderLines`属性公开对集合的访问,以及`AddOrderLine`和`RemoveOrderLine`方法来操作集合。然而,这样的设计存在一些问题:
1. **直接暴露内部集合**:`OrderLines`属性返回的是集合的引用,这允许外部代码直接修改集合,违反了封装原则。外部代码可以添加、删除或更改订单行,而无需经过`Order`类的控制,这可能导致状态不一致和错误。
2. **依赖具体实现**:`_orderLines`使用了`List<T>`的具体实现,而不是接口如`IList<T>`。这意味着如果将来需要更换其他类型的集合,代码将需要大量修改。
为了改善这种情况,可以进行以下重构:
- **封装集合访问**:将`OrderLines`属性改为只读,提供公共的`AddOrderLine`和`RemoveOrderLine`方法来控制对集合的修改。这样可以确保所有对集合的操作都经过`Order`类的验证和处理。
- **使用接口替换具体实现**:将`_orderLines`的类型更改为`IList<T>`或更泛化的`ICollection<T>`,这允许在未来更容易地更换集合实现,例如切换到`LinkedList<T>`或`HashSet<T>`。
- **改进`RemoveOrderLine`方法**:目前的方法在`RemoveOrderLine`中查找订单行,这可能导致多次遍历集合。可以考虑使用`List<T>`的`Remove`方法直接删除,或者先找到索引再调用`RemoveAt`,减少遍历次数。
这些重构步骤可以提高代码的稳定性和可维护性,同时也使得`Order`类更加符合面向对象的设计原则。在实际开发中,持续进行类似的重构工作有助于保持代码质量,并且有利于团队协作和长期项目维护。