可能重复:
Specific functions vs many Arguments vs context dependent
所以我已经开发了3到4年了,知道各种各样的语言,知道一些令人印象深刻的(对于小心眼的:P)的东西。
但我总是想知道的事情;当我创造一个功能时,它应该用于特定目的,还是应该被塑造成可重复使用的,即使我不需要它?
E.G:
//JS, but could be any language really
//specific
function HAL(){
alert("I'm afraid I can't let you do that, " + document.getElementById("Name").value + ".");
}
//generic
function HAL(nme){
alert("I'm afraid I can't let you do that, " + nme + ".");
}
//more generic
function HAL(msg, nme){
alert(msg + " " + nme + ".");
}
是的,非常简单的例子,但传达了我想要的观点。如果我们采用这个例子,我会在第一个之外使用它吗?可能不是,所以我很想以这种方式做到这一点,但是常识会(现在)说服我把它作为第二个,但如果我 知道 它不会以任何其他方式使用,即它总是会使用输入的值(是的,我会把它放到一个全局变量中)。
这只是我觉得当时最有意义的情况,还是我应该尽可能地遵循第二种模式呢?
答案 0 :(得分:1)
函数不应该只是在一些其他上下文中调用它们的一系列语句。它应该是您想要抽象的功能单元。使函数具体是好的,但使其对上下文敏感是不好的。你应该做的是使用帖子中提供的通用方法(最后一个),但提供消息作为常量。您使用的语言有一些方法可以声明常量吗?
答案 1 :(得分:1)
在那种特殊情况下,我会写现在的第一个函数(YAGNI,对吗?),可能永远不需要改变它。然后,如果结果我确实需要支持备用名称,我会将当前行为设为默认行为,但允许使用可选参数来指定名称。与消息一样。
# In Ruby, but like you say, could be in anything:
// specific
def hal()
puts "I'm afraid I can't let you do that, #{fetch_name}."
end
// genericized refactoring
def hal( name = fetch_name )
puts "I'm afraid I can't let you do that, #{name}."
end
通常情况下,这是我更喜欢采用的方法:在当前需要的最方便的特定程度上创建函数,但是为以后更广泛的方法敞开大门。
使用像Ruby这样的语言有助于简化这一过程,但即使在Java或C中,您也可以在某种程度上采用相同的方法。例如,在Java中,您可以先创建一个没有参数的特定方法,然后稍后使用“name”参数和填充默认名称的无参数包装器重构为更通用的方法。
答案 2 :(得分:1)
根据经验,一个函数应该具有最小的副作用。
所以,真的,它看起来像这样:
//By the way - don't call functions nouns. functions are verbs. data are nouns
void HAL(string s)
{
voicetype_t vt = voice.type();
voice.type(VOICE_OF_DOOM);
voice.say(s);
voice.type(vt);
}
答案 3 :(得分:0)
在你的例子中,我不会让它变得通用。如果在许多情况下可以使用某个功能,请将其设置为通用,这样您就可以一直使用它而无需“复制,粘贴,进行微小更改,重复”。但是告诉用户他不能这样做并且将其作为[某些输入字段的内容]来处理仅对一个案例有用。另外,最后一枪是毫无意义的。
但是,我通常更喜欢我的代码尽可能通用。好吧,只要有可能我有一天会需要它......让我们不要太过刻意地违反了YANGI。但如果它没有麻烦可以通用,为什么不呢?
答案 4 :(得分:0)
在我看来,功能应该只在其目的需要的范围内进行通用化。换句话说,你应该承认,虽然我们想要以不同的方式思考,但所有都不可重复使用,因此,你不应该试图将所有内容都实现为。程序员应该意识到产品的范围(以及可能的未来发展),因此最终应该使用他们的直觉来了解功能的概括程度。
至于你的例子,#3完全没用,因为它只在两个字符串之间添加一个空格并在最后添加一个句点 - 为什么有人会用特殊功能执行此操作?我知道这只是一个例子,但是如果我们谈论一个方法的推广有多远,那就是把它放得太远 - 几乎到了它只是浪费LOC的地步,这绝不是为了牺牲而牺牲的东西一般化。