我們在上課之前,一起來回顧一下以前曾提過的“SoC”的概念,我們說這個叫做“Separation of Concerns”,我把它翻譯為責任分離——即不同的部分專注於自己的那一部分。或者說一個對象完成一個目標。
這樣做的目標既讓代碼更加模塊化易於維護,也讓系統運行效率更高。所以說,我們要讓對象之間的通信變得更加規範才行。
數據隱藏
你去看看你在寫代碼時候用到的那些框架,哪個給你直接展示了它裡邊的內容?它們都暴露了標準的接口給你,就像是一個個的黑箱,放進玻璃、塑料還有電池,一部相機就出來了。
所以說,參照這樣的規則,我們在進行創建類的時候,也要這麼做。
你願意在講台上才發現自己沒穿褲子嗎?
為了保證我們的代碼足夠健壯,將盡可能多的屬性標記為 私有 (private)是個不錯的選擇。
我們一起來看個栗子:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
class CellPhone { var pushedNumber = 0 //储存按了哪个按钮 func theNumberIs() ->Int{ return pushedNumber //返回按了的数字 } } var myCellPhone = CellPhone() myCellPhone.pushedNumber = 9999999 //根本没有这个数字的按钮! myCellPhone.pushedNumber = -1 //这样都行?有没有王法?! myCellPhone.theNumberIs() |
請問誰的手機可以撥打“-1”這個號碼?
你寫的輪子,你寫的程序,不一定就會比這個手機的類健壯多少。總有一些有心人在尋找類似這樣的漏洞,所以說,我們應該避免這種情況,比如說使用非負的“UInt”類型來搞定複數問題,或者我們可以設定一個計算屬性來避免直接操作類的屬性:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
class CellPhone { private var number:Int = 0 var pushedNumber:Int { get { return number } set(num) { if num >= 0 && num <= 9 { number = num } else { print("error!") } } } func theNumberIs() ->Int{ return pushedNumber } } var myCellPhone = CellPhone() myCellPhone.pushedNumber = 9999999 //error! myCellPhone.theNumberIs() //赋值失败,还是0 |
Swift 語言中的計算屬性
除了屬性,Swift 語言還有用於代替 getter 和 setter 的計算屬性,它提供了一種只能用來操作其他數據而自身不能存儲任何變量的屬性,其實就是一種方法的包裝……總之,這樣用起來其實更方便了。
生存週期
好了,說完了封裝的概念,我們再回過頭聊一聊儲存器中的值,我們都知道,變量可以放在各種地方來聲明,比如類的外邊,類的里邊,甚至方法裡邊。對應這三個位置,這些變量有著不同的意義。
全局變量
聲明在類之外的變量叫做全局變量,這個東西會隨著你程序的運行而放在內存當中——直到你關閉程序,它才會被釋放掉,所以說,使用全局變量要小心,如非必要,請不要使用。
如果錯誤使用了全局變量會發生什麼呢?
不會發生什麼,頂多就是程序越來越卡,直到卡死不響應,然後重新打開罷了。
實例屬性
聲明在類之中的變量叫做實例的屬性,我們之前討論的那些都是這個傢伙,它聲明在類當中,會隨著對象的創建而放在堆裡,知道對像被釋放掉,它才會隨著對像一起被垃圾收集器帶走。
局部變量
他被聲明在方法當中,一般我們不需要勞心費力地來給局部變量命名——因為它的存在時間太短啦——比如循環當中的計數器也是局部變量(畢竟那也是個方法),它隨著方法的調用而被創建,等到方法執行完畢從桟頂被彈出,那麼這個變量也就消失不見了。
什麼是桟?我們後邊的課程會講到,現在你和它握個手就好了。
生效範圍
不同位置的變量有不同的名字,它們的功能也不盡相同。全局變量是全部類和方法都能夠訪問到的,如果你要做點什麼全局狀態的保存,那麼全局變量是個不錯的選擇。
而實例的屬性就只能被自己的類中的方法來調用別的類想要調用那是不可能的事情——至於創建實例之後……記得我們說過封裝吧?
局部變量則只能被這個方法內讀取的到,別的方法就不行了,它生效範圍最小,存在的時間最短,一般臨時的小變量都是這樣。
這節課沒有作業,下節課我們做個遊戲玩。
轉載請保留出處和原文鏈接:https://www.logcg.com/archives/1112.html
註釋