关于代码布局(Coding Layout)

研究发现,缩进可以提高程序员的理解能力(<<Program Indentation and Comprehensibility>>, Miaria et al. 1983)。缩进是代码布局的一项技术。作为代码布局并不像命名和注释那样明确,它更像一种感觉。比如摄影的构图,或者国画的留白。虽然很难给一个标准的评价标准,但是<<代码大全>>的作者Steve.McConnell和<<程序员修炼之道>>的两位作者还是给了一些建议。

 

首先,需要先明确代码的重要性。对于绝大多数软件项目而言,代码是用来沟通的(参考),以便于别人的阅读理解。(至于为什么,参考这里)

 

使用的好布局可以达到以下的效果:
1.准确表达代码的逻辑结构.
2.始终如一的表现代码的逻辑结构.
3.改善可读性.
4.经得起修改(Withstand modifications)

 

布局的主要原则:

1. 每行一条语句.

2. 注释的缩进应当与相应代码保持一致.

3. 使用空行分隔子程序的各部分. 如函数头、数据和常量声明以及程序体中不同的逻辑部分.

4.使用空行将代码中的段落分开.

*你的代码在此之前应当确保没有过多的冗余代码。否则已经臭掉的代码摆得再好看也是枉然。

 

为什么压缩后JavaScript看到就头疼?再来回味一下:

var tablink;chrome.tabs.getSelected(null,function(tab){var tablink=tab.url;document.getElementById("url").value=tablink;document.getElementById("url").focus();changeBarCode();});function changeBarCode(){var text=document.getElementById("url").value;if(0==text.length){text="http://blog.csdn.net/horkychen";} var newPicUrl="xxxx"+text;}

 

如果通过JS Beautifier转换一下呢:

var tablink;

chrome.tabs.getSelected(null, function (tab) {
   var tablink = tab.url; 

   document.getElementById("url").value = tablink;
   document.getElementById("url").focus();

   changeBarCode();
});

function changeBarCode() {
   var text = document.getElementById("url").value; 

   if (0 == text.length) {
      text = "http://blog.csdn.net/horkychen";
   }

   var newPicUrl = "xxxx"+ text;
   document.getElementById("barcode_img").src = newPicUrl;
}

 

魔鬼在细节之中。从知道到懂关键在细节。缩进就不用说了, 看一下空行的运用。

 

第一点,这段代码中三块段落之间被两行空行隔开,可以大概看出包含了三段内容。

 

第二点,比如下面这个函数,其函数体被空行分成了三个部分,一眼望去就可知道有三段不同功能的代码。

chrome.tabs.getSelected(null, function (tab) {
   var tablink = tab.url;  

   document.getElementById("url").value = tablink;
   document.getElementById("url").focus();

   changeBarCode();
});

 

其中前后两行意义比较独立,中间两行归在一组完成控件设定和选中的功能。也就相似的代码归在一起,再使用空行将这样不同的段落分隔开来。像不像作文里面讲的布局规则。(比如我的博客就没有按标准段首两个字的缩进,而是用的英文顶行写的.)

 

 如果换一种写法(为了强化概念,我添加了一些代码):

chrome.tabs.getSelected(null, function (tab) { 

   document.getElementById("url").focus();

   var tablink = tab.url;
   if (tablink != undefined && tablink.length > 0)
   {
       tablink = "http://blog.csdn.net/horkychen";
   }
   document.getElementById("url").value = tablink;

   changeBarCode();
});

这样就可以感受到第二种写法将相同document.xxxxx的操作分开了,中间的处理又相对独立,它们本来要视为不同的段落更为合适:

chrome.tabs.getSelected(null, function (tab) { 

   var tablink = tab.url;
   if (tablink != undefined && tablink.length > 0)
   {
       tablink = "http://blog.csdn.net/horkychen";
   }

   document.getElementById("url").value = tablink;
   document.getElementById("url").focus();

   changeBarCode();
});

 

第二个函数也有类似的应用, 就不解释了。

 

第三,在表达式中操作符间使用了空格区隔,如下:

   if (0 == text.length)

 这样的好处是操作符两边比较清楚,不然一不小心将==写成了===,结果就不一定了。

 

可以好好体会一下,分组将相似的功能放在一起,思维上不会跳跃。空白可以加强对分组概念的识别,从而提高理解能力。再想想国画留白的手法,是不是有异曲同工之妙?

 

还有一种情况发生在较长的判断语句上:

 if (   ( (con1) || (con2) ) &&
      (con3) &&
      (con4) &&
      (con5) &&
      ( (con6) || (con7) )     )
{
   ;
}

 

写成这样呢,你是什么感受:

if ( (  (con1) || (con2)  ) && (con3) && (con4) && (con5) && ((con6)||(con7)) )
{
   ;
}

如果一行太长,就可以使用分行来简化它。

 

关于缩进,很多软件都有自动缩进的功能,找一找,它能帮你解决大问题。

 

Tips: 我一直有个习惯,在需要括号, 中括号或者大括号的地方,输入时一定是左右两个同时输入。比如写函数,一定会先写成:

  function abcd() {}

然后再开始输入函数体,这样就不会遗漏后面的那一个了。比如前面那个判断语句,按这种方式输入完了, 基本上是不需要再确认的。

 

转发请注明出处:http://blog.csdn.net/horkychen

更多的内容可以看这里:

  编码工艺--命名和注释

  《代码整洁之道》摘录---格式

  《代码整洁之道》摘录---注释 

  创建一个函数需要理由吗

 

时间: 2024-09-23 16:20:33

关于代码布局(Coding Layout)的相关文章

linearlayout-android使用代码布局LInearLayout达不到xml的效果

问题描述 android使用代码布局LInearLayout达不到xml的效果 用XML布局,能够将TextView控件居中,而代码布局不能将TextView控件居中. 经测试,代码布局中,addView函数对LayoutParams参数添加进的gravity和leftMargin等属性未进行应有的操作,但能够对宽高的设定进行对应的操作. 在NEXUS 4(android 4.3)和我自己的手机(android 4.1.2)上测试,都存在这样的问题. 百度和谷歌都未找到我想要的答案或类似情况.

Android 布局(Layout)指南

Android 布局(Layout)指南 太阳火神的美丽人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非商业用途-保持一致"创作公用协议 转载请保留此句:太阳火神的美丽人生 -  本博客专注于 敏捷开发及移动和物联设备研究:iOS.Android.Html5.Arduino.pcDuino,否则,出自本博客的文章拒绝转载或再转载,谢谢合作. Android 官方文档 布局 相关资源链接汇总如下: android-sdk-macosx-4.4.2

android-把 button 放在框架布局 frame layout 左边的问题

问题描述 把 button 放在框架布局 frame layout 左边的问题 在一个垂直的线性布局中设置了两个textviews,还有一个button和一个frame layout框架布局. 我要把按钮放在框架布局的左边,并把按钮放在 relative layout布局中. 但是如何把框架布局 frame layout 放在右边呢? <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

Objective-C iOS纯代码布局 一堆代码可以放这里!

前言: 最近写的文章都是创业类,好吧,今天好好写写技术类的文章! 不过分享的不是IOS相关的文章,毕竟这几天在速成IOS,看的是objective-c,由于速成的很快,好累! 好在现在基本已经入了点门道了,这才看的懂新人的代码,才能提前感受代码危机. 对于IOS的速成口诀,回头再分享,今天先分享一个简单的抽象封装! 1:先看看问题 说明:通常对于界面布局,有编写代码.Xib.Storyboard三种方式,而我看到新人写的,是通过代码布局的. 看到的代码是这样的: A:编写UI的代码已分离到新的类

CSS代码布局八条最常见的错误

很多人对于CSS都是边干边学习,因为它不像C#之类的语言那么复杂,看起来似乎挺简单,然而正是这种对CSS的不完整的理解,导致了许多的CSS代码破坏了布局,或者带来了无休止的调试,以下总结了八条最常见的错误,以及它们的解决之道:1.不阅读或者没有读过W3C标准的文档.上图是W3C CSS 2.1 规范截图,这是当前唯一的官方详细描述CSS2功能的文件,大部分都是干巴巴的条文,不过幸好有许多简短有用的部分,当你不清楚某些CSS性能的时候可以去查阅这个文档,下面列出一下比较常用的部分:1.盒模型(Th

android代码布局-android 代码中设置控件的垂直居中和两个控件之间的距离。

问题描述 android 代码中设置控件的垂直居中和两个控件之间的距离. 因为数据是动态的 所以所有的控件和布局都是在java代码里面设置 怎样才能让一个控件垂直居中 还有两个控件之间的距离又是怎么设置的啊 求高手指点啊 最好能给点代码 我是新手 说的太笼统了 看不太懂 谢谢了 解决方案 LinearLayout.LayoutParams params = new LinearLayout.LayoutParams( LinearLayout.LayoutParams.FILL_PARENT,

C程序的内存布局(Memory Layout)

  由C语言代码(文本文件)形成可执行程序(二进制文件),需要经过编译-汇编-链接三个阶段.编译过程把C语言文本文件生成汇编程序,汇编过程把汇编程序形成二进制机器代码,链接过程则将各个源文件生成的二进制机器代码文件组合成一个文件.         C语言编写的程序经过编译-连接后,将形成一个统一格式的二进制可执行文件,这个格式是一个依照可执行文件格式的,可以被系统识别,并且加载到内存中执行的,它由几个部分组成.在程序运行时又会产生其他几个部分,各个部分代表了不同的存储区域: 静态区域(全局区域)

Android 布局文件Layout XML属性_Android

Layout对于迅速的搭建界面和提高界面在不同分辨率的屏幕上的适应性具有很大的作用.这里简要介绍Android的Layout和研究 一下它的实现. Android有Layout:FrameLayout,LinearLayout,TableLayout,RelativeLayout,AbsoluteLayout. 放入Layout中进行排布的View的XML属性: 几种Layout中Item所共有的XML属性:  (1)layout_width  (2)layout_height  注: (1)和

php类申明方法与代码布局

类的声明 当编写类时,应该遵守以下格式规则: - 在方法名与其参数列表之前的左括号"("间不要有空格 - 左大括号"{"位于声明语句同行的末尾 - 右大括号"}"另起一行,与相应的声明语句对齐,除非是一个空语句,"}"应紧跟在"{"之后 class Sample extends Object { int $ivar1; int $ivar2; function Sample(int $i, int $j)