代码命名,代码里的命名规则:错误的和正确的对比 命名方法总结 “自我描述的源代码”用代码表达出你的思想,让其他人通过代码能明白你的意图。...

http://www.aqee.net/express-names-in-code-bad-vs-clean/

编程初学者总是把大量的时间用在学习编程语言,语法,技巧和编程工具的使用上。他们认为,如果掌握了这些技术技巧,他们就能成为不错的程序员。然而,计算机编程的目的并不是关于精通这些技术、工具的,它是关于针对特定领域里的特定问题创造出相应的解决方案,程序员通过相互合作来实现这些。所以,很重要的一点,你需要能精确的用代码表达出你的思想,让其他人通过代码能明白你的意图。

让我们先看看编程大师Robert C. Martin的杰作《Clean Code》里的一句话:

“注释的目的是为了弥补代码自身在表达上的不足。”

这句话可以简单的理解为如果你的代码需要注释,最有可能是你的代码写的很烂。同样,如果在没有注释的情况下你无法用代码完整的表达你对一个问题或一个算法的思路,那这就是一个失败的信号。最终,这意味着你需要用注释来阐明一部分的思想,而这部分在代码里是看不出来的。好的代码能够让任何人在不需要任何注释的情况下看懂。好的编码风格能将所有有助于理解这个问题的所有信息都蕴含在代码里。

在编程理论中,有一个概念叫做“自我描述的源代码”。对于一段代码,一种常见的自我描述机制是遵循某种非严格定义的变量、方法、对象命名规则。这样做的主要作用就是使源代码更易读易懂。所以,也就更容易维护和扩展。

这篇文章里,我将举出一些例子,说明什么是“不好的代码”,什么是“清楚的代码

命名要能揭示意图

如何命名,在编程中这永远都是个老大难问题。有些程序员喜欢简化、缩短或加密名称,使得只有他们自己能懂。下面让我们看一些例子:

不好的代码

int d;
// 天数
int ds;
int dsm;
int faid;

“d”可以表示任何东西。作者使用注释来表明他的意图,却没有选择用代码来表示。而“faid”很容易导致误解为ID。

清楚的代码

int elapsedTimeInDays;
int daysSinceCreation;
int daysSinceModification;
int fileAgeInDays;

命名时避免含义引起误解的信息

错误的信息比没有信息更糟糕。有些程序员喜欢“隐藏”一些重要信息,有时候他们也会写出一些让人误解的代码

不好的代码

Customer[] customerList;
Table theTable;

变量“customerList”其实不是个list。它是一个普通的array(或客户集合)。除此之外,“theTable”是一个Table类型的对象(你可以用IDE容易的发现它的类型),“the”这个词是个不必要的干扰。

清楚的代码

Customer[] customers;
Table customers;

命名要有合适的长度

在高级编程语言中,变量名的长度通常不太限制。变量名几乎可以任何长度。虽然如此,这也可能使代码变得闹心。

不好的代码

var theCustomersListWithAllCustomersIncludedWithoutFilter;
var list;

好的名称应该只含有必要的词汇来表达一个概念。任何不必要的字词都会使名称变长、难于理解。名称越短越好,前提是能在上下文中表达完整的意思(下订单这个场景中,“customersInOrder” 要比 “list” 好)。

清楚的代码

var allCustomers;
var customersInOrder;

命名时编码规范保持一致,让规范帮助理解代码

所有的编程技术(语言)都有自己的“风格”,叫做编码规范。程序员应该在写代码时遵循这些习惯,因为其他的程序员也知道这些,并按这种风格编写。下面我们看一个没有明显规范的不好的代码例子。下面的这段代码没有遵循很好的已知的“编码规范”(比如PascalCase, camelCase, Hungarian规范)。更糟糕的是,这有一个毫无意义的bool变量“change”。这是个动词(用来描述动作),但这里的bool值是来描述一个状态,所以,这里应该用一个形容词更合适。

不好的代码

const int maxcount = 1
bool change = true
public interface Repository
private string NAME
public class personaddress
void getallorders()

一段代码,只看它的一部分,你就应该直接明白它是什么类型,只需要看它的命名方法。

例如:你看到了“_name”,你就能知道它是个私有变量。你应该在任何地方都利用这种表示方法,没有例外情况。

清楚的代码

const int MAXCOUNT = 1
bool isChanged = true
public interface IRepository
private string _name
public class PersonAddress
void GetAllOrders()

命名时相同的概念用相同的词表达

定义概念很难。在软件开发过程中,很多时间都花在分析业务场景、思考正确的定义里面所有的元素。这些概念永远都是让程序员头痛的事。

不好的代码

//1.
void LoadSingleData()
void FetchDataFiltered()
Void GetAllData()
//2.
void SetDataToView();
void SetObjectValue(int value)

首先:

代码的作者试图表达“get the data”的概念,他使用了多个词“load”,“fetch”,“get”。一个概念只用一个词表达就行了(在同一个场景中)。

第二:

“set”这个词用在了2个概念里:第一是“data loading to view”,第二个是“setting a value of object”。这是两个不同的概念,你应该使用不同的词。

清楚的代码

//1.
void GetSingleData()
void GetDataFiltered()
Void GetAllData()
//2.
void LoadDataToView();
void SetObjectValue(int value)

命名时使用跟业务领域相关的词

程序员写的所有代码都是跟业务领域场景逻辑相连的。为了让所有关系到这个问题的人都能更好的理解,程序中应该使用在领域环境中有意义的名称。

不好的代码

public class EntitiesRelation
{
Entity o1;
Entity o2;
}

当在编写针对某个领域的代码时,你应该始终考虑使用领域有联系的名称。在将来,当另外一个人(不仅是程序员,也许是测试人员)接触你的代码时,他能轻松的理解这个业务领域里你的代码是什么意思(不需要业务逻辑知识)。你首先考虑的应该是业务问题,之后才是如何解决。

清楚的代码

public class ProductWithCategory
{
Entity product;
Entity category;
}

命名时使用在特定环境里有意义的词

代码里名称都有自己的上下文。上下文对于理解一个名称非常重要,因为它能提供额外的信息。让我们来看看一个典型的“地址”上下文:

不好的代码

string addressCity;
string addressHomeNumber;
string addressPostCode;

在大多数情况中,“Post Code”通常是地址的一部分,很显然,邮政编码不能单独使用(除非你是在开发一个专门处理邮编的应用)。所以,没有必要在“PostCode”的前面加上“address”。更重要的,所以的这些信息都有一个上下文容环境,一个命名空间,一个类。

在面向对象编程中,这里应该用一个“Address”类来表达这个地址信息。

清楚的代码

class Address
{
string city;
string homeNumber;
string postCode;
}

命名方法总结

概述起来,做为一个程序员,你应该:

  • 命名是来表达概念的
  • 注意名称长度,名称里只该含有必要的词语
  • 编码规范有助于理解代码,你应该使用它
  • 名称不要混用
  • 名称在业务领域里要有意义,在上下文里有意义

 

匈牙利命名法对程序员初学MFC比QT类库更有阻碍的原因之一

转载于:https://www.cnblogs.com/svennee/p/4759338.html

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

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

相关文章

linux 动态执行cp,Linux常用命令之cp、mv、rm、cat、more、head、tail、ln命令讲解

上一章节中,我们了解到了Linux系统的最基础的几个文件处理命令,核心的是ls命令,在今天这章中,我们来继续学习Linux对于文件操作相关的一些命令,比如复制、移动、删除、查看等命令。1、cp 命令解释命令名称:…

使用DBI(perl)实现文本文件的导入导出mysql

DBI 是perl脚本连接数据库的一个模块。perl脚本相对shell更灵活,功能更强大,跨平台能力强。相对可执行jar包要简单很多。 ​1、下载安装包DBI-1.631.tar.gzperl脚本下载的网站http://www.cpan.org/ 很多perl的组件都可以在这个网站上下载 2、解压tar -xz…

linux 车载视频监控,基于Linux平台车载视频监控系统研发-计算机科学与技术专业论文.docx...

基于Linux平台车载视频监控系统研发-计算机科学与技术专业论文目录HYPERLINK \l "_bookmark0" 第一章 绪论1 HYPERLINK \l "_bookmark1" 1.1 研究背景1 HYPERLINK \l "_bookmark2" 1.2 研究动态1 HYPERLINK \l "_bookmark3" 1.3 本文工…

Linux鼠标回报率修改,鼠标回报率怎么调? 设置鼠标回报率的三种方法

鼠标回报率如何设置呢?鼠标回报率又称刷新率,是指鼠标MCU与电脑传输数据频率。鼠标回报率对于游戏玩家而言至关重要,但同时鼠标回报率与电脑性能息息相关。只有电脑硬件性能良好,才能适当提升鼠标回报率,以实现更高的鼠…

linux下vi修改文件用法

进入vi的命令 vi filename :打开或新建文件,并将光标置于第一行首 vi n filename :打开文件,并将光标置于第n行首 vi filename :打开文件,并将光标置于最后一行首 vi /pattern filename:打开文件&#xff…

linux在芯片设计与实现,基于Linux的Atheros无线芯片网卡驱动的设计与实现

Design and Implementation of Linux based Atheros wireless network cards driverDU Qingbo1杜清波(1985-),男,硕士研究生,主要研究方向:嵌入式系统与网络通信1、School of Computer Science,Beijing University of Posts and T…

[转载]孙婧妍:高考语文148分是这样炼成的(附:孙婧妍

原文地址:孙婧妍:高考语文148分是这样炼成的(附:孙婧妍2013高考作文《手机论》)作者: 语文新高考高考语文148分是这样炼成的 (附:孙婧妍2013高考作文《手机论》) 来源:网络 作者:孙婧妍…

linux ps 命令安装,Linux上安装pstree命令(-bash: pstree: command not found)

一、pstree命令的安装1、在Mac OS上brew install pstree2、在Fedora/Red Hat/CentOSyum -y install psmisc3、在 Ubuntu/Debianapt-get install psmisc二、pstree命令详解pstree指令用ASCII字符显示树状结构,清楚地表达程序间的相互关系。如果不指定程序识别码或用户…

c语言字符串逆置,字符串逆置

满意答案9n7j5j3m4o2013.12.03采纳率:49% 等级:11已帮助:15198人47911 zxl0714 1358 Accepted 164K 15MS G 0.46K 2007-04-08 10:32:38#include using namespace std;void reverse(char* ch){int i, len;char tmp;len strlen( ch );for (…

哈夫曼编码c语言论文,哈夫曼编码的实现及应用论文.doc

哈夫曼编码的实现及应用论文毕 业 设 计(论文)题目 哈夫曼编码的实现及应用二级学院 数学与统计学院专 业 信息与计算科学班 级学生姓名 张泽欣 学号指导教师 职称时 间目录摘要IAbstractII第一章 绪论11.1 研究目的及意义11.2 图像压缩编码技术概述21.2.1 图像压缩编码技术分类…

css笔记3

CSS 多类选择器,通过把两个类选择器链接在一起&#xff0c;仅可以选择同时包含这些类名的元素&#xff08;类名的顺序不限&#xff09;。 <p class"important warning"> This paragraph is a very important warning. </p>.important {font-weight:bold;…

java保留有效数字

1 在处理数值运算的时候&#xff0c;有时候会遇到保留几位小数的需求&#xff0c;下面是一个保留两位小数的简单方法。2 /**3 * 将数据保留两位小数4 */5 privatedoublegetTwoDecimal(doublenum) {6 DecimalFormatdFormatnewDecimalFormat("#.00"…

C语言algorithm主函数,C语言中主函数中相关有关问题?

C语言中主函数中相关问题&#xff1f;&#xff1f;&#xff1f;#include #include #include #include #include #include #include #include #include using namespace std;int mp[20][20], b[20], max1, n;struct node{int a[15], top, ans, x;};void bfs(){int i, j, x;queue…

【Android基础】Fragment 详解之Fragment介绍

Fragment在Android 3.0&#xff08; API 11&#xff09;引入&#xff0c;是为了支持在大屏上显示更加动态、灵活的UI&#xff0c;比如在平板和电视上。Fragment可以看作是嵌套的Activity&#xff0c;类似ActivityGroup&#xff0c;但是开销肯定没有ActivityGroup那么大&#xf…

c语言统计数据,数据统计

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼#include void input(float score[10][5]);void average(float aver[]);void course(float cour[]);float score[10][5],aver[10],cour[5];int i,j;void main(){printf("please input the scores of all the students\n"…

传递闭包c语言算法解析,找关系的传递闭包 用c语言编 一个关系的传递闭包

为什么叫传递闭包&#xff1f;&#xff1f;有什么特殊含义&#xff1f;&#xff1f;设R是X上的二元关系&#xff0c;如果另一个关系R1满足&#xff1a;R1是传递的&#xff0c;R是R1的子集&#xff0c;对于任何可传递关系R11如果有R是R11的子集&#xff0c;就有R1是R11的子集。则…

linux之cp/scp命令+scp命令详解

命令&#xff1a;cp 使用权限&#xff1a;所有使用者 使用方式&#xff1a; cp [options] source dest cp [options] source... directory 说明&#xff1a;将一个档案拷贝至另一档案&#xff0c;或将数个档案拷贝至另一目录。 把计 -a 尽可能将档案状态、权限等资料都照原状予…

linux安装mq报5724,linux下MQ简单配置手册.doc

精品消息发送涉及到的队列及通道示意图&#xff1a;定义发送方为A&#xff0c;接收方为B&#xff0c;下面是建立A向B发送消息的单向配置。发送方A的配置1. 在发送方A创建队列管理器QM_A&#xff1a;[[email protected] ~]$ crtmqm -q QM_A成功后会有如下提示&#xff1a;There …

asp.net MVC控制器中返回JSON格式的数据时提示下载

Asp.net mvc在接收的是JSON格式的数据&#xff0c;但是奇怪的是在IE中提示下载文件&#xff0c;其他浏览器中一切正常&#xff0c;下载后&#xff0c;里面的内容就是在控制器中返回的数据。代码如下&#xff1a; 视图中js代码&#xff1a; $("#form").ajaxSubmit({ …

linux postfix 搭建,linux 下搭建postfix服务器

linux 下postfix邮箱的安装linux一、首先关闭sendmail服务service sendmail stop二、chkconfig sendmail off(关闭开机自启动)三、修改DNS正解文件&#xff0c;使DNS可以解析邮箱服务添加下面两行mail.zhubf.com. IN A 172.17.17.2zhubf.com. IN MX 10 …