2010-10-02 115 views
5

是否有一些规则何时使用两个函数或何时传递布尔参数。两个函数或布尔参数?

感谢

+2

是什么,即使是什么意思?你能提供一个代码示例吗? – NullUserException 2010-10-02 17:58:29

+0

是的,有很多规则。所有这些都是矛盾的,所有这些都是个人(或团队)偏好的问题。我个人的规则很简单:如果我觉得需要给方法添加注释或者调用方法,我需要改变它。 – Tergiver 2010-10-02 18:02:24

回答

7

它已经有一段时间,因为我最后再阅读代码完成,但我依稀记得麦康奈尔解决这个,的一句“转折conherence”跳进我的脑海。简单地说,

void f(int x, int y, bool b) 

void f1(int x, int y) 
void f2(int x, int y) 

往往是一个选择,这取决于f如何相似或不同将true下的行为与false,它可能是有意义的掰成两个函数,给他们不同的名字。通常第三种选择更好,即将bool更改为两值枚举,其中枚举名称明确区分。

关键是看看电话网站,看看它的意思是否清楚,只是通过阅读代码。如果你很想把一个评论对每一个布尔调用点:

f(3, 4, true /* absoluteWidgetMode */) 

,被呼叫的网站通常与布尔常数打电话,这是一个强烈的气味,你应该把它分解成多种功能。

4

布尔参数意义大部分的时间,基本上值得同样的批评幻数做的。您只有查看函数调用,才有可能不了解所做的事情。

因此,即使为非常相似的代码(追加/覆盖文件)提供布尔参数很方便,请将其保留为内部私有,并且不要让它在界面中可见。

相反,总是迫使程序员是明确

使用枚举给予了区别有意义的说明或只使用独立的功能

比较:

WriteFile(path, "Hello, World", true) 

WriteFile(path, "Hello, World", FileMode.Append) 

或者干脆

AppendFile(path, "Hello, World") 
+2

请注意,这不适用于具有命名参数的语言。 'WriteFile(Append:True)'可能与'WriteFile(Mode:FileMode.Append)'一样可读。 – sepp2k 2010-10-02 18:42:13

+0

@ sepp2k:虽然我不喜欢命名参数的方法 - 尽管是冗长的 - 因为它们的使用没有被强制执行,因此仍然可能发生无意义的参数(例如由于懒惰)。强制使用参数名称会改善情况,但可能会降低抽象的可能性(高阶函数,委托,部分应用程序,默认编程)。在这种情况下,强类型或不同功能仍然是最佳选择。 – Dario 2010-10-03 08:48:05