设为首页
收藏本站
开启辅助访问
切换到窄版
登录
立即注册
中问网首页
我的收藏
站长博客
搜索
搜索
本版
帖子
用户
第一问答网
»
论坛
›
中问网
›
问答
›
程序员偷偷爱着的9个不良编程习惯快来看看你有没有? ...
返回列表
发新帖
程序员偷偷爱着的9个不良编程习惯快来看看你有没有?
[复制链接]
11
|
0
|
2021-1-10 04:32:29
|
显示全部楼层
|
阅读模式
我们曾经都做过这样的事情:当妈妈不注意的时候,偷偷地吃糖果零食,然后导致有了蛀牙。
同样的,我们都违背过一些编程的基本规则,并且都会坚定地表示这种行为是不可取的。但我们就是偷偷爱着这些不良的编程习惯。
程序员偷偷爱着的9个不良编程习惯快来看看你有没有?
我们对所谓的编程规则嗤之以鼻,输出的代码也很糟糕——但我们依然活着。编程上帝没有下闪电劈死我们,我们的电脑也没有爆炸。事实上,只要我们能编译和发布代码,客户似乎就很满意了。
这是因为糟糕的编程不像安装电路或者摸老虎屁股那样有直接的危害性。大多数时间里它也是可以工作的。规则通常是作为一种指导或格式上的建议,并没有硬性规定一定要遵守,也不会导致代码马上死掉。当然,你的代码可能会被人耻笑,甚至可能大家公开嘲笑你,不过,这种挑战惯例的行为可以让人增加一点颠覆传统的快感,哪怕是在不经意间。
为了让问题变得更加复杂,有时候违反规则反而更好。(一般人我不告诉他!)出来的代码会更干净,甚至可能会更快和更简单。规则通常显得太过于宽泛,有技巧的程序员可以通过打破这些规则来提高代码。不要告诉你的老板,这对你的编码生涯会很有意义。
程序员偷偷爱着的9个不良编程习惯快来看看你有没有?
下面这9个编码习惯,虽然在编程规则中是被驳斥的,但我们很多人就是会不由自主地使用它们。
编程习惯No. 1:使用goto
关于禁止使用goto可以追溯到许多结构化编程工具还未面世的时代。如果程序员想要创建一个循环或跳到另一段程序中,那么他们需要输入goto后再跟一个行号。过了几年之后,编译器团队让程序员使用字符串标签取代行号。这在当时被认为是一个热门的新功能。
有的人认为这会导致“意大利面条式代码”。代码会变得不可读,并且很难理解代码的执行路径。线程混乱,缠缠绵绵到天涯。Edsger Dijkstra就三令五申地表示应该禁止这个命令,他有一份诙谐的手稿,题目为《Goto语句害人不浅》。
但绝对的分支是没有问题的。这就让人纠结了。通常,巧妙的 break 语句和return 语句可提供一个非常干净的关于代码在那个时候执行什么的声明。有时候,添加 goto 到case语句会比更恰当的多级嵌套的if-then-else语句块更易于理解。
也有反例。在苹果的SSL堆栈中的“goto fail”安全漏洞就是最好的例子之一。但是,如果我们能够仔细避免case语句和循环的一些尴尬问题,那么我们就可以嵌入良好的绝对转移,使阅读代码的人更容易明白这是怎么回事。
我们可以插入break和return 语句,让每一个人感觉更清洁和更愉快——可能得除了goto的敌视者。
编程习惯No. 2:成功避开文档
我的一个朋友有一个非常精明的老板,这位老板虽然从来没有写过任何代码,但却秉持着每一个功能都必须包含在文档中的理念。哪个程序员不提供注释,那么他就会受到惩罚。
所以,我的朋友在他的编辑器中联入了一个有点像人工智能的玩意儿,于是乎,他的每一个功能就都有几行“文档”了。因为这位精明的老板还不够聪明到能理解这些注释其实啥意思也没有,所以我的朋友逃过一劫。他的代码常常被作为正式文档。我想,他应该快要升职了!
许多函数方法,甚至一些类或多或少都能自文档化。冠以insertReservation或cancelReservation或 deleteAll 等名称的函数并不需要多此一举来解释它们的作用。为函数取一个正确的名字往往就足够了。事实上,这比写一段长长的注释要好,因为函数名可以出现在代码中的其他地方。而文档只能默默地呆在某个角落。自文档化的函数名可以改进它们出现的每个文件。
在有些情况下,写文档甚至会导致情况变糟。例如,当代码瞬息万变,团队像疯了似的重构的时候,文档会产生分歧。代码是这样写的,但文档解释的还是四五个版本以前的情况。这类“过时”的文档通常位于代码顶部,有的人会在这里对代码应该发生什么作一个美好总结。因此,尽管重构团队已经仔细修改了相关的注释,但还是会遗漏文件顶部的这段“美好总结”。
当代码和文本出现分歧的时候,注释就变得毫无价值,甚至会产生误导。在这样的情况下,良好的自文档化的代码显然胜出了。
程序员偷偷爱着的9个不良编程习惯快来看看你有没有?
编程习惯No. 3:一行写太多代码
老板突然发神经地给团队发了一封讨厌的邮件:为了执行非常严格的风格规定,我们大家都必须重写我们的代码。最神奇的要求是:每个行为或步骤或子句必须各自成行。你不能使用点语法连续调用函数。在一个分支语句中,你不能有两个及以上返回布尔值的子句。如果要定义变量,那么另起一行。如果你正在做一个复杂的计算,那么不要使用括号。每个片段也自成一行。
他认为他的这个法令将能使调试变得更加容易。就像你单步调试代码一样,调试器会一个动作一个动作地前进。这样就不会卡在某一行。而且更容易执行。
但是这样一来,键盘上的回车键烦不胜烦,因为我需要不断地插入行。而且我敢肯定,老板因此还可以到处吹嘘他的团队能写多少行代码。
有时在同一行中声明一堆变量反而更容易;有时把所有的布尔子句放在一起反而更简单——一切都能变得更加紧凑。那也意味着,我们可以在屏幕上看到更多的逻辑而无需滚动鼠标。更易于阅读就意味着理解起来更快。这才是简单的精粹。
编程习惯No. 4:不声明类型
那些热爱类型化语言的人认为,如果为每个变量添加明确的数据类型声明,就可以写出更好的、没有错误的代码。花一点时间来拼写类型,能帮助编译器在代码开始运行之前标志愚蠢的错误。可能会让人觉得痛苦,但很有帮助。这是编程中停止bug的一种有备无患的方法。
但是时代变了。许多较新的编译器完全可以智能地通过查看代码来推断类型。它们会向后和向前浏览代码,直到可以肯定这个变量是string 还是int,抑或其他。如果这些被查看的类型不成队列,那么错误标志就会点亮。因此再也不需要我们输入变量的类型了。
这意味着我们现在可以在代码中省略掉一些最简单的声明。代码更清洁,而且阅读代码的人也猜得出for循环中命名为 i 的变量表示一个整数型。
编程习惯No. 5:摇摆不定的代码
有的程序员在代码上特别优柔寡断,犹豫不决。先是一开始将值存储为字符串,然后又解析成整数。接着又转换回字符串。这是非常低效的,你甚至可以感觉到CPU在咆哮这种浪费负载的行为。聪明的程序员之所以能快速地编码,是因为他们事先会设计架构,以尽量减少转换。他们的代码能更快地运行是因为他们有一个良好的规划。
但是,不管你信不信,这种摇摆不定的代码有时候也是有意义的。比如说,你有一个非常棒的库,在它专有的黑盒子里能做无数智能的事情。如果库需要字符串的数据,那么你就给它字符串,即使你刚将这个数据转换成为整数型。
当然,你可以重写所有的代码,以尽量减少转换,但是这需要时间。而且,有时候让代码稍微多花点额外时间来运行也未尝不可,因为重写代码需要耗费我们更多的时间。有时,背负这样的技术债务比一开始就正确构建的成本要更低。
有的时候,库不是专有的代码,但那些你以前全部自己写的代码是你独有的。有的时候,再次转换数据比重写库中的所有代码要快得多。所以,就让它这样吧,就让代码摇摆吧。
程序员偷偷爱着的9个不良编程习惯快来看看你有没有?
编程习惯No. 6:编写你自己的数据结构
有一个标准规则是,程序员在完成数据结构课程的第二年,不应该写用于存储数据的代码。基本上我们需要的所有的数据结构,已经有人写好了,而且其代码已历经多年的测试和再测试。它和语言捆绑在一起,而且常常是免费的。你的代码只能造就bug。
但有时你会发现数据结构库有点慢。有时它们会迫使我们使用标准的,但于我们的代码却是错误的结构。有时库会把我们推向在使用结构之前重新配置数据的地步。有时库会包含一些所谓有备无患的保护功能,如线程锁,但其实我们的代码并不需要。
如果遇到这种情况,那么就应该着手写我们自己的数据结构。这或许能让你做得更快,做得更多。而且代码会变得更清洁,因为我们不会包括那些多余的用于格式化数据来完成一些功能的代码。
编程习惯No. 7:在中间打破循环
有一个规则制定小组宣称,每个循环都应该有一个“常量”,也就是说当这个逻辑语句为true的时候,循环一直执行。当常量一定不会是true的时候,循环才会结束。这是考虑复杂循环的好方法,但它会导致愚蠢的禁令——例如禁止我们在循环中间使用return 和break 语句。这一条也包含在禁止goto语句的规则中。
这个理论是好的,但它通常会导致更复杂的代码。请看下面这个简单的案例,遍历数组,将找到的元素传递给test函数,并将该元素返回:
while (i<a.length){
...
if (test(a
) then return a
;
...
}
“循环常量”爱好者会要求我们增加一个布尔变量,命名为notFound,然后这样使用:
一、数while ((notFound) && (i<a.length){
...
if (test(a
)) then notFound=false;
...
}据图表化
如果这个布尔值能够合理地命名,那么这就是一段很棒的自文档化的代码,更易于大家理解。但这也增加了复杂性。这意味着你需要分配另一个局部变量,并堵塞寄存器,因为编译器也许还不能足够智能到解决这个问题。
有时候,一个goto 语句或一个跳转会更干净利索。
编程习惯No. 8:使用短变量名(i和x和and也是有意义的)
Edgar Allan Poe这位诗人和小说家曾经说过,在一个故事中的每一个词都应该是有内涵的。编码规则也强调如此。变量名应该说明这个变量的所作所为。那些使用驼峰式大小写的方法来写变量名,以表达关于变量细节的Java程序员深以为然,于是一个又一个疯狂长度的变量名出炉了。有些程序员写的变量名,会组合五六个甚至更多的词语。
但有的时候,使用单个字母作为变量名反而会更方便。有时在循环迭代中只使用i或j会更简单。有时使用字母a代表array ,l代表list会更便捷,即使是字母l和数字1看上去很难辨别。
正如这篇文章前面鼓励的是自文档化的代码,而非长长的注释。在上述情况下,单个字母的变量名也是自文档化的。字母 i 是通用的迭代器。只要是程序员立刻就会懂。
程序员偷偷爱着的9个不良编程习惯快来看看你有没有?
编程习惯No. 9:重新定义运算符和函数
一些最有趣的编程语言允许你去做一些特别诡异的事情,例如重新定义元素的值,就如同常量一般。例如Python,你可以输入TRUE=FALSE(在Version2.7及之前的版本)。这并不会产生某种逻辑崩溃,或导致宇宙终结——仅仅只是互换了TRUE和FALSE的含义。你也可以在C预处理器和一些其他语言中玩玩类似于这样的危险游戏。还有一些语言允许你重新定义运算符,如加号。
当然这是延伸了,不过有一个观点是,在一个大的代码块内,当重新定义一个或多个所谓的常量时,速度会更快。有时老板会要求代码做一些截然不同的事情。当然,你可以修改代码的每个事件,或者,你可以重新定义。这让你看上去像一个天才。不必重写一个庞大的库,只需翻转一下,就可以做相反的事情了。
这9个习惯就都在这儿了。千万不要轻易尝试,不管它看上去有多牛掰。太危险了——真的,这是实话。
回复
使用道具
举报
返回列表
发新帖
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
|
立即注册
本版积分规则
发表回复
回帖后跳转到最后一页
千问
主题
0
回帖
4882万
积分
论坛元老
论坛元老, 积分 48824836, 距离下一级还需 -38824837 积分
论坛元老, 积分 48824836, 距离下一级还需 -38824837 积分
积分
48824836
加好友
发消息
回复楼主
返回列表
问答
热门排行
1
请问,抚恤金都包括什么啊?
2
怎样看cf视频
3
会计实务基础是不是再考会计中是最难的。有没有课程先讲会计基础的培训,我想早点学习。
4
最近非常浮躁,非常爱发脾气,连玩个游戏都会发火,总感到不安,现在就我自己一个人,谁能告诉我下原因。
5
.什么是个性化教育?
6
阐述一下几何奇异摄动理论?
7
我是学生,放假想在长沙购买从武昌到西宁的火车票。可以异地购买么?异地购买具体是怎样的操作?
8
请问,仲裁书送达?
9
网上波司登假货多不多?
10
汽车大灯 切换到远光自己弹回到近光是怎么回事
11
请问,请帮忙看看我们公司这样做是否合理?期待各位的回复,谢谢!!!?
12
请教三厢车有什么便宜实惠的么?最好省油,性能好点,有牌子,最好在5万以下,自动挡。谢谢。。。
13
EMC磁盘陈列是什么
14
请问,关于赔偿问题?
15
远程网络会议有没有免费的?
16
手机通讯录和短信地导出
17
请问,7级工伤被炒有就业补助金么?
18
搞暖通制冷的在烟台那些单位比较好??
19
请问,合同到期公司不续签如赔偿?
20
请问,劳务工被用工单位退回派遣单位后,用工单位如何支付赔偿金?没有同工同酬如何申诉?
21
请问,公司欠员工工资以及不给交保险问题?
22
索尼T707手机,不知道为什么在每次开机后和待机有十分钟左右时就会弹出(服务器未认证 继续进行安全连接)
23
请问,给公司造成损失扣掉剩余工资,订货合同签的不是自己的名字。?
24
请问,急切等待回复!!!?
25
小南门以前的波特曼咖啡改什么店啦
26
武林外传游戏号的密保卡丢了怎么办?
27
请问,原劳动仲裁的裁决已经恢复法律效力??
28
梦幻西游压缩打造问题 懂的来
29
请问,打工已经5个多月了,一直没签劳动合同,也没有保险。?
30
济宁11 12月份婚纱照都有什么活动
31
盗墓笔记全集TXT下载
[email protected]
谢谢 要到最新的。最新。。。。。。
32
IE8为什么安装不了?在线升级不行,用360升级也不行,下载了IE8的升级软件也不行,怎么办?
33
如何学好API,我的教材是《windows程序设计第5版》,我发现API函数太多,死记也记不住多少。
34
写真机打印60x80cm的cad图怎么打印
35
请问,我在公司干了十个月没订合同怎么办?
36
户口在橄榄湾可以到苏州新洲幼儿园读书吗
37
我在在 广州-云浮高速上收到2张超速罚单,但是2张罚单时间差距不超过3分钟,我应该如何处理2张罚单呢?
38
本人最近驾车去了几趟常州武进,就被违章罚款1000多元,请熟悉武进的朋友告知下具体注意事项,谢谢!
39
请问,请律师帮我[在线等]?
40
冬天要喝什么茶
41
请问,我是一名国营企业的职工,30年工龄.03 年?
42
请问,我想申请劳动仲裁单现在原单位都放假了没人?
43
请问,职务工资的比例是多少?
44
谁帮我弄个非主流伤感群组、越伤感越好!谢谢
45
请问,这样签合同合法吗?
46
请问,用人单位自己规定的处罚制度是否合法。?
47
江西吉安安福农村户口个人怎样购买社保
48
请问,单位工作失误造成的伤害和损失如何处理?
49
瓶盖打标机厂家哪里有?啤酒瓶盖打标机厂家
50
怎样删除qq群
51
杰克琼斯旗下有哪些公司?有个叫杰克福克斯的品牌和杰克琼斯是什么关系?
52
我总是喝过期的白开水,会有什么危害后果啊?
53
找一首 现代民谣,欧美的,音乐达人进
54
咸宁职业技术学院在哪呀?
55
谁能帮我做点炫舞图片的Ps
56
我从电脑上截了一断图文,复制到手机里,打开手机一看图文太大无法显示,用什么办法
57
PE管十大品牌有哪些
58
血浆粘度2.0 mPA.S高么?另外全血高切相对指数1.95偏低么?两个指标是一次检查结果?对身体有啥影响么?
59
请问,关于08年征兵的一些条件问题?
60
有点纠结于ipodtouch4还是nano5代
61
现在是2010 11月。请问几号过年?离过年还有多少天??
62
适合男生用的唇膏
63
请问,关于辞退员工?
64
家装内墙要刷乳胶漆,但是定不下来用立邦还是多乐士,我们这多乐士貌似贵的离谱。
65
求帮助 请大侠们进来指点指点
66
SKHP什么牌子
67
请问,能否算工伤?如果算是工伤,应享受什么待遇?
68
有人要当兵,其他人能做责任人吗?
69
请问,赔偿事宜,可以赔多少?
70
请问,七岁小朋友?
71
要敢篇论文,请各位帮帮忙,美学有哪些文献
72
什么叫智能手机?
73
请问,我07年拿的驾驶证小车证今天发现有06年摩托违规罚款高达4000多元转到我小车驾证上怎么办?
74
请问,工伤终止劳动合同补偿规定?
75
请问,我怎么样才能要回我的工资?
76
国际邮件LC641431718AU现在在哪里?
77
适合做铃声的英文歌
78
大家帮我看看这配置的电脑能卖多少钱?
79
请问,离婚请律师帮帮我?
80
请问,什么情况才能算是猥亵罪?
81
企业QQ1.0版本
82
什么是提单日
83
想换个发型 整个帅点的 最好不烫 照片在下边 急
84
请问,山东济南是否有齐鲁律师事务所,是否有王勇律师?请帮忙解答一下.谢谢?
85
下列程序输出的是
86
请问,劳动合同到期,公司不续签了,怎么赔偿,?
87
谁有跑跑卡丁车的多开器啊?哪位大哥传给我个啊?
88
我是大营的 网上购物 想请教下大营申通在哪?
89
问一个问题,往国外(韩国)发传真,明明那里给信号了,我这里也暗了信号键,为什么我这里传不过去呢?
90
在一张厘米、宽14厘米的纸中剪下一个最大的正方形,剩下的周长是多少厘米?
91
请问,劳动争议、劳动合同?
92
请问,户口大问题?
93
过氧化氢(双氧水)与铜反应不?
94
WLK和CTM里痛苦术和暗牧哪个好
95
我是西昌的,我男友换膀胱炎很久了,我们这边治疗这个病贵不贵啊?
96
听说上海的对外汉语学校有免费试听课程,满意再报名学习的是哪家啊?
97
关于工厂评估
98
癫痫是遗传的疾病么!怎么以前没听说过啊!我还想要个孩子呢!
99
为什么我每次进DNF都是进一会就断网了,每次都还是早上的一段时间.注意是断网,不是中断连接