我写很长的功能的小型的学术研究项目。 很显然,我不是在寻找坏的编程实例 ,但对于100,200和600线长函数的例子这是有道理的。
我会调查使用的书面脚本Linux内核源代码写在希伯来大学硕士学位 ,是衡量不同的参数,如代码,行数函数的复杂性 (由MCC测量)和其他物品。 顺便说一句,这是关于代码分析,并推荐阅读材料整齐的研究。
我很感兴趣,如果你能想到的任何好的理由任何功能应该是非常长的? 我会寻找到C,但在任何语言的例子和论点将是非常有用。
我写很长的功能的小型的学术研究项目。 很显然,我不是在寻找坏的编程实例 ,但对于100,200和600线长函数的例子这是有道理的。
我会调查使用的书面脚本Linux内核源代码写在希伯来大学硕士学位 ,是衡量不同的参数,如代码,行数函数的复杂性 (由MCC测量)和其他物品。 顺便说一句,这是关于代码分析,并推荐阅读材料整齐的研究。
我很感兴趣,如果你能想到的任何好的理由任何功能应该是非常长的? 我会寻找到C,但在任何语言的例子和论点将是非常有用。
我可能赶上高射炮这一点,但可读性。 高度串口,可独立执行,可以被分解成N个函数调用(那是不能用于其他地方的功能)并没有真正从分解受益。 除非你满足于功能长度任意最大的效益。
我级别比导航整个文件通过代码为N功能大小的块,而滚动,打N个函数。
值的大量switch语句?
任何来自其他来源产生的,从一个解析器生成器或类似的,即一个有限状态机。 如果它不是供人类消费,审美或维护的担忧是不相关的。
功能可以得到更长的一段时间,特别是如果他们是由多套的开发商修改。
案例:我最近(1年〜2或前)重构一些旧的图像处理代码从2001年左右,包含少数几家千线功能。 没几下几个千行的文件 - 少数几家千线功能。
多年来,这么多的功能被添加到他们没有正确地重构他们的努力真正投入。
阅读麦康奈尔的代码完成对子程序的一章,它有指引,当你要打破东西变成功能的指针。 如果你有一些算法,其中这些规则不适用,这可能是对于具有长期作用的好理由。
生成的代码可以生成非常非常长的功能。
唯一的我最近编码是它并没有达到多,让它们变得更小,也可以使代码的可读性。 的概念,即一个函数,超过一定长度是某种内在的坏简直是盲目的教条。 如同任何盲目套用教条OT减轻了需要真正思考一下在任何给定的情况下适用的追随者...
最近的例子...
解析和验证用简单的名称=值结构的配置文件到一个数组,转换每个值作为我找到它,这是一个巨大的switch语句,每配置选项一个案件。 为什么? 我可以分裂成许多呼叫5/6线琐碎的功能。 这将约20私有成员添加到我的班。 他们没有被重用其他地方。 保理成小块只是没有添加足够的价值是值得的,所以它是自原型都一样。 如果我想另一个选项,添加另一种情况。
另一种情况是在相同的应用程序中的客户端和服务器的通信的代码,和它的客户机。 调用大量的读/写的任何一个都可以失败,在这种情况下,我保释并返回false。 所以这个功能基本上是线性的,并具有保释点(如果失败,返回)几乎每次调用后。 再次,没什么可通过使体积更小,没有办法真正使任何小的收获。
我还要补充一点,我的大部分功能是一对情侣“screenfuls”和我在更复杂的领域努力保持它一个“满屏”,仅仅是因为我可以看一下整个函数一次。 这是确定的,它们在自然界基本呈线性,并没有很多复杂的循环或条件怎么回事,这样的流动是简单的功能。 最后一点,我更喜欢在决定哪些重构代码,并相应地优先考虑何时应用成本效益的推理。 有助于避免永远半成品项目。
有时候我发现自己写一个平面文件(由第三方使用),它需要头,拖车,并详细记录这都是有关联。 它更容易有计算摘要的目的很长的功能比它要设计一些方案通过大量的小函数传递值来回。
有一点,我认为有一个轴承是不同的语言和工具与功能相关联的不同词汇范围。
例如,Java允许你禁止与注释警告。 它可能需要限制注释的范围,所以你保持功能,短期用于这一目的。 在另一种语言,打破了部分出到它自己的功能可能完全随心所欲。
争议:在JavaScript中,我往往只重用代码的目的创造的功能。 如果一个片段是在一个地方,才会执行,我觉得很麻烦的下面的函数引用意大利面条的文件(S)跳来跳去。 我想封促进和加强,因此不再[家长]功能。 因为JS是一种解释语言和实际的代码被通过网络发送,这是很好的保持代码小的长度 - 创建匹配的声明和引用并没有帮助(这可以被认为是不成熟的优化)。 一个函数来获得相当长的JS之前,我决定砍它为“保存功能短”的明确目的。
同样是在JS,有时整个“阶级”在技术上有许多封闭的子功能的功能,但也有工具来帮助处理。
在JS另一方面,变量的作用域为函数的长度,所以这可能会限制特定功能的长度的一个因素。
在很长的功能,我遇到不会用C写的,所以你必须决定这是否适用于你的研究或没有。 我心里有一些PowerBuilder的功能,这些功能线的几百长,如此,原因如下:
这又是明显的地方不好的编程习惯符合现实的另一个地方。 虽然任何一年级学生CS可以说那些野兽都是坏的,没有人会花任何钱使它们看起来更漂亮(因为至少在目前,他们仍然提供)。
到目前为止,最常见的我看到/写很长的switch语句,或者如果不能在这个语言的switch语句用于类型/其他半switch语句(已经提过几次)。 生成的代码是一个有趣的案例,但我在这里着重于人力编写的代码。 看着我当前的项目,不包括上述的唯一真正的长期功能(296 LOC / 650 LOT)是我使用的是早期评价一个代码生成器,我计划在未来使用的输出一些牛郎代码。 我一定会来重构它,它从该名单中删除。
很多年前,我工作的,里面有很长的函数一些科学计算软件。 该方法中使用了大量的局部变量和重构的方法保持导致每个仿形可测量的差异。 即使在这部分代码提高1%节省计算时间小时,因此函数留长。 从那以后,我学到了很多东西,所以我不能给我如何处理今天的情况说话。
速度:
考虑一个循环:
for...
func1
在循环中,所有的推动,以及跳跃可能是一个因素。
这在很大程度上与演示解决了内联函数在C99和之前非正式的是,但有些代码之前写的,或者考虑兼容性的创建,可能是长期出于这个原因。
同时内嵌有它的流动,有些是在说明内联函数链接 。
编辑:
作为一个函数的调用如何使程序速度较慢的例子:
4 static void
5 do_printf()
6 {
7 printf("hi");
8 }
9 int
10 main()
11 {
12 int i=0;
13 for(i=0;i<1000;++i)
14 do_printf();
15 }
这产生(GCC 4.2.4):
.
.
jmp .L4
.L5:
call do_printf
addl $1, -8(%ebp)
.L4:
cmpl $999, -8(%ebp)
jle .L5
.
.
do_printf:
pushl %ebp
movl %esp, %ebp
subl $8, %esp
movl $.LC0, (%esp)
call printf
leave
ret
反对:
int
main()
{
int i=0;
for(i=0;i<1000;++i)
printf("hi");
}
或反对:
4 static inline void __attribute__((always_inline)) //This is GCC specific!
5 do_printf()
6 {
7 printf("hi");
8 }
都产生(GCC 4.2.4):
jmp .L2
.L3:
movl $.LC0, (%esp)
call printf
addl $1, -8(%ebp)
.L2:
cmpl $999, -8(%ebp)
jle .L3
这是更快的。
XML解析代码往往有一个设置功能转义字符处理的投注。
因为是扩大和扩展,没有人花重新因子的功能的时候,我处理(不写)的功能变得很长。 他们只是不断增加的逻辑功能,没有思想的大图片。
我处理了很多切正糊发展...
因此,对于纸,看一个方面是保养不善计划/周期等。
一些想法没有明确地没有提到: