【问题标题】:What is the Humble Object pattern and when is it useful?什么是 Humble Object 模式,什么时候有用?
【发布时间】:2011-03-16 10:34:29
【问题描述】:

我正在阅读an article by Dino Esposito on how to test AsyncConrollers in ASP.NET MVC,其中他使用了“Humble Object”模式,但没有详细说明。

我在谷歌上搜索也不是很幸运。

那么,什么是 Humble Object 模式?什么时候有用?

【问题讨论】:

标签: c# .net design-patterns


【解决方案1】:

a thorough description at xunitpatterns.com

基本上,您将所有逻辑放入一个可以轻松测试的单独对象中 - 您的“Humble Object”成为您可测试对象的包装;只是不起眼的对象还依赖于难以测试的事物,例如异步服务或 GUI 类。这个想法是在不起眼的对象中留下很少的实际逻辑,您不需要对其进行测试,因此不需要处理难以测试的依赖项的测试。

【讨论】:

    【解决方案2】:

    Uncle Bob 的书 - Clean Architecture: A Craftsman's Guide to Software Structure and Design, Chapter 23 - PRESENTERS AND HUMBLE OBJECTS 一书中提到了 Humble Object 模式(@ 987654321@).

    这种模式被应用在系统的边界上,其中事物 通常很难测试,以使它们更具可测试性。我们 通过减少接近边界的逻辑来完成模式, 使代码接近边界如此简陋以至于不需要 进行测试。提取的逻辑被移到另一个类中, 与边界解耦,使其可测试。

    • 罗伯特·C·马丁

    这种模式在处理与 UI 相关的代码或数据库代码时很有用。主要思想是让 UI 代码或数据库代码等频繁变化的层尽可能薄。您不会对此层进行任何单元测试。

    将所有业务逻辑移至不同的层,并为此进行详细的单元测试。

    整个想法是使复杂或频繁更改的层尽可能低调或薄,并排除为此编写单元测试(因为您付出的努力不值得)。专注于业务逻辑层,对其进行详细测试。

    【讨论】:

      【解决方案3】:

      我通常会将这种类型实现为 Interface - 然后您可以使用模拟框架来存根以进行测试,并使用 IoC 框架在运行时注入正确的实现。

      这是我当前项目的一个示例:

      public interface IUserInterface
      {
          string AskUserWhereToSaveFile(
              string title, 
              FileType defaultFileType, 
              string defaultFileName = null, 
              params FileType[] otherOptions
          );
      
          string AskUserToSelectFileToLoad(
             string title, 
             FileType defaultFileType, 
             params FileType[] fileTypes
          );
      
          void ShowError(string title, string details);
          bool AskUserIfTheyWantToRetryAfter(string errorMessage);
      }
      

      然后,我的控制器依赖于 IUserInterface 而不是具体的视图,这允许我用存根替换用户交互以进行测试。

      【讨论】:

      • 如果我理解正确,您通常会将此模式用于您无法控制的代码,因此使用接口是行不通的。
      • @Freek - 这就是我通常使用它的目的。我仍然有一个(或多个)类实现Interface,但是编码到Interface 对消费者隐藏了所有实现细节。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-09-20
      • 2010-09-17
      • 2011-09-28
      • 2013-11-30
      • 1970-01-01
      相关资源
      最近更新 更多