Sean's Note: 3月 2015

2015年3月27日 星期五

[iOS8] 隱私權設定

iOS 的隱私權,譬如說“相機”,一但被應用程式請求過,
在“設定”->“隱私權”-> “相機”的列表就會出現該應用程式,
而下次應用程式就無法在請求權限,使用者只能到設定去更改,
即使重新安裝也一樣。若開發時,想要測試,可以到“設定”->“一般”->“重置”->
“重置定位服務與隱私權”去重置設定,這樣應用程式就可以再次請求使用者。

2015年3月12日 星期四

[讀書筆記] Refactoring - Chapter2 - 6

Chapter 2. Principles in Refactoring

Refactoring (noun): a change made to the internal structure of software to make it
easier to understand and cheaper to modify without changing its observable behavior.

Refactor (verb): to restructure software by applying a series of refactorings without
changing its observable behavior.


The Rule of Three: Three strikes and you refactor. 
開始做第一件事情的時候,就毫無顧忌的直接做吧。當開始做第二件相似的事情,瞥一下重複的地方,但還是一樣照做。直到第三次又做相似的事情,就重構吧!

Chapter 3. Bad Smells in Code

看完第六章再來看這章可能會比較清楚。

Duplicate Code

Long Method
當發現有註解(Comments)在說明一區甚至是一行的程式碼時,可以考慮將其取出,另寫成函式(Extract Method),配上清楚的函式名稱,也許會更清楚易懂。

Large Class
當一個類別極為龐大時,通常也隱含的許多變數的存在,當一個類別有許多變數,那也有極大的可能出現重複的程式碼,此時我們可以用 Extract Class 或 Extract Subclass 來解決問題 。

Long Parameter List


Chapter 6. Composing Method

前面的章節落落長說了一堆,終於來到比較有重點的一章。

Extract Method
如同其名,大概也是最常用到的 Refactoring 方法。可分成三種情形:
1. 沒有區域變數 - 直接就把一段程式碼搬到另一個函式 void newMethod()。
2. 有區域變數,且其值不因新函式而改變  - 把區域變數當成新函式的參數 void newMethod(int param1, ...)。
3.1. 有區域變數,且其值因新函式而改變,且供後段程式碼所用 - 把區域變數當成新函式的回傳結果 int newMethod()。
3.2. 有區域變數,且其值因新函式而改變,但不為後段程式碼所用 - 把區域變數當成新函式的區域變數。

Inline Method
剛好與 Extract Method 相反,當一個函式裡的程式碼,簡單到一看就知道在做什麼時,可以直接把函式拿掉,而把程式碼搬進 Caller 裡。

Inline Temp
這好像比較少遇到,例子中是說如果有一暫存變數只被簡單的 expression 賦值了一次,然後就當作結果回傳,這個暫存變數可以被省略,直接回傳 expression 。

Replace Temp with Query
如果有一暫存變數只被賦值了一次,可以用一個函式將其取代,結果雖然會發現新的函式因為取代了暫存變數而被引用了多次,感覺上會有效率上的問題(因為重複計算了多次),但繼續 refactor 下去時,有時會有意想不到的發現(程式碼變得更乾淨清楚了)。

Introduce Explaining Variable
這可以用來提高條件判斷式的可讀性,如果一個條件判斷式裡有很多條複雜的邏輯判斷,我們也許可以將其分別取出,用幾個命名清楚的布林變數來取代。也適用於複雜的 expression。不過有時也會考量用 Extract Method。

Split Temporary Variable
簡單來說就是不要讓一變數重複賦值,如果有不同目的,那就在宣告一個新的變數吧!

Remove Assignments to Parameters
不要讓函式裡的參數再次賦值,這並不會引響外部的結果,又容易造成混淆,定義一個新的變數吧!

Replace Method with Method Object
有些很長的函式難以用 Extract Method 來 Refactor 時,就可以用此法。建立一個 Class 來取代原函式,原 Class、參數和區域變數成為新 Class 的成員變數。

Substitute Algorithm
砍掉重練!(誤)