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

时间:2011-03-16 10:34:30

标签: c# .net design-patterns

我正在阅读an article by Dino Esposito on how to test AsyncConrollers in ASP.NET MVC并在那里使用“谦卑对象”模式,而没有详细说明。

我没有太多运气在谷歌上搜索。

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

3 个答案:

答案 0 :(得分:31)

a thorough description at xunitpatterns.com

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

答案 1 :(得分: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);
}

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

答案 2 :(得分:0)

鲍勃叔叔的书《清洁的体系结构:软件结构和设计的工匠指南》第23章-主持人和谦逊的对象({ {3}}。

  

此模式应用于系统的边界,   通常很难测试,以使其更具可测试性。我们   通过减少靠近边界的逻辑来完成模式,   使代码非常接近边界,以至于不需要   进行测试。逻辑被移到另一个类别,   从边界解耦,使其可测试。

  • Robert C. Martin