在閱讀一些 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