在 C 中,为什么更多的函数比更复杂的函数更可取?
In C, why is a larger number of functions more preferable than a more complicated function?
我以前 运行 多次了解这种现象,但是 none 清楚地证明了我的观点,如下所示:
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
保存所有字段外,它们是相同的。
如果我正在写这些,我会写一个函数,用另一个变量来说明是获取所有字段还是只获取一个字段。根据应用程序,此变量甚至可以标记要获取的字段。一个优点是,当从头开始阅读代码时,我不必阅读两个相同的函数(它们在代码中不相邻)来弄清楚它们做的是完全相同的事情。此外,当更改一个功能时,我不必访问每个相关功能,也不必修改那里的代码。劣势:功能比较复杂--看似微不足道的劣势
但是,我公司的大多数开发人员似乎更喜欢多功能方法,从 Internet 上可用的开源代码来看,其他地方似乎也是如此。结果,pwhois
有大约 50 个函数,我必须记住哪个函数做了什么——当 10 个多用途函数可以轻松完成这项工作时。我错过了什么,这使得 50 函数方法更可取?有没有办法从头开始阅读源代码,避免多次阅读这些非常相似的函数? (由于函数在代码中不相邻,我想可能有一些 "standard" 我还没有 运行 进入的评论文件。)
拥有大量协同工作的功能可以做很多事情。
- 首先,它创建了更多可重用的组件。程序运行中可能包含的功能,不仅程序本身可以访问,任何想要查看和修改它的开发人员都可以访问。
- 其次,它分解了任务,使它们更易于管理。如果你有一个大功能,它需要大量的代码才能和谐无误地工作,但是当采用更模块化的方法时,就有更多的回旋余地。
想一个需要做一些困难数学的程序。您会采用哪种方法?
- 一种根据固定公式计算输出的函数,几乎是独一无二的,只有一个应用。所有的数学运算都是私有定义的。
- 一种根据固定公式计算输出的函数,几乎是独一无二的,只有一个应用。 但是,所有数学运算都被分解并可重复使用。
我们的想法是,当您稍后在线下工作或尝试修复错误时,您永远不知道您之前编写的函数何时会派上用场!这是 DRY(不要重复自己)编程方法的一部分,I'd recommend reading this article 有助于减少您的工作量并保持您的代码高效! :D
很难说一个设计是好是坏,但我想说的是,一般来说,带有大量参数的函数完全改变了它的行为是很难使用和理解的,特别是以后的代码审查和调试.例如,像调用 w_lookup_all_pwhois(wsess, addr, 1)
这样的事情(或者想象最坏的情况,像 foo(param1, param2, true, 0, NULL, true)
这样的函数可能很奇怪。出于这个原因,它可能更好地分解成几个具有一个特定目标的函数(参见单一职责原则 SRP).
但是,正如您所指出的,最好避免代码重复。我正在使用的一种可能性是编写对最终用户隐藏的内部多用途函数(如私有函数)。然后创建一组使用正确参数调用它的单一用途函数。在您使用 pwhois 的情况下,它类似于 w_lookup_all_pwhois
和 w_lookup_all_pwhois
使用特定参数调用相同的 'private' 函数。它并不总是最好的解决方案,但适用于多种情况。 (例如,有时很难让这种通用功能与单一用途功能一样高效)。
长话短说,它有助于代码的可重用性(参见 Open/Close Principle OCP)和理解。
我以前 运行 多次了解这种现象,但是 none 清楚地证明了我的观点,如下所示:
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
保存所有字段外,它们是相同的。
如果我正在写这些,我会写一个函数,用另一个变量来说明是获取所有字段还是只获取一个字段。根据应用程序,此变量甚至可以标记要获取的字段。一个优点是,当从头开始阅读代码时,我不必阅读两个相同的函数(它们在代码中不相邻)来弄清楚它们做的是完全相同的事情。此外,当更改一个功能时,我不必访问每个相关功能,也不必修改那里的代码。劣势:功能比较复杂--看似微不足道的劣势
但是,我公司的大多数开发人员似乎更喜欢多功能方法,从 Internet 上可用的开源代码来看,其他地方似乎也是如此。结果,pwhois
有大约 50 个函数,我必须记住哪个函数做了什么——当 10 个多用途函数可以轻松完成这项工作时。我错过了什么,这使得 50 函数方法更可取?有没有办法从头开始阅读源代码,避免多次阅读这些非常相似的函数? (由于函数在代码中不相邻,我想可能有一些 "standard" 我还没有 运行 进入的评论文件。)
拥有大量协同工作的功能可以做很多事情。
- 首先,它创建了更多可重用的组件。程序运行中可能包含的功能,不仅程序本身可以访问,任何想要查看和修改它的开发人员都可以访问。
- 其次,它分解了任务,使它们更易于管理。如果你有一个大功能,它需要大量的代码才能和谐无误地工作,但是当采用更模块化的方法时,就有更多的回旋余地。
想一个需要做一些困难数学的程序。您会采用哪种方法?
- 一种根据固定公式计算输出的函数,几乎是独一无二的,只有一个应用。所有的数学运算都是私有定义的。
- 一种根据固定公式计算输出的函数,几乎是独一无二的,只有一个应用。 但是,所有数学运算都被分解并可重复使用。
我们的想法是,当您稍后在线下工作或尝试修复错误时,您永远不知道您之前编写的函数何时会派上用场!这是 DRY(不要重复自己)编程方法的一部分,I'd recommend reading this article 有助于减少您的工作量并保持您的代码高效! :D
很难说一个设计是好是坏,但我想说的是,一般来说,带有大量参数的函数完全改变了它的行为是很难使用和理解的,特别是以后的代码审查和调试.例如,像调用 w_lookup_all_pwhois(wsess, addr, 1)
这样的事情(或者想象最坏的情况,像 foo(param1, param2, true, 0, NULL, true)
这样的函数可能很奇怪。出于这个原因,它可能更好地分解成几个具有一个特定目标的函数(参见单一职责原则 SRP).
但是,正如您所指出的,最好避免代码重复。我正在使用的一种可能性是编写对最终用户隐藏的内部多用途函数(如私有函数)。然后创建一组使用正确参数调用它的单一用途函数。在您使用 pwhois 的情况下,它类似于 w_lookup_all_pwhois
和 w_lookup_all_pwhois
使用特定参数调用相同的 'private' 函数。它并不总是最好的解决方案,但适用于多种情况。 (例如,有时很难让这种通用功能与单一用途功能一样高效)。
长话短说,它有助于代码的可重用性(参见 Open/Close Principle OCP)和理解。