摘要:
它們不關調用者的事:将資料成員設為私有的。簡單的c語言形式的struct類型隻是将一組值聚集在了一起,并不封裝或者提供行為,隻有在這種struct類型中才可以将所有資料成員都設成公用的。要避免将公用資料和非公用資料混合在一起,因為這幾乎總是設計混亂的标志。
資訊隐藏是優秀軟體工程的關鍵。應該将所有資料成員都設為私有的,不管是現在,還是可以能發生變化的将來,私有資料都是類用來保持其不變式的最佳方式。
如果類要模組化一個抽象,并因而必須維持一個不變式,那麼使用公用資料就不好了。擁有公用資料意味着類的部分狀态的變化可能是無法控制的、無法預測的、與其他狀态異步發生的。這意味着抽象将與使用抽象的所有代碼組成無限集合共同承擔維持一個或者更多不變式的職責,這是一種顯而易見的、根本性的、不可原諒的缺陷。應該斷然拒絕這種設計。
保護資料具有公用資料的所有缺點,因為擁有保護資料仍然意味着抽象将與代碼的無限集合共同承擔着一個或者更多不變式的職責,隻不過這裡的集合是由目前的派生類和未來的派生類組成的。而且,通過派生一個新類,并用它來擷取資料,任何代碼都能夠像公用資料那樣容易地讀取和修改保護資料。
在同一個類中混合使用公用和非公用資料成員既容易含混不清,又存在前後沖突。私有資料表明具有不變式而且希望保持這種不變性,而将其與公用資料混合則意味着無法明确地判斷這個類到底要不要成為抽象。
非私有資料成員甚至還不如簡單的通道性的get/set函數,後者起碼還能進行健壯的版本處理。