说编程是一门艺术一点都不过分,无论从代码中体现的思维还是给人的视觉感受都无可挑剔。当我们看别人的代码时,第一眼感受到的就是作者的编码风格,根据编码风格大致可以感受到程序的好坏。良好的编码风格看起来很有艺术的感觉,读起来容易,易维护,出问题的几率也小。而不良的编码习惯导致代码很难读,思维不够清晰,维护成本高,可能潜藏着更多的BUG。

艺术是用来欣赏的,但实际项目中需求的随意不间断无规则变动导致项目不可能成为艺术。虽然成不了艺术,但也不该让人一眼就看到肮脏错乱无规则的代码,下面都是从实际项目中看到的一些问题,这些问题不是需要有多好的基础、多好的技巧才能做到,只要留心注意下,每个人都可以做到,这里提出来一起探讨。

1、页面过长

上面的截图为某个控制器的长度,还是删除过不少的,2211行是个什么概念,如果一屏可以显示40行代码,也就是要翻50多屏才翻完。想要找到某个片段并不容易,也可以想象到其中要么是方法太长,要么是函数很多。如果是方法太长,说明耦合性很高,可以把一些片段写成方法独立出去,也方便其他地方调用;如果是方法太多,则说明可以将功能进一步按模块细分,一个控制器文件做一个模块的事情,如果模块太大则细分为更小的模块。

2、排版混乱

先看看上图,看能不能发现什么问题?如果要给session加一个配置信息,很有可能写在uri的上面,可仔细一看,session的数组结束于uri上面。不怪他人不小心,只怪这括号太有诱惑力。还有需要注意下tab键的个数,至少通过排版可以清楚的看到层级关系。还有一些代码写一行空两行,空格时而三个时而五个,TAB错综复杂,注释一片一片等等,这些直接影响到程序的阅读。想要写好程序,先从排版开始吧,找一些好的开源类库看看错落有致、整洁规范是个什么样子。

3、注释杂乱无章

排版注释这些都是分不开的,注释不好也直接影响到程序的阅读,我们常习惯拷贝,很多时候直接连注释也一并拷贝过来,可注释在这里根本就不适用,那这些注释就是没用的、无效的;还有一些注释就是一些废话,太简单的语句一看就懂的语句就不必加注释了,注释太多容易导致废话太多,适可而止就好;还有一些注释可能根本就是错误的,看到想骂人的那种。。。

上面的代码一看就知道是饱经磨砺,很多调试的程序被注释了,这是可以看到的。还有很多调试的注释可能还在系统中运行,每天产生一些日志文件、日志信息等。其实类似的这些垃圾代码是可以删掉的,留在上面影响程序的阅读,代码看起来很乱,影响阅读者的心情。

4、奇特的命名

写程序时给变量、函数、常量等命名那是很平常的事,常用的就大小驼峰、下划线分隔等,基本上采用英文单词来表单名称的含义,直接用拼音、拼音加英文的方式来命名应该是少数情况,感觉还是有点难理解,中间得停顿几下才知道表达的什么意思。还有一些常量采用大写字母这应该属于国际标准吧,可还是看到直接使用小写字母的情况,一下子都没反应过来。如果要找的话,各种奇葩的名称应该都可以找到。

命名是一种学问,个人可以慢慢去研究。简单说下自己的命名方式,函数名采用小写字母下划线分隔方式;类属性、类方法采用小驼峰;类名根据系统中大部分情况来,有下划线分隔的,有大驼峰的,也有其他方式的;变量统一采用小写字母下划线分隔方式。单词个数不要过多,超过3个就有点多了,超过5个那就太多了。类名可以用名词,方法可以用动词。

5、循环嵌套

嵌套的情况可能很多人存在,因为这种逻辑判断是顺利成章的事,IF什么条件,ELSE什么条件,满足条件后还有条件就继续嵌套,这样子越嵌越深、越写越复杂,想要找个某个块并不容易,修改起来也很困难。 其实这个问题可以换种思维来写,比如要判断是否为AJAX提交:

if(! $this->input->is_ajax_request()) { //这里写ELSE的内容 } //这里就表示该请求为AJAX请求

按照这种思维写下去可以减少条件嵌套,嵌套的耦合性比较高,嵌套的越多出问题的可能性越大,也可以尝试通过一些其他的方式来对嵌套解耦。

6、多环境问题,配置问题

配置的问题存在很多地方,数据库配置直接写在文件中,类的一些配置信息直接写在属性中,当要修改时是十分不方便的。以及多环境的配置,测试环境请求测试地址,生产环境配置生产环境配置,能灵活的做到不影响。关于多环境、初始化等在本博客CodeIgniter初始化中有提到过,思维对所有项目应该都适用。

7、生产环境上的测试方法、空方法、没用的方法、大规模注释的代码

看看生产环境,运行久了之后少不了有些测试方法、大量注释的代码留在上面,是什么原因呢?上面的方法直接就可以看出是测试方法,也许有些时候并不是那么好分辨是否为测试方法,是否为有用的方法,后面的人接手后也糊里糊涂的,更加不敢动,特别是在一些比较重要的系统中,迷糊的情况下宁愿让它继续留在上面也不敢直接干掉它。 有些时候,事情比较急的时候我们可能会直接去注释掉某个片段,写个测试方法等,但事情处理完之后能不能把垃圾清理干净?不要想着以后会再去处理,99%都不会了。

8、日志记录问题

为了调试,最常用的手段还是打印,而生成环境不方便打印,所以变成了记日志。记日志有两个需要考虑的地方,一是记录在哪里?很多项目是直接记录在根目录,比较危险的,直接就可以访问到了,所以不要把日志记录在根目录下。二是怎么记?常用的方法就直接file_put_contents,然后不断的追加,最后一个日志文件加到几G。。。产生的原因还是跟上面一样,这些信息只增不减,慢慢的日志文件越来越多,直到产生问题。

9、不做任何判断

在开的发时候常常从数据库读取出记录后,不管是否取数据成功就直接用;获取到的变量不管有没有设置,有没有值也就直接用,不做任何判断性的逻辑,一个接口不成功也返回成功,一个操作提示操作成功实际却失败了。这个问题是很常见的,直接影响到程序的健壮性。做程序的不能这样子,我们得告诉机器成功该怎么处理,取不到数据该怎么处理,这是程序员最基本的要求。

简单的列举了近段时间在项目中看到的一些问题,这里不针对具体的人,主要还是抛出问题,引起重视。也许被这样的问题困扰过、吃过亏之后就记住了。

总之,不论自己还是他人的代码,读代码的时间总是要比写代码的时间多得多。读的过程很有可能碰到上面这些问题,于是心底一遍一遍的谴责作者,如果不想被谴责,就注意一下这些问题吧。

PHP被忽视的编码规范相关推荐

  1. iOS:Cocoa编码规范 -[译]Coding Guidelines for Cocoa

    转载:http://blog.csdn.net/houseq/article/details/27369043 原文地址:https://developer.apple.com/library/mac ...

  2. python编码规范简单总结

    编码规范方面 一.命名规范 变量名通常由字母,数字,下划线组成; 数字不能作为变量名开头; 不能以python中的关键字命名; 变量名要有意义; 不要用汉字和拼音去命名; 变量名要区分大小写; 推荐使 ...

  3. Vue.js 组件编码规范

    目标 本规范提供了一种统一的编码规范来编写 Vue.js 代码.这使得代码具有如下的特性: 其它开发者或是团队成员更容易阅读和理解. IDEs 更容易理解代码,从而提供高亮.格式化等辅助功能 更容易使 ...

  4. 嵌入式C语言编码规范参考

    1 总则 1.1 目的 本规范主要目的是定义基于嵌入式C 编码的总体规范,确保编码的规范性,提高程序的可维护性.通过遵循共同的编码规范,程序开发人员可以保持代码一贯的风格,提高代码编写的可读性和使用的 ...

  5. [Cocoa]苹果 Cocoa 编码规范

    [Cocoa]苹果 Cocoa 编码规范 罗朝辉(http://blog.csdn.net/kesalin) CC许可,转载请注明出处 本文档下载:点击这里 > Code Naming Basi ...

  6. [Cocoa]苹果Cocoa编码规范

    [Cocoa]苹果Cocoa编码规范 翻译:罗朝辉 (http://www.cnblogs.com/kesalin/) 本文遵循"署名-非商业用途-保持一致"创作公用协议 本文档下 ...

  7. JavaScript最全编码规范

    转载: JavaScript最全编码规范 类型 ●基本类型:访问基本类型时,应该直接操作类型值 ●string ●number ●boolean ●null ●undefined var foo = ...

  8. 【C++】Google C++编码规范(三):智能指针

    [C++]Google C++编码规范(一):作用域 [C++]Google C++编码规范(二):类 std::unique_ptr std::unique_ptr是C++11标准里新推出的智能指针 ...

  9. 《阿里巴巴编码规范(JAVA)》学习认证考后感

    image.png <阿里巴巴 Java 开发手册>是阿里巴巴集团技术团队的集体智慧结晶和经验总结,经历了多次大规模一线实战的检验及不断完善,系统化地整理成册,回馈给广大开发者. 本手册的 ...

最新文章

  1. 从0实现一个tinyredux
  2. 合同模板布局html,套打模板制作(合同类模板)
  3. 关于Timer的用法,先简单记下,稍后编辑
  4. SAP S/4 HANA与SAP Business Suite/R3(ECC)的区别
  5. linux别名文件位置,Linux系统内置alias别名文件路径
  6. CCF NOI1035 数根
  7. 骗人的数学题,那消失的1块钱到底被谁拿走了
  8. Python数据清洗 - 洗什么?怎么洗?看完就明白了
  9. 电子商务有哪些相关工作?
  10. 零基础如何优雅入门“网红”Python?小白必看的MicroPython视频合集:从入门到精通!...
  11. namenode 无法启动之每次开机需要重新格式化-tmp
  12. 开发环境、生产环境、测试环境的基本理解和区别
  13. photoshop标尺工具_RulersGuides.js – Web上的Photoshop样式标尺和指南
  14. 台式计算机强制关机,台式机如何强制关机
  15. Linux之pure-ftpd安装和使用
  16. html调用电脑/手机摄像头拍照上传+百度文字识别
  17. 洛谷.3733.[HAOI2017]八纵八横(线性基 线段树分治 bitset)
  18. 遥感卫星不同光谱带介绍(Band 1 - Band 13)
  19. SIM7600怎么打电话,怎么电话通信
  20. 地图可视化不只是pyecharts.map

热门文章

  1. 韵镖侠登录不上 显示无法连接到服务器,什么是韵镖侠?韵镖侠是做什么的?...
  2. 文件上传获取file的全路径名_Java中的File类与I/O流
  3. 小程序实现长按删除图片
  4. Lua 语言 快速入门
  5. ASA防火墙外部web应用端口与默认审查协议相冲突的解决方法
  6. 程序集信息设置.net
  7. RichTextBox中表格不能折行的问题
  8. ThinkPHP 数据库操作之数据表模型和基础模型 ( Model )
  9. Spring自动装配Beans
  10. HMAC-MD5算法原理及实现