Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/302.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cassandra/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 谦逊对象模式是什么?它什么时候有用?_C#_.net_Design Patterns - Fatal编程技术网

C# 谦逊对象模式是什么?它什么时候有用?

C# 谦逊对象模式是什么?它什么时候有用?,c#,.net,design-patterns,C#,.net,Design Patterns,我当时正在阅读,他在书中使用了“谦逊的对象”模式,没有详细说明 我在谷歌上搜索也不太走运 那么,谦逊的对象模式是什么?什么时候有用?有 基本上,您将所有逻辑拉入一个单独的对象中,您可以轻松地对其进行测试,而您的“谦逊对象”将成为可测试对象的包装器;只是简单的对象还依赖于难以测试的东西,比如异步服务或GUI类。其想法是在谦逊的对象中保留很少的实际逻辑,因此您不需要测试它,也不需要处理测试难以测试的依赖关系。我通常将此类实现为接口-然后您可以使用模拟框架将其存根以进行测试,以及一个IoC框架,用于在

我当时正在阅读,他在书中使用了“谦逊的对象”模式,没有详细说明

我在谷歌上搜索也不太走运

那么,谦逊的对象模式是什么?什么时候有用?


基本上,您将所有逻辑拉入一个单独的对象中,您可以轻松地对其进行测试,而您的“谦逊对象”将成为可测试对象的包装器;只是简单的对象还依赖于难以测试的东西,比如异步服务或GUI类。其想法是在谦逊的对象中保留很少的实际逻辑,因此您不需要测试它,也不需要处理测试难以测试的依赖关系。

我通常将此类实现为
接口
-然后您可以使用模拟框架将其存根以进行测试,以及一个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,而不是具体的视图,这允许我用存根来代替用户交互进行测试。

Bob叔叔的《清洁体系结构:软件结构和设计工匠指南》一书中提到了谦逊的对象模式,第23章-演讲者和谦逊的对象()

此模式应用于系统的边界,其中 通常很难测试,以使它们更易于测试。我们 通过减少接近边界的逻辑来实现模式, 使代码接近边界,使其不需要 有待检验。脱离接触的逻辑被转移到另一个类, 与边界分离,使其可测试

  • 罗伯特·C·马丁
在处理与UI相关的代码或数据库代码时,此模式非常有用。其主要思想是使频繁更改的层(如UI代码或数据库代码)尽可能薄。您将不会对此层进行任何单元测试

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


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

如果我理解正确,您通常会对无法控制的代码使用此模式,因此使用接口将不起作用。@Freek-这就是我通常使用它的原因。我仍然会有一个类(或多个类)实现
接口
,但是编码到
接口
会对使用者隐藏所有的实现细节。如果您想了解如何使用VS实现HO项目,请看一下这个。