高质量子程序3——一个好的名字

本文探讨了如何为子程序选择恰当的命名,强调名字应清晰描述其功能、副作用和抽象层次。建议避免使用模糊动词、数字序列以及创建不必要的冗长名称。提倡使用对仗词和建立命名规则以增强可读性和一致性。同时,指出函数命名应反映其返回值,过程名应使用强烈动词加宾语形式。子程序名的长度应以清晰度为准,不必过分追求长度。
摘要由CSDN通过智能技术生成

1、如何选择一个能够在恰当的抽象层次上描述子程序的名字?

描述子程序所做的所有事情,子程序的名字应当描述其所有的输出结果以及副作用。

如果一个子程序的作用是计算报表总额并打开一个输出文件,那么把它命名为ComputeReportTotals()就还不算完整。ComputeReportTotalsAndOpenOutputFile() 是很完整,但是又太长且显得有点傻如果你写的是有一些副作用的子程序,那就会起出很多又长又笨的名字。

解决的方法不是使用某个描述性较弱的子程序名,而应该换一种方式编写程序,直接了当地解决问题而不产生副作用。

避免使用无意义的、模糊或表述不清的动词,有些动词的含义非常灵活,可以延伸到涵盖几乎任何含义。

不要仅通过数字来形成不同的子程序名字,有个程序员把所有的代码都写成一个大的函数,然后为每行代码创建一个函数,并把它们分别命名为partl、Part2等。在此之后,他又创建了一个高层次的函数来调用这些部分 Partn() 。这种创建子程序和给子程序命名的做法实在是骇人听闻(我真希望这很少发生)。但程序员们有时会用数字来区分类似于OutputUser、OutputUser1和OutputUser2这样的子程序。

这些名字后面的数字无法显示出子程序所代表的抽象有何不同,因此这些子程序的命名也都很糟糕。

准确使用对仗词,命名时遵守对仗词的命名规则有助于保持一致性,从而也提高可读性,像first/last这样的对仗词组就很容易理解。

下面列出一些常见的对仗词组:

add/remove  increment/decrement  open/close  begin/end  insert/delete  show/hide  create/destroy  lock/unlock  source/target  first/last  mini/max  start/stop  get/put  next/previous  up/down  get/set  old/new

为常用操作确立命名规则,在某些系统里,区分不同类别的操作非常重要。而命名规则往往是指示这种区别的最简单也是最可靠的方法。比如,在一个项目的代码里,每个对象都被分配了一个唯一标识。我们需要为返回这种对象标识的子程序建立一个命名规则。

不然的话,到了项目中期,项目组中每个人都不得不花费不必要的精力,去记住每个对象上采用的获取唯一标识的语法细节。而这些问题完全可以通过建立获取唯一标识的命名规则而避免。

2、子程序名字不好的原因?

有时一个子程序中仅有的问题就是其名字表述不清,而子程序本身也许设计得很好, 但如果把它的名字由 Handleoutput() 改为 FormatAndPrintOutput() ,那你就很容易看清楚这个子程序的功能了。

还有另外一些情况,其中的动词之所以含糊,是由于子程序执行的操作就是含糊不清的。这种子程序的问题在于目的不明确,而其模糊不清的名字仅是一种表象。如果是这种情况,那么最佳的解决办法便是重新组织该子程序及任何与之相关的子程序,以便使它们都具有更为明确的目的,进而赋予其能够精确描述这些目的的更为清晰的名字。

3、子程序的名字可以写多长?

变量名的最佳长度是9到7个字符。研究表明,子程序通常比变量更为复杂,因此,好的子程序名字通常也会更长一些。

另一方面,子程序名字通常是跟在对象名字之后,这实际上为其免费提供了一部分名字。总的来说,给子程序命名的重点是尽可能含义清晰,也就是说,子程序名的长短要视该名字是否清晰易懂而定。

4、有返回值的函数的名字

给函数命名时要对返回值有所描述,因此,函数的命名要应该针对其返回值进行。比如说,customerId.next()、printer.isReady()和 pen.currentColor()都是不错的函数名,它们精确地表述了该函数将要返回的结果。

5、无返回值的函数的名字

给过程起名时使用语气强烈的动词加宾语的形式。一个具有功能内聚性的过程通常是针对一个对象执行一种操作。过程的名字应该能反映该过程所做的事情,而一个针对某对象执行的操作就需要一个动词+宾语形式的名字。

如printDocument()、checkOrderInfo()等,都是很不错的过程名。

在面向对象语言中,你不用在过程名中加入对象的名字(宾语),因为对象本身己经包含在调用语句中了。你会用document.print()、orderlnfo.check()等语句调用子程序。

而诸如 document.printDocument()这样的语句则显得太臃肿,并且当它们在派生类中被调用时也容易产生误解。如果Check(支票)类是从Document(文档)类继承而来的,那么check.print()就很显然表示打印一张支票,而 check.printDocument()看上去像是要打印支票簿或是信用卡的对账单,而不像是打印支票本身。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Win_77

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值