什么是Humble Object模式以及何时有用?

Ser*_*eit 17 .net c# design-patterns

我正在阅读Dino Esposito关于如何在ASP.NET MVC中测试AsyncConrollers的文章,在那里他使用了"Humble Object"模式,而没有详细介绍.

谷歌周围也没有运气.

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

Mas*_*sif 34

在xunitpatterns.com详尽描述.

基本上,您将所有逻辑拉入一个可以轻松测试的单独对象 - 并且您的"Humble Object"成为可测试对象的包装器; 它只是简单的对象也依赖于难以测试的东西,比如异步服务或GUI类.这个想法是在你不需要测试它的简陋对象中留下如此少的实际逻辑,因此不需要处理测试难以测试的依赖性.


Mat*_*hen 13

简陋对象模式在书中提到 - Clean Architecture: A Craftsman's Guide to Software Structure and Design by Uncle Bob,第 23 章 - PRESENTERS AND HUMBLE OBJECTS ( https://learning.oreilly.com/library/view/clean-architecture- a/9780134494272/ch23.xhtml)。

这种模式应用于系统的边界,在这些边界上,事情通常很难测试,以便使它们更易于测试。我们通过减少靠近边界的逻辑来实现该模式,使靠近边界的代码变得非常简单,以至于不需要进行测试。提取的逻辑被移至另一个类中,与边界解耦,使其可测试。

  • 罗伯特·马丁

当使用 UI 相关代码或数据库代码时,此模式非常有用。主要思想是使UI代码或数据库代码等经常变化的层尽可能薄。您不会对该层进行任何单元测试。

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

整个想法是使复杂或频繁变化的层尽可能简单或薄,并排除为此编写单元测试(因为它不值得您投入精力)。通过对其进行详细测试来专注于业务逻辑层。

  • “提取”是什么意思? (2认同)

Dav*_*emp 5

我通常会将此类实现为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);
}
Run Code Online (Sandbox Code Playgroud)

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