提高代码可读性的10个技巧

在本文中,作者从注释,缩进,代码分组,命名方式等方面,介绍了10个提高代码可读性的技巧,供读者学习和借鉴。 


以下为译文:


如果你的代码很容易阅读,这也会帮助你调试自己的程序,让工作变得更容易。


代码可读性是计算机编程领域的一个普遍课题,这也是作为开发人员首先要学习的东西。本文将详细介绍几个编写可读代码的最佳实践。


1. 注释和文档


IDE(集成开发环境)在过去的几年里取得了很大的提升,也让你的代码比以前更容易进行注释了。注释会遵循一定的标准,这就允许IDE和其他工具以不同的方式来使用它们。 
考虑一下这个例子: 


 

在函数定义中添加的注释可以在使用该函数时进行查看,即使是在其他文件中使用该函数也同样可以查看注释。


下面是另一个例子,从第三方库调用函数: 


 

在这些示例中,使用的注释(或文档)的类型基于PHPDoc,而IDE则是基于Aptana


2. 一致的缩进


你可能已经知道需要对代码进行缩进,然而,同样值得注意的是,保持缩进样式一致也是很重要的。 


缩进方式不止一种,下面是两个比较常见的例子。


方式1:


function foo() {if($maybe){do_it_now();again();} else{abort_mission();}finalize();
}

方式2:

function foo(){  
if($maybe) {  do_it_now();again();}else{  abort_mission();}finalize();
}


我曾经使用方式2来编写代码,但最近切换到方式1。这只是一个偏好的问题,没有一种风格是“最好”的,不需要每个人都来遵循。实际上,最好的风格是一致的风格。如果你是团队的成员,或者你正在为一个项目编写代码,那么你应该遵循该项目中正在使用的样式。

当然,缩进样式并不总是完全不同,有时,它们也会混合不同的规则。例如,在PEAR编码标准中,大括号“{”会与控制结构保持一致;但是,它们也会被放在函数定义后的下一行。


PEAR Style


function foo()
{ //placed on the next lineif($maybe) { // placed on the same linedo_it_now();again();} else {abort_mission();}finalize();
}


另外,请注意,这里使用的是四个空格,而不是使用tab键进行缩进。


这是一篇维基百科的文章,有不同缩进风格的样式。


3 避免冗余的注释


对你的代码进行注释是很棒的行为,然而,它可能是过量的,或者是冗余的。来看这个例子:


// get the country code
$country_code = get_country_code($_SERVER['REMOTE_ADDR']);
// if country code is US
if ($country_code == 'US'){
// display the form input for state
echo form_input_state();
}


当内容很显而易见的时候,进行重复的注释是很没有效率的。


如果你必须对该代码进行注释,那你可以简单地将其合并到一行中:


// display state selection for US users
$country_code = get_country_code($_SERVER['REMOTE_ADDR']);
if ($country_code == 'US'){
echo form_input_state();
}


4. 代码分组


通常情况下,某些任务需要几行代码,那么把这些任务放在单独的代码块中是一个好主意,这会让它们之间有一些空间。


这里有一个简化的例子:


// get list of forums
$forums = array();
$r = mysql_query("SELECT id, name, description FROM forums");
while ($d = mysql_fetch_assoc($r)){
$forums[] = $d;
}
// load the templates
load_template('header');
load_template('forum_list', $forums);
load_template('footer');


在每个代码块的开头添加注释,视觉上看起来就是分离的代码块了。


5. 一致的命名方案


PHP有时会犯不遵循一致命名方案的错误:


strpos() vs. str_split() 
imagetypes() vs. image_type_to_extension()


首先,命名应该有单词边界。有两种比较流行的选择:


camelCase(骆驼拼写法):除了第一个单词,每个单词的第一个字母都大写。 
underscores(下划线):在单词之间加下划线,例如:mysql_real_escape_string()。


类似于前面提到的缩进方式,命名方式也会有不同的选择。如果现有的项目遵循一定的方案,那么你应该使用它。此外,一些语言倾向于使用一种命名方案。例如,在Java中,大多数代码都使用camelCase方式来命名,而在PHP中,大部分代码都使用underscores命名方式。


当然这些方式也可以混合,一些开发人员倾向于使用underscores方式来处理过程函数和类名,但却使用camelCase方式来对类方法命名:


classFoo_Bar{
publicfunctionsomeDummyMethod(){
}


因此,没有所谓的“最佳”风格,仅仅是需要一致的风格。


6. DRY Principle(干燥原理)


DRY意思是不要重复,即DIE: Duplication is Evil.(复制是邪恶的) 


原则如下:


“每一条知识都必须在一个系统中有一个单一的、明确的、权威的表示。”


大多数应用程序(或一般计算机)的目的是使重复的任务自动化,所以这项原则应该在所有代码中体现出来,甚至是web应用程序。同样的代码不应该一次又一次地重复。


例如,大多数web应用程序由许多页面组成,很有可能这些页面包含公共元素,就比如页眉和页脚。然而,将这些页眉和页脚粘贴到每个页面并不是一个好方法。下面是Jeffrey Way解释如何在CodeIgniter中创建模板。


$this->load->view('includes/header');   
$this->load->view($main_content);   
$this->load->view('includes/footer');


7. 避免嵌套太深


嵌套过多会使代码更难读取和跟踪。


functiondo_stuff(){
// ...
if (is_writable($folder)){if ($fp = fopen($file_path, 'w')){if ($stuff = get_some_stuff()){if (fwrite($fp, $stuff)){
// ...}else{returnfalse;}}else
{


为了便于阅读,通常可以修改代码以减少嵌套级别:


functiondo_stuff(){
// ...
if (!is_writable($folder)){
returnfalse;
}
if (!$fp = fopen($file_path, 'w')){
returnfalse;
}
if (!$stuff = get_some_stuff()){
returnfalse;
}
if (fwrite($fp, $stuff)){
// ...
}else
{
returnfalse;
}
}


8. 限制行的长度


眼睛在阅读高而窄的文本时会更舒服,这正是报纸文章看起来是这样的原因: 


 


避免编写太长的代码行是一个很好的做法。


//bad
$my_email->set_from('test@email.com')->add_to('programming@gmail.com')->set_subject('Methods Chained')->set_body('Some long message')->send();   
// good
$my_email   
->set_from('test@email.com')    ->add_to('programming@gmail.com')    ->set_subject('Methods Chained')   ->set_body('Some long message')   ->send();   
// bad
$query= "SELECT id, username, first_name, last_name, status FROM users LEFT JOIN user_posts USING(users.id, user_posts.user_id) WHERE post_id = '123'";   
// good
$query= "SELECT id, username, first_name, last_name, status    FROM users   LEFT JOIN user_posts USING(users.id, user_posts.user_id)    WHERE post_id = '123'";


而且,如果有人打算从终端窗口读取代码,比如Vim用户,那么将行长度限制为大约80个字符是一个比较好的做法。


9. 文件和文件夹结构


从技术上讲,可以在一个文件中编写整个应用程序的代码,但这一定是阅读和维护代码的噩梦。


在我的第一个编程项目中,我有创建“include files”的想法,然而还没有完全构建起来。我创建了一个“inc”文件夹,其中有两个文件db.php和functions.php。但随着应用程序的增加,函数文件也变得非常庞大,越来越不可维护。


最好的方法之一是使用框架或模仿文件夹结构。这就是CodeIgniter的样子: 


 


10. 一致的临时命名


通常,变量应该是描述性的,并且包含一个或多个单词。但是,这并不一定适用于临时变量,它们可以像一个字符一样短。


对于相同类型的临时变量,使用一致的命名是很好的做法。下面是我在代码中使用的一些例子:


// $i for loop countersfor
($i= 0; $i





本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/525729.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

内蒙古一级计算机考试时间2015,2017年内蒙古计算机一级考试报名时间

2017年内蒙古计算机一级考试报名时间一级分为DOS版和Windows版,考核应试者计算机基本知识和使用微机系统的初步能力,那么,2017年内蒙古计算机一级考试报名时间是什么时候?一起来看看:2017年内蒙古计算机一级考试报名时…

去掉数组最后一个元素_leetcode 34. 在排序数组中查找元素的第一个和最后一个位置每天刷一道leetcode算法系列!...

作者:reed,一个热爱技术的斜杠青年,程序员面试联合创始人前文回顾:leetcode1. 两数之和--每天刷一道leetcode系列!leetcode2. 两数相加--每天刷一道leetcode系列!leetcode3. 无重复字符的最长子串--每天刷一…

6个月清洗近千亿条微信支付交易记录,他们要搞什么大事情?

本文转载自腾讯技术工程官方号背景:2013年8月,微信红包上线。2014年春节微信红包引爆社交支付。2015年春晚红包摇一摇,推动微信红包在全国迅速普及。此后,每逢节假日或特殊日子,人们都会自主的兴起发红包,使…

右下角文字如何写_如何提取任意小程序的小程序路径

这几天我在写关于公众号和小程序互通的文章,在公众号跳转小程序的设置中有一个信息绕不过去,那就是小程序路径,对于非开发人员,如何轻松获取小程序路径是本文所讲述的内容本文内容本文通过具体截图文字描述,获取某个小…

基于Docker持续交付平台建设的实践

导读:中国五矿和阿里巴巴联手打造的钢铁服务专业平台五阿哥,通过集结阿里巴巴在大数据、电商平台和互联网产品技术上的优势,为终端用户带来一站式采购体验。本文是五阿哥运维技术团队针对Docker容器技术在如何在持续交付过程中探索和实践&…

计算机课件比赛总结,课件制作比赛活动总结

【www.gz85.com - 投篮比赛活动工作总结】课件制作比赛,是对计算机多媒体等辅助手段的一次检阅,也有力地促进了制作多媒体课件技艺的提高。下面是小编为您整理的“课件制作比赛活动总结”,仅供参考,希望您喜欢!更多详细…

设置pandas显示行数_Pandas这样来设置,做数据分析舒适百倍

在日常使用pandas的过程中,由于我们所分析的数据表规模、格式上的差异,使得同样的函数或方法作用在不同数据上的效果存在差异。而pandas有着自己的一套「参数设置系统」,可以帮助我们在遇到不同的数据时灵活调节从而达到最好的效果&#xff0…

深度解析京东个性化推荐系统演进史

在电商领域,推荐的价值在于挖掘用户潜在购买需求,缩短用户到商品的距离,提升用户的购物体验。京东推荐的演进史是绚丽多彩的。京东的推荐起步于2012年,当时的推荐产品甚至是基于规则匹配做的。整个推荐产品线组合就像一个个松散的…

模拟微信支付服务器测试,专栏 - 腾讯WeTest-All Test in WeTest

一、异常压测场景模拟说明:压测服务器具备自动完成初始化(支持快速扩缩容),初始化后均已支持:stress 、tc等工具(不需安装)1.使用stress模拟压力(CPU/内存/IO繁忙)a.如何使用:cpu高负载模拟:stress -c 44 -t 60内存高…

网易容器云平台的微服务化实践

摘要:网易云容器平台期望能给实施了微服务架构的团队提供完整的解决方案和闭环的用户体验,为此从 2016 年开始,我们容器服务团队内部率先开始进行 dogfooding 实践,看看容器云平台能不能支撑得起容器服务本身的微服务架构&#xf…

逐鹿工具显示服务器错误连接不上怎么解决,win7系统安装逐鹿工具箱提示“error launching installer”错误的解决方法...

win7系统使用久了,好多网友反馈说win7系统安装逐鹿工具箱提示“error launching installer”错误的问题,非常不方便。有什么办法可以永久解决win7系统安装逐鹿工具箱提示“error launching installer”错误的问题,面对win7系统安装逐鹿工具箱…

唯品会2017年双11大促技术保障实践,全域提供25万QPS服务能力

作者简介:刘惊惊,唯品会业务架构部高级架构师,负责唯品会电商平台的用户系统,营销系统和库存系统的架构设计工作。2016年加入唯品会,参与了唯品会电商系统的大重构,负责多个核心系统的梳理和大促准备。 张…

iis7 mysql_windows 7 下搭建php开发环境(windows7+IIS7+php+mysql)

首先需要说明的是,基于IIS v6.0/v7.0(2008),可以支持的脚本相当完整,不仅支持Linux无法支持的asp/asp.net,还可以安装php、mysql、zend实现php环境。同时,利用Serv-U可以实现ftp管理。操作简单,无需键入任何…

从核心技术到高可用实践——解密数据库深度挖掘指南

SDCC系列峰会各站在技术圈遍地花开之余,主办方CSDN为了更好地服务技术开发者并拓展受众,同步启动SDCC 2017系列之线上峰会——线上线下双管齐下,一举打破地域限制,内容为基,便捷加成,带来更友好的听众体验。…

Unity中Shader观察空间推导

文章目录 前言一、本地空间怎么转化到观察空间二、怎么得到观察空间的基向量1、Z轴向量2、假设 观察空间的 Y~假设~ (0,1,0)3、X Y 与 Z 的叉积4、Y X 与 Z 的叉积 三、求 [V~world~]^T^1、求V~world~2、求[V~world~]^T^ 四、求出最后在Unity中使用的公式1、偏移坐标轴2、把…

portainer 启动mysql_docker 安装portainer容器后,启动/Portainer 安装MySQL并开启远程访问...

启动命令:docker run -d -p 9000:9000 --restartalways -v /var/run/docker.sock:/var/run/docker.sock --name portainer docker.io/portainer/portainer下载mysql镜像文件:docker search mysqldocker pull mysql:5.7.32创建mysql容器:docker run -d --…

追求极简:Docker镜像构建演化史

作者简介:白明,东软互联网运营平台技术负责人,毕业于哈尔滨工业大学,Go语言专家,GopherChina讲师,技术培训师和撰稿人,博客tonybai.com作者,拥有多年后端服务架构设计和开发经验。目…

特征选择算法在微博业务应用中的演进历程

近年来,人工智能与机器学习的应用越来越广泛,尤其是在互联网领域。在微博,机器学习被广泛地应用于微博的各个业务,如Feed流、热门微博、消息推送、反垃圾、内容推荐等。值得注意的是,深度学习作为人工智能和机器学习的…

c winform mysql类_C#连接MySQL数据库操作类

首先需要安装MySQL Connector Net 6.8.3然后在项目中引用MySQL Connector,如下图所示C#连接MySQL的操作类代码如下:public class MySQLHelper{private string db_host "localhost"; //数据库服务器private string db_port "3306";…

病历智能处理引擎的架构设计、实现和应用

作者简介:吴大帅,新屿算法工程师,曾供职于宅米网、新达达,从事系统架构设计、算法设计等工作。 李智慧,《大型网站技术架构:核心原理与案例分析》作者,从事大型网站、分布式系统、大数据方面的研…