代码整洁之道:整洁代码、有意义的命名

来源:博客园(作者-BNDong

什么是整洁代码

有多少程序员,就有多少定义。每个人理解的都不一样,我理解的整洁代码:

  • 可读性高
  • 尽量少的依赖关系
  • 目的明确
  • 没有重复的代码
  • 高效

有意义的命名

名副其实

变量、函数或类的名称应该已经答复了所有的大问题。它该告诉你,它为什么会存在,它做什么事,应该怎么用。如果名称需要注释来补充,那就不算名副其实。

避免误导

避免使用与本意相悖的词。

做有意义的区分

同一系列的不能单纯的使用数字来命名。命名的名称必须相异,提供向导作者意图的线索。尽量不适用意义含混的废话,Info和Data就像a、an和the一样。

使用读得出来的名称

使用可搜索的名称

名称长短应与其作用域大小相对应。若变量或常量可能在代码中多处使用,则应赋其便于搜索的名称。

避免使用编码

匈牙利语法标记法(话说这种命名带数据类型的现在没啥用啊,反而增加负担(⊙﹏⊙)b)

减少没必要的前缀

接口和实现(在书中并不建议使用前导字母 I 来修饰接口,不过本人更倾向于对接口使用前导字母来进行修饰!)

避免思维映射

不应当让读者在脑中把你的名称翻译为他们熟知的名称。

类名

类名和对象名应该是名词或名词短语。

方法名

方法名应当是动词或动词短语。

别扮可爱

参考“名副其实”,就是不要用一些奇葩的名字。

每个概念对应一个词

给每个抽象概念选一个词,并且一以贯之。

别用双关语

避免将同一单词用于不同目的。

使用解决方案领域名称

只有程序员才会读你的代码,所以尽管使用那些极端及科学术语、算法名、模式名、数学术语吧。(貌似自己知道的真不多)

使用源自所涉问题领域的名称

如果不能用程序员熟悉的术语来给手头的工作命名,就采用从所涉问题领域而来的名称。

添加有意义的语境

如果名称不能完全自我说明,就需要用有良好命名的类、函数或名称空间来放置名称,给读者提供语境。

  语境不明确的变量:

private function printGuessStatistice($candidate, $count)
{
    $number = '';
    $verb = '';
    $pluralModifier = '';

    if ($count == 0) {
        $number = 'bn';
        $verb   = 'dong';
        $pluralModifier = 'bndong';
    } elseif ($count == 1) {
        $number = 'DONG';
        $verb   = 'BN';
        $pluralModifier = 'DONGBN';
    } else {
        $number = strval($count);
        $verb   = 'bndong';
        $pluralModifier = '';
    }

    $guessMessage = sprintf(
        'String %s %s %s%s', $verb, $number, $candidate, $pluralModifier
    );

    echo $guessMessage;
}

  这里我们分解这个函数,新建一个类GuessStatisticsMessage,把三个变量做成该类的成员字段。增强语境也让算法能够通过分解为更小的函数而变得更为干净利落。

class GuessStatisticsMessage
{
   private $number;
   private $verb;
   private $pluralModifier;

   public function make($candidate, $count)
   {
        $this->createPluralDependentMessageParts($count);
        return sprintf(
            'String %s %s %s%s', $this->verb, $this->number, $candidate, $this->pluralModifier
        );
   }

   private function createPluralDependentMessageParts($count)
   {
        if ($count == 0) {
            $this->thereAreNoLettres();
        } elseif ($count == 1) {
            $this->thereIsOneLetter();
        } else {
            $this->thereAreManyLetters($count);
        }
   }

   private function thereAreManyLetters($count)
   {
        $this->number = strval($count);
        $this->verb   = 'bndong';
        $this->pluralModifier = '';
   }

      private function thereIsOneLetter()
   {
        $this->number = 'DONG';
        $this->verb   = 'BN';
        $this->pluralModifier = 'DONGBN';
   }

   private function thereAreNoLettres()
   {
        $this->number = 'bn';
        $this->verb   = 'dong';
        $this->pluralModifier = 'bndong';
   }
}

不要添加没用的语境

只要短名称足够清楚,就要比长名称好。别给名称添加不必要的语境。(个人理解就是尽量精简名称里的字母)

posted @ 2023-12-30 20:23  mharvay  阅读(54)  评论(0)    收藏  举报