C#代码重构:31天挑战

需积分: 10 2 下载量 58 浏览量 更新于2024-07-24 收藏 4.36MB PDF 举报
"31天重构代码 - C#系列文档,由Sean Chambers编写的关于代码重构的31个技巧,详细介绍了如何改进WPF项目中的代码结构。文档可以在Sean Chambers的博客和GitHub上找到。" 在《31天重构代码》这个系列中,作者Sean Chambers深入探讨了代码重构的重要性及实践方法,特别是针对C#编程语言。在这个例子中,他展示了如何通过封装集合来提升代码质量,这是一个常见的重构策略,可以提高代码的可维护性和可读性。 在提供的代码片段中,可以看到一个名为`Order`的类,它包含了一个`_orderLines`私有字段,类型为`List<OrderLine>`,并公开了一个`IList<OrderLine>`类型的属性`OrderLines`。这种设计允许外部直接访问和修改`Order`的订单行列表,可能会导致代码的脆弱性,因为`Order`类无法控制其内部状态的变化。为了改善这种情况,作者建议进行以下重构: 1. 封装`IList<OrderLine>`:将`OrderLines`属性更改为只读,并提供新的公共方法来添加和删除订单行。这样,`Order`类可以更好地控制其内部数据的修改,确保了数据的一致性。例如,`AddOrderLine`和`RemoveOrderLine`方法分别负责增加和减少订单总额以及管理订单行列表。 2. 使用接口而非具体实现:尽管`List<T>`是一个强大的数据结构,但直接暴露它的实例可能会导致不必要的依赖。通过使用接口`IList<T>`,我们可以隐藏具体的实现细节,使得类的设计更加灵活,将来可以轻松地更换其他类型的集合,如`LinkedList<T>`或`ObservableCollection<T>`,而不会影响到调用者。 3. 安全的删除操作:在`RemoveOrderLine`方法中,先查找要移除的订单行,如果找不到则返回,避免了对空引用的调用。这是一个好的实践,能防止因未找到对象而引发的异常。 4. 考虑引入`OrderLine`的业务逻辑:在`OrderLine`类中,`Total`属性是只读的,但没有明确的设置方式。这可能意味着`OrderLine`的总价应该在创建时计算好,或者在添加到`Order`时计算。如果`OrderLine`的总价会随着某些条件改变,应考虑添加适当的属性或方法来处理这种变化。 5. 使用`IEnumerable<T>`和`IEnumerator<T>`:虽然这部分代码没有在给出的示例中,但在讨论封装集合时,作者可能还会提到使用`IEnumerable<T>`来遍历集合,这样可以进一步降低对外部的耦合,让代码更加符合面向对象的原则。 《31天重构代码》系列旨在帮助开发者学习如何逐步改善代码结构,使其更健壮、更易于理解和维护。通过封装集合、使用接口、确保安全操作等方法,我们可以编写出更高质量的C#代码,这对于任何WPF或其他.NET项目都是极其有价值的。