Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/283.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/8/design-patterns/2.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#_Design Patterns - Fatal编程技术网

C# 关于通过委托进行配置的思考

C# 关于通过委托进行配置的思考,c#,design-patterns,C#,Design Patterns,我正在使用Divan CouchDB库的一个分支,需要在后台使用的httpwebrequest上设置一些配置参数。起初,我开始在所有涉及的构造函数层和方法调用层中处理参数,但后来决定——为什么不传入一个配置委托 所以在更一般的情况下 鉴于: class Foo { private parm1, parm2, ... , parmN public Foo(parm1, parm2, ... , parmN) { this.parm1 = parm1;

我正在使用Divan CouchDB库的一个分支,需要在后台使用的httpwebrequest上设置一些配置参数。起初,我开始在所有涉及的构造函数层和方法调用层中处理参数,但后来决定——为什么不传入一个配置委托

所以在更一般的情况下

鉴于:

class Foo {
    private parm1, parm2, ... , parmN
    public Foo(parm1, parm2, ... , parmN) {
        this.parm1 = parm1;
        this.parm2 = parm2;
        ...
        this.parmN = parmN;
    }

    public Bar DoWork() {
        var r = new externallyKnownResource();
        r.parm1 = parm1;
        r.parm2 = parm2;
        ...
        r.parmN = parmN;
        r.doStuff();
    }
}
做:

class-Foo{
私人行动配置器;
公共Foo(动作配置器){
this.configurator=配置器;
}
公共酒吧{
var r=newexternallyknownResource();
配置器(r);
r、 doStuff();
}
}
后者对我来说似乎更干净,但它确实将
class Foo
使用
externallyKnownResource

想法?

这可能导致代码看起来更干净,但有一个巨大的缺点

如果您在配置中使用委托,您将无法控制对象的配置方式。问题是代理可以做任何事情——您无法控制这里发生的事情。你让第三方在你的构造函数中运行任意代码,并相信他们会做“正确的事情”。这通常意味着你必须编写大量代码,以确保委托正确设置了所有内容,否则你可能会得到非常脆弱、容易破坏的类

验证委托是否正确设置了每个需求变得更加困难,尤其是当您深入到树中时。通常,验证代码会比原始代码更混乱,通过层次结构传递参数。

这会导致代码看起来更干净,但有一个巨大的缺点

如果您在配置中使用委托,您将无法控制对象的配置方式。问题是代理可以做任何事情——您无法控制这里发生的事情。你让第三方在你的构造函数中运行任意代码,并相信他们会做“正确的事情”。这通常意味着你必须编写大量代码,以确保委托正确设置了所有内容,否则你可能会得到非常脆弱、容易破坏的类


验证委托是否正确设置了每个需求变得更加困难,尤其是当您深入到树中时。通常,验证代码最终会比原始代码更混乱,通过层次结构传递参数。

在我看来,最好接受配置对象作为Foo构造函数的单个参数,而不是十几个(大约)单独的参数

编辑:


没有一刀切的解决方案,没有。但问题相当简单。我正在编写一些使用外部已知实体(httpwebrequest)的东西,该实体已经进行了自我验证,并且有大量潜在的必要参数。实际上,我的选择是重新创建几乎所有的配置参数,并且每次都将这些参数传送进来,或者让消费者承担责任,按照他们认为合适的方式进行配置科洛西

您的请求的问题是,一般来说,让类的用户配置外部资源是糟糕的类设计,即使它是众所周知或常用的资源。更好的类设计是让类对类的用户隐藏所有这些内容。这意味着在类中要做更多的工作,是的,将配置信息传递给外部资源,但这就是拥有一个单独的类的意义所在。否则,为什么不让类的调用者在外部资源上完成所有工作呢?为什么一开始就要单独上课呢


现在,如果这是一个内部类,为另一个您将始终控制的类执行一些简单的实用程序工作,那么您就可以了。但是不要公开这种类型的范例

IMO,您最好接受一个配置对象作为Foo构造函数的单个参数,而不是十几个(大约)单独的参数

编辑:


没有一刀切的解决方案,没有。但问题相当简单。我正在编写一些使用外部已知实体(httpwebrequest)的东西,该实体已经进行了自我验证,并且有大量潜在的必要参数。实际上,我的选择是重新创建几乎所有的配置参数,并且每次都将这些参数传送进来,或者让消费者承担责任,按照他们认为合适的方式进行配置科洛西

您的请求的问题是,一般来说,让类的用户配置外部资源是糟糕的类设计,即使它是众所周知或常用的资源。更好的类设计是让类对类的用户隐藏所有这些内容。这意味着在类中要做更多的工作,是的,将配置信息传递给外部资源,但这就是拥有一个单独的类的意义所在。否则,为什么不让类的调用者在外部资源上完成所有工作呢?为什么一开始就要单独上课呢


现在,如果这是一个内部类,为另一个您将始终控制的类执行一些简单的实用程序工作,那么您就可以了。但是不要公开这种类型的范例

这里我可能遗漏了一些东西,但在DoWork()中创建externallyKnownResource对象似乎是一个很大的缺点。这就排除了替代实现的简单替换。 为什么不:

public Bar DoWork( IExternallyKnownResource r ) { ... }

这里我可能遗漏了一些东西,但在DoWork()中创建externallyKnownResource对象似乎是一个很大的缺点。这就排除了替代实现的简单替换。 为什么不:

public Bar DoWork( IExternallyKnownResource r ) { ... }

在一般情况下,我同意,但是当你与一个已知实体打交道时呢?我是confi