假设我有以下方法:
public Stream GetMusic(string songTitle, string albumName) { ... }
我的一位同事确信这是一种糟糕的方法签名。他希望我使用一个Request对象,它会将方法签名转换为:
public Stream GetMusic(SongRequest request) { ... }
我真的没有看到这样做的意义。我看到的唯一好处是将来添加参数会更容易。我们不必更改方法签名,但仍然需要更改Request对象。
就个人而言,我认为这不是一个好主意。使用参数可以明确表示方法运行所需的内容。另外,这迫使我们不多创造另一个对象。
使用Request对象的优缺点是什么?您是否在项目中使用它以及为什么?
答案 0 :(得分:2)
传递对象有一个主要优点 -
如果有一个对象用作参数,例如SongRequest
,则对象可以负责自己的验证。这允许您显着简化使用该对象的每个方法的验证,因为您几乎只需要检查null,而不是检查每个参数。
此外,如果您有许多参数,生成单个对象通常会更简单。如果您发现需要多次重载来管理不同的参数组合,则尤其如此。
话虽如此,每种情况都是独一无二的。对于每种情况,我都不建议采用一种方法。
答案 1 :(得分:2)
您正在使用GetMusic(...)
方法获取数据。如果是这样,那么在没有真正需要的情况下使用其他实体可能需要付出太多努力。
实际上,在某种情况下,只有一个输入参数,您可以使用自定义类。但是如果该类是唯一可以使用的地方,那么如果类名称为SongSignature
,则必须使用专门来使用此类,这是使用的不良做法“参数袋”,因为它的可读性很好。
此外,如果有人愚蠢地说SongSignature
必须是一个结构,并且在该结构中有一个指向要在方法内部更改的数据的指针,那么指针永远不会真正改变,因为每次{{1}调用它,它将需要属性包的副本 。
即使它是一个类,你也必须将该类的访问器更改为GetMusic
,并且通常这不是将参数传递给函数并从函数获取结果的最佳方法,因为你已经从该方法获得了一个流。
让我们假设以下情况:
如果在团队中,一个程序员用类public
替换参数,则第二个程序员没有发现它被用作函数的参数(因为它在类的名称中运气信息),并且在下一次迭代中将它改为一个结构,第三个程序员以这种方式使用这个方法,它必须是一个类(例如在SongRequest
中使用了类引用)...结果没有人真正做到了知道为什么有些东西不起作用,因为每个东西都有圆顶正确的东西......没有理由使用一个类来进行本地使用而不是隐式声明参数。
一般来说,你很有可能在将来遇到这种情况,因为:
SongRequest
)GetMusic
类可以为你添加一个额外的依赖方法(有人改变这个类,很可能你的功能不会编译)SongReuest
作为SongRequest
仅将其用作锁定类,如前所述。property bag
类来传递特定函数的参数,会产生额外的内存开销,因为如果经常调用此方法,一方面会产生大量不必要的对象在内存中必须进行垃圾收集,另一方面,如果很少使用这样的方法,创建一个类将几个变量传递给单个调用将是不切实际的 只有一个真正的理由使用类而不是两个字符串参数:程序员喜欢这样的调用,并希望使所有代码“比以前更漂亮”,更多monadic,尽管事实上这不是很实用,有用。
我永远不会建议你让代码看起来像这样,直到你想让它看起来更好。
通常,我认为使用自定义类传递函数的参数是一种不好的做法。