我讀過整個Swift book,並觀看了所有WWDC videos(我衷心推薦的所有內容)。我擔心的一件事是數據封裝。Swift中的數據封裝
考慮以下(完全做作)例如:
class Stack<T>
{
var items : T[] = []
func push(newItem: T) {
items.insert(newItem, atIndex: 0)
}
func pop() -> T? {
if items.count == 0 {
return nil;
}
return items.removeAtIndex(0);
}
}
此類實現一個棧,以及使用數組實現它。問題是,items
(就像Swift中的所有屬性)是公共的,所以沒有任何東西可以阻止任何人直接訪問(甚至是變異)它與公共API分離。作爲一個古怪的C++老手,這讓我非常暴躁。
我看到有人抱怨缺乏訪問修飾符,雖然我同意他們會直接解決這個問題(並且我聽到有傳言說他們可能會實現Soon™),但我想知道數據隱藏的一些策略是什麼在他們的缺席。
我錯過了什麼,或者這只是在語言中的遺漏?
可能的重複:http://stackoverflow.com/q/24003918/1639670 – nathan
有一種實際的一半做某種數據隱藏 - 協議。只要讓你的課程符合你的協議,就可以使用所有功能和你想要被外部世界看到的東西,並且通過它而不是課程本身。正如我所說這不是替代品,但將工作,直到可見性修飾符出局。此外,這是一個很好的設計模式 - 依賴注入 –
「所以沒有任何東西可以阻止任何人直接訪問(甚至突變)它與公共API分開」 - 除了是一個「蹩腳的老C++人」:-)你有什麼傷害如果你不強行阻止人們按照他們想要的方式使用你的代碼,會不會認爲會發生?例如,Python有一句話:「我們都是成年人。」公/私是基於文件和慣例。如果有人想搗鼓班級內部的某些東西,請注意空手道。沒有人假裝他們可以永遠知道,沒有人會有一個很好的理由來訪問一個內部對象。 – alcalde