功能应该是特定的还是通用的

时间:2010-07-19 15:24:20

标签: function

  

可能重复:
  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 + ".");
}

是的,非常简单的例子,但传达了我想要的观点。如果我们采用这个例子,我会在第一个之外使用它吗?可能不是,所以我很想以这种方式做到这一点,但是常识会(现在)说服我把它作为第二个,但如果我 知道 它不会以任何其他方式使用,即它总是会使用输入的值(是的,我会把它放到一个全局变量中)。

这只是我觉得当时最有意义的情况,还是我应该尽可能地遵循第二种模式呢?

5 个答案:

答案 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的地步,这绝不是为了牺牲而牺牲的东西一般化。