将许多相似的参数封装到结构中是一种好习惯吗?

时间:2009-06-04 09:58:46

标签: c# parameters struct

基本上,我有以下内容:

public string SomeDBMethod(string server, string dbName, string userName, string password,...)

将其重构为以下内容是一种好习惯:

public string SomeDbMethod(DBParams parameters, ...)

DBParams的定义如下:

public struct DBParams
{
  string Server {get;set;}
  string DbName {get;set;}
  string UserName {get;set;}
  string Password {get;set;}
}

我的观点是能够传递较少的参数,因为我发现具有长参数列表的函数非常难看。

我还发现这种方法有一些限制:如果要将SomeDbMethod作为Web服务方法公开,我不能使用DBParams结构作为参数(就我对Web服务主题的理解而言) ......这不是很远。)

那么,这对于小小的好处来说是太麻烦还是我在这里做点什么?

5 个答案:

答案 0 :(得分:4)

除非你真的需要经常传递这组参数(使用相同的数据),否则我认为没有必要。长参数列表有时表明需要重构代码,但有时候再次有可能是不可避免的。 (在你的情况下似乎更像后者。)所以,简单地使用直接传递参数的直接方法,除非你发现自己需要存储参数集(至少暂时) - 你真的不会保存任何代码否则,肯定不会提高可读性。

使用struct的方法不会对Web服务施加任何限制。您只需要将类型设置为可序列化(我相信在WPF中为DataContract),并且应该没有任何问题。

答案 1 :(得分:3)

我总是将参数组合在一起成为一个对象 - 代码更加清晰,很明显它们彼此相关并且总是一起使用。

但是,在大多数情况下,我使用的是类,而不是结构。结构的好处对我来说从来都不清楚,在很多情况下它们都很痛苦(我猜网络服务场景只是一个例子)。

如果你不想让人们改变它,你可以使一个类成为不可变的(如果这是使用struct的原因)

答案 2 :(得分:2)

有一种名为encapsulate context的模式,讨论了使用这种技术所涉及的问题。对于详细分析,可能值得一看。

答案 3 :(得分:1)

我建议阅读this question on structs verses values objects

在这种情况下,几乎可以肯定使结构可变是一个非常糟糕的主意。

鉴于命名参数是在c#4.0中出现的,我建议这样的事情稍后会变得很烦人,应该避免,除非严重需要以多种不同的速度传递这个“信息包”信息。以及只对他们有意义的操作。

老实说,如果类/结构不维护/强制执行某些不变量,那么就没有什么意义了。

答案 4 :(得分:0)

如果要封装相关变量,可以使用Struct。它不一定是一个对象。由于Structs是值类型,与类不同,它们不需要堆 分配,它们也是通过值而不是像对象一样通过引用传递的。

在这种情况下,恕我直言创建一个类来保存该信息不会增加价值,但如果您计划使用DBParams信息(将其作为Web服务的参数公开)更复杂,那么请考虑使用对象。如果您想简单地以简洁的方式传递这些参数,那么结构就可以了。

您可以在此处获取更多信息:

http://discuss.joelonsoftware.com/default.asp?dotnet.12.489354.15