區分 procedure 和 function:返回值是函數最大的資產

在閱讀一些 Java 代碼中,發現有無數方法的返回值類型是 void:沒有返回值。java

在當年流行的學院式語言 Pascal (也是我第一種實際使用的語言)中,特地區分了有無返回值的過程:有返回值的是 function (函數),無返回值的叫作 procedure (過程)。對於過程式的語言,procedure 意味着必須經過某種全局變量或者直接的 IO 過程來實現它的目標,固然是邪惡的了。這也是區別這兩種語義的設計緣由。對於 Pascal 程序員,儘可能提升 function 的比例、下降 procedure 的數量,是一個設計的目標。程序員

但是到了 OO 時代,大量使用的成員變量讓程序員們有了某種幻覺:既然能夠經過成員變量來和外界溝通,對象的方法就能夠光明正大地使用 void 返回值,使用 procedure 了。可是,純粹的 function 比這樣的方法有重大的優點:多線程

  • 僅僅使用參數表和返回值和外界溝通的函數是最獨立、複用性最高的函數。它對環境無要求,很是容易查錯。
  • 它沒有多線程同步的問題:因爲沒有共享的數據,全部內部變量都不須要經過鎖定等複雜機制來保護。

所以,即便使用 Java 這樣的 OO 語言,儘可能提升 function 的數量,讓程序中大多數代碼都是 function 的一部分仍然是很是值得提倡的美德。函數

public class Greeter {
  private String sentence;
  public void hello(String name) {
    sentence = "Hello, " + name;
  }
  public void greeting(String name) {
    hello(name);
    System.out.println(sentence);
  }
  public void sendGreeting() {
    MailSystem.sendMessage(sentence);
  }
}

簡單得過度的一個 Hello, world 例子,但裏面的 hello 方法仍然變得依賴具體的成員變量。若是改爲這樣:線程

public class Greeter {
  public String hello(String name) {
    return "Hello, " + name;
  }
  public void greeting(String name) {
    sentence = hello(name);
    System.out.println(sentence);
  }
  public void sendGreeting() {
    MailSystem.sendMessage(sentence);
  }
}

這個 hello 方法就能夠隨意複製到其餘地方去了。固然,你可能注意到如今這個方法能夠標識爲靜態,你甚至不須要一個對象實例就可使用它。設計

public static String hello(String name)

如今開始就請欣賞你代碼中增多的 static function,將 void 返回值的 procedure 視做代碼中應盡力避免的壞味道吧!code

相關文章
相關標籤/搜索