优雅编程之这样组织数据,你就“正常”了(二十五)

开心一笑

【马云有1500亿。中国有13亿人 他每人发一亿 他还有1487亿 这样他还是中国首富 全中国都是亿万富豪。我要不是数学系的都看不出里面的道道】

提出问题

项目中如何重新组织数据???

解决问题

以下来自《重构》这本书的读书笔记,欢迎留下宝贵意见。

Self Encapsulate Field(自封装字段)

你直接访问一个字段,但与字段之间的耦合关系逐渐变得笨拙。为这个字段建立取值/设值函数,并且只以这些函数来访问字段。

争论:

直接取值还是间接取值:作者的观点是间接取值。

Replace Data Value with Object(以对象取代数据值)

你有一个数据项,需要与其他数据和行为一起使用才有意义。将数据项变成对象。

Change Value to Reference(将值对象改为引用对象)

你从一个人类衍生出许多彼此相等的实例,希望将它们替换为同一个对象。将这个值对象变成引用对象。

Change Reference to Value(将引用对象改为值对象)

你有一个引用对象,很小且不可变,而且不易管理,将它变成一个值对象。

Replace Array with Object(以对象取代数组)

你有一个数组,其中的元素各自代表不同的东西。以对象替换数组。对于数组中的每一个元素,以一个字段来表示。

重构前:

    String[] gifts = new String[3];
    gifts[0] = "flower";
    gifts[1] = "Say love";
    gifts[2] = "Call";

重构后:

    Gift gift = new Gift();
    gift.setFlower(999);
    gift.setSayWord("Love you");
    gift.setCall("good Night");

Change Unidirectional Association to Bidirectional(将单向关联改为双向关联)

两个类都需要使用对方特性,但其间只有一条单线连接,添加一个反向指针,并修改函数,使能够同时更新两条连接。

    //两人彼此相爱时,心里都有对方
    class Boy{
        //心爱的女孩
        Girl girl;

    }

    class Girl{
        //心爱的男孩
        Boy boy;
    }

Change Bidirectional Association to Unidiredtional(将双向关联改为单向关联)

两个类之间有双向关联,但其中一个类如今不再需要另一个类的特性。去除双向关联。

    //女孩不喜欢男孩了
    class Boy{

        Girl girl;

    }


    class Girl{
        //我们分手吧!
        //Boy boy;
    }

Replace Magic Number with Symbolic Constant(以字面常量取代魔法数)

你有一个字面数值,带有特别含义。创造一个残联,根据其意义为它命名,并将上述的字面数值替换为这个常量。

重构前

  public boolean testLove(){
      return 999 * flowerNumber > 99999;
  }

重构后

  //这里的常量要放在离函数近的地方
  public static int DAYS = 999;
  public boolean testLove(){
      return DAYS * flowerNumber > 99999;
  }

Encapsulate Field(封装字段)

你的类中存在一个public字段,将它声明为private,并提供相应的访问函数。(就是我们所说的set,get方法)

重构前

 private String flowerNum

重构后

 private String flowerNumber;

 public String getFlowerNumber() {
    return flowerNumber;
 }

 public void setFlowerNumber(String flowerNumber) {
    this.flowerNumber = flowerNumber;
 }

Encapsulate Collection(封装集合)

有个函数返回一个集合,让这个函数返回该集合的一个只读副本,并在这个类中提供添加/移除集合元素的函数。(具体可以看书本例子)

Replace Type Code with Class(以类取代类型码)

类之中有一个数值类型码,但它并不影响类的行为,以一个新的类替换该数值类型码。(具体可以看书本例子)

Replac Type Code with Subclasses(以子类取代类型码)

你有一个不可变的类型码,它会影响类的行为,以子类取代这个类型码。(具体可以看书本例子)

Replace Type Code with State/Strategy(以State/Strategy)取代类型码

你有一个类型码,它会影响类的行为,但你无法通过继承手法消除它,以状态对象取代类型码。(具体可以看书本例子)

Replace Subclass with Fields(以字段取代子类)

你的各个子类的唯一差别只在,”返回产量数据”的函数身上。修改这些函数,使它们返回超类中的某个新增字段,然后销毁之类。(具体可以看书本例子)

读书感悟

来自亦舒《花解语》

  • 人一定要受过伤才会沉默专注,无论是心灵或肉体上的创伤,对成长都有益处。
  • 不必对全世界失望,百步之内,必有芳草。
  • 每个人的喜怒哀乐完全一样,只是涵养功夫有别。
  • 一些事,无能为力, 爱莫能助,也只得装无知,免得七嘴八舌,更添烦恼。
  • 一个人所可以靠的,不外是他的双手。

其他

如果有带给你一丝丝小快乐,就让快乐继续传递下去,欢迎转载,点赞,顶,欢迎留下宝贵的意见,多谢支持!

你可能感兴趣的:(java,优雅编程)