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·马丁
整个想法是使复杂或频繁变化的层尽可能简单或薄,并排除为此编写单元测试(因为它不值得您为此付出努力)。通过对业务逻辑层进行详细的测试来集中精力。如果我理解正确,您通常会对无法控制的代码使用此模式,因此使用接口将不起作用。@Freek-这就是我通常使用它的原因。我仍然会有一个类(或多个类)实现
接口
,但是编码到接口
会对使用者隐藏所有的实现细节。如果您想了解如何使用VS实现HO项目,请看一下这个。