最近在看《重構(gòu)》的書肴捉,想到Xcode有一個Refactor的功能哗戈,不知道您用的多不多,用這個功能在我們開發(fā)過程中跨琳,可以提高開發(fā)效率哪痰。
右鍵顯示
一、Rename
重命名符號久妆,修改屬性或方法的名字晌杰。
當(dāng)然有可能您用的是全局Replace這個方法,但是這個無法替換Class的文件名筷弦。
演示下將TestViewController的.h .m .xib及用到的地方修改為有意義的命HomeViewController肋演。
1.在TestViewController上右鍵點擊,選擇Refactor->Rename
2.將TestViewController修改為HomeViewController,點擊Preview烂琴。
3.點擊查看并確認爹殊,是否是重命名正確。點擊Save,再點擊Continue奸绷。Rename完成梗夸。
4.再去全局搜索TestViewController
還有注釋中的未被修改,選擇Replace替換為HomeViewController号醉。
重命名Property操作也同上反症。所以看到不符合規(guī)范的變量名和方法名及類名,快速的修改吧畔派,提高代碼的可讀性铅碍。
二、 Extract
封裝代碼线椰。
有時候在鍵盤上健步如飛的敲寫代碼胞谈,發(fā)現(xiàn)一個方法中超過了200行的代碼,要進行方法的分割。如提取通用的代碼烦绳,方法其他方法調(diào)用卿捎。用Extract很簡單。
操作如下:
1.選中需要提取的代碼爵嗅,右鍵點擊娇澎,選中Extract
New method 是新方法,OC的方法睹晒。eg.
- (void)extracted_method
New function是新函數(shù)趟庄,C語言的函數(shù)。eg.
void extracted_function()
2.修改方法伪很,點擊Preview
點擊Save戚啥,再選擇Continue。
3.封裝完成
由原來的
- (void)layoutSubviews
{
[super layoutSubviews];
NSInteger count = [self.subviews count];
for (int i = 0; i < count; i++) {
UIButton *btn = self.subviews[i];
btn.tag = i;
CGFloat x = i * self.bounds.size.width / count;
CGFloat y = 0;
CGFloat width = self.bounds.size.width / count;
CGFloat height = self.bounds.size.height;
btn.frame = CGRectMake(x, y, width, height);
}
}
修改為
- (void)updateButtonFrame
{
NSInteger count = [self.subviews count];
for (int i = 0; i < count; i++) {
UIButton *btn = self.subviews[i];
btn.tag = i;
CGFloat x = i * self.bounds.size.width / count;
CGFloat y = 0;
CGFloat width = self.bounds.size.width / count;
CGFloat height = self.bounds.size.height;
btn.frame = CGRectMake(x, y, width, height);
}
}
- (void)layoutSubviews
{
[super layoutSubviews];
[self updateButtonFrame];
}
減少很多復(fù)制黏貼锉试。
三猫十、 Create Superclass
創(chuàng)建超類。
1. 選中類名呆盖,點擊右鍵Refactor->Create Superclass
Create files for new superclass: 創(chuàng)建新文件來創(chuàng)建新類
Add superclass to HomeViewController's files: 在HomeViewController中添加新類拖云。
2. 輸入超類名稱,點擊Preview
點擊Save应又,再點擊Continue宙项。
3. 修改Superclass的繼承類名
完成
四、 Move Up
將實例變量株扛,property變量或方法移動到超類尤筐。
移動方法舉例
方法申明
- (void)updateUserInfo;
方法實現(xiàn)
- (void)updateUserInfo
{
NSLog(@"Hello World!");
}
1. 選中類名, 右鍵點擊Refactor->Move Up
2. 點擊Preview
啥都沒有顯示洞就,點擊Save
3. 方法已經(jīng)到超類BaseViewController
#import <UIKit/UIKit.h>
@interface BaseViewController : UIViewController
- (void)updateUserInfo;
@end
五盆繁、 Move Down
將實例變量移動到子類。
@interface BaseViewController (){
NSString *schoolNameStr;
}
1. 選中schoolNameStr旬蟋,右鍵Refactor->Move Down
2. 點擊Preview, 再點擊Save油昂。
在子類HomeViewController中,可以看到schoolNameStr變量倾贰。
@interface HomeViewController : BaseViewController {
NSString *schoolNameStr;
}
六秕狰、 Encapsulate
創(chuàng)建Setter和Getter方法。
只能對實例變量進行操作躁染,對property無效鸣哀。
@interface HomeViewController ()
{
NSString *nameStr;
}
1. 選中nameStr,點擊右鍵Refactor->Encapsulate
2. 修改Getter和Setter的方法名后吞彤,點擊Preview
3. 點擊Save
- (NSString *)nameStr {
return nameStr;
}
- (void)setNameStr:(NSString *)newValue {
nameStr = newValue;
}
Setter和Getter的方法生成完成我衬。
// END