编程中的“天钩”与“起重机”模式

编程领域,经常会遇到一些设计模式,它们帮助以更高效、更清晰的方式构建软件。然而,并非所有的设计模式都是有益的。本文将探讨两种特殊的设计模式:"天钩"(Skyhook)和"起重机"(Crane),并展示如何通过改进代码来避免使用天钩,转而使用起重机。

什么是“天钩”和“起重机”

“天钩”是一种设计模式,它允许在不依赖于先前条件的情况下解释事物。相反,“起重机”则具有可解释的先前条件,可能是直到达到某个基本公理。在编程中,天钩通常表现为代码中的不良实践,如静态方法、单例模式、使用new关键字创建对象、扩展方法等。这些做法使得代码难以进行单元测试,因为它们阻碍了代码中模拟对象的注入。

“起重机”则是一种更优的设计模式,它通过依赖注入、控制反转和工厂模式等技术,使得代码更加灵活、可测试。起重机模式的核心思想是,代码的每个部分都应该明确其依赖关系,并通过外部注入这些依赖,而不是在内部硬编码。

天钩的示例与改进

让以一个C#代码示例开始,这个示例包含了四种天钩模式:

public class UsersModule : IModule { public void Initialize() { var unityContainer = ServiceLocator.Current.GetInstance(); unityContainer.RegisterType( RegionNames.ModuleDocumentContentRegion(ModuleName)); this.currentUser = new User(); } }

在这个示例中,可以看到:

  • 使用ServiceLocator获取IUnityContainer实例,这是单例模式的一个例子。
  • 使用new关键字直接创建User对象,这是对象构造的天钩。
  • 使用扩展方法RegisterType,这是静态方法的一个例子。

为了改进这段代码,可以采用起重机模式,通过依赖注入和控制反转来重构代码:

public class UsersModule : IModule { public UsersModule(IUnityContainer unityContainer, IRegionNameProvider regionNameProvider, IUserFactory userFactory) { this.unityContainer = unityContainer; this.regionNameProvider = regionNameProvider; this.userFactory = userFactory; } public void Initialize() { this.unityContainer.RegisterType( this.regionNameProvider.ModuleDocumentContentRegion(ModuleName)); this.currentUser = this.userFactory.CreateNew(); } private IUnityContainer unityContainer; private IRegionNameProvider regionNameProvider; private IUserFactory userFactory; }
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485