zoukankan      html  css  js  c++  java
  • Clean Code – Chapter 2: Meaningful Names

    • Use Intention-Revealing Names

      The name should tell you why it exists, what it does, and how it is used.

      e.g.

      Bad code:

      public List<int[]> getThem(){
          List<int[]> list1 = new ArrayList<int[]>();
          for (int[] x : theList)
              if (x[0] == 4)
                  list1.add(x);
          return list1;
      }

      Good code:

      public List<int[]> getFlaggedCells(){
          List<int[]> flaggedCells = new ArrayList<int[]>();
          for (int[] cell : gameBoard)
              if (cell[STATUS_VALUE] == FLAGGED)
                  flaggedCells.add(cell);
          return flaggedCells;
      }

      Better code:

      public List<Cell> getFlaggedCells(){
          List<Cell> flaggedCells = new ArrayList<Cell>();
          for (Cell cell : gameBoard)
              if (cell.isFlagged())
                  flaggedCells.add(cell);
          return flaggedCells;
      }
    • Avoid Disinformation
    • Make Meaningful Distinctions

      Bad code:

      public static void copyChars(char a1[], char a2[]) {
          for (int i = 0; i< a1.length; i++) {
              a2[i] = a1[i];
          }
      }

      Good code:

      Change the name a1, a2 to source and destination.

    • Use Pronounceable Names

      这条对于我们中国人来说就不合适了,命名时还是不要用汉语拼音。

    • Use Searchable Names

      The length of a name should correspond to the size of its scope.

    • Avoid Encodings
      • Hungarian Notation

        特定时代的产物,随着一些现代的集成开发环境的引入,已不建议使用了。(参考维基百科词条:匈牙利命名法

      • Member Prefix
      • Interfaces and Implementations

        leave interface unadorned.

        prefer to encoding implementations than interfaces.

        e.g. prefer to use the name ShapeFactoryImp rather than IShapeFactory.

        关于这一点,在上面提到的“匈牙利命名法”维基百科词条最后也有相关说明:

        .NET Framework,微软新的软件开发平台,除了接口类型一般不适用匈牙利命名法。在 .NET 中,习惯在接口类型前放一个 I (例如 Windows Forms 中的 IButtonControl 接口。).NET Framework 指导方针建议程序员不要用匈牙利命名法,但是没有指明不要用系统匈牙利命名法还是匈牙利应用命名法,或者是两者都不要用。

        与此对比,Java 的标准库中连接口类型也不加前缀。

        即 Java 的命名法则与作者的观点一致。

    • Avoid Mental Mapping

      Clarity is king.

    • Class Names

      noun or noun phrase names

    • Method Names

      verb or verb phrase names

    • Don’t Be Cute

      Say what you mean. Mean what you say.

    • Pick One Word per Concept
    • Don’t Pun
    • Use Solution Domain Names

      use computer science terms, algorithm names, pattern names, math terms and so forth.

    • Use Problem Domain Names

      When there is no “programmer-eese” for what you’re doing.

      Separating solutions and problem domain concepts is part of the job of a good programmer and designer. The code has more to do with problem domain concepts should have names drawn from the problem domain.

    • Add Meaningful Context

      Bad code:

      private void printGuessStatistics(char candidate, int count) {
          String number;
          String verb;
          String pluralModifier;    
          if (count == 0) {
              number = "no";
              verb = "are";
              pluralModifier = "s";
          } else if (count == 1) {
              number = "1";
              verb = "is";
              pluralModifier = "";
          } else {
              number = Integer.toString(count);
              verb = "are";
              pluralModifier = "s";
          }
          String guessMessage = String.format(
              "There %s %s %s%s.", verb, number, candidate, pluralModifier);
          print(guessMessage);
      }

      Good code:

      public class GuessStatisticsMessage {
          private String number;
          private String verb;
          private String pluralModifier;
          
          public String make(char candidate, int count) {
              createPluralDependentMessageParts(count);
              return String.format(
                  "There %s %s %s%s.",
                  verb, number, candidate, pluralModifier);
          }
          
          private void createPluralDependentMessageParts(int count) {
              if (count == 0) {
                  thereAreNoLetters();
              } else if (count == 1) {
                  thereIsOneLetter();
              } else {
                  thereAreManyLetters(count);
              }
          }
          
          private void thereAreNoLetters() {
              number = "no";
              verb = "are";
              pluralModifier = "s";
          }
          
          private void thereIsOneLetter() {
              number = "1";
              verb = "is";
              pluralModifier = "";
          }
          
          private void thereAreManyLetters(int count) {
              number = Integer.toString(count);
              verb = "are";
              pluralModifier = "s";
          }
      }
    • Don’t Add Gratuitous Context
  • 相关阅读:
    C# post请求,Json转换实体类
    jq div 托拉拽
    json转换成实体类
    C# 队列、锁、异步
    关于C#调用protobuf 序列化和反序列化
    关于System.Data.Entity.Infrastructure.DbUpdateException 的问题
    C# 本地CSS和JS引用无问题,部署服务器之后出现500错误
    windows服务
    下拉加载更多DEMO(js实现)
    禁用iPhone手机浏览器上给电话号码自动加上的link样式
  • 原文地址:https://www.cnblogs.com/gumuyueying/p/cleancode-ch2.html
Copyright © 2011-2022 走看看