我之前曾经多次遇到过这种现象,但没有一个人像以下那样明确表达我的观点:
source code for pwhois有两个功能:
w_lookup_all_pwhois(whois_session_params * wsess, char *addr)
w_lookup_as_pwhois(whois_session_params * wsess, char *addr)
这些是40到60行的函数,除了...as_pwhois
函数只保存“origin-as”字段外,它们是相同的,而...all_pwhois
保存所有字段。
如果我正在编写这些内容,我会编写一个函数,使用另一个变量来表示是获取所有字段还是只获取一个字段。根据应用程序的不同,此变量甚至可以标记要获取的字段。一个优点是,当从头开始阅读代码时,我不必阅读两个相同的函数(代码中不相邻),以确定它们完全相同。此外,在更改一个功能时,我不必访问每个相关功能,也可以修改其中的代码。缺点:功能更复杂 - 看似微不足道。
然而,我公司的大多数开发人员似乎更喜欢多功能方法,就像其他地方的情况一样,从互联网上可用的开源代码来判断。结果,pwhois
大约有50个函数,我必须记住哪个函数做了什么 - 当10个多功能函数可以很容易地完成工作时。我缺少什么,这使得50功能方法更可取?有没有办法从头开始阅读源代码,避免多次读取这些非常相似的函数? (由于代码中的函数不相邻,我猜可能还有一些我尚未遇到的“标准”注释文件。)
答案 0 :(得分:3)
拥有众多功能可以协同工作。
想想一个需要做一些硬数学的程序。你会采取哪种方法?
这个想法是,当你以后再开始工作或试图修复错误时,你永远都不知道你之前写过的函数什么时候会派上用场!这是DRY(不要重复自己)编程方法的一部分,I'd recommend reading this article有助于减少工作量并保持代码高效! :d
答案 1 :(得分:2)
很难说设计实际上是好还是坏但是我说,通常情况下,有很多参数改变其行为的功能很难使用和理解,特别是后来的代码审查和调试。例如,调用w_lookup_all_pwhois(wsess, addr, 1)
之类的东西(或者想象最差,像foo(param1, param2, true, 0, NULL, true)
这样的函数可能很奇怪。因此,可能更好地分解为具有一个特定目标的多个函数(参见单一责任)原则SRP)。
但是,正如您所指出的,避免代码重复会更好。我使用的一种可能性是编写对最终用户隐藏的内部多功能功能(如私有功能)。然后创建一组一个用于使用正确参数调用它的目的函数。在你使用pwhois的情况下,它会像w_lookup_all_pwhois
和w_lookup_all_pwhois
那样调用相同的私有'具有特定参数的功能。虽然适用于多种情况,但它并不总是最好的解决方案。 (例如,有时很难将这种通用功能与单用功能一样高效。)
总而言之,它有助于代码重用(参见开放/关闭原则OCP)和理解。