- method chaining 的方便性
鏈?zhǔn)秸{(diào)用 或者稱為 方法鏈 更合適,method chaining(named parameter idiom),即用.連續(xù)調(diào)用多個(gè)方法,每次方法調(diào)用都返回當(dāng)前對象本身
LYFruitTea *fruitTea = [[LYFruitTea alloc] init]
.mc_setFruitVariety(LYFruitVariety_Kiwi)
.mc_setSweetness(30)
.mc_setIced(YES);
不使用 method chaining 的方法調(diào)用
LYFruitTea *fruitTea = [[LYFruitTea alloc] init];
fruitTea.fruitVariety = LYFruitVariety_Kiwi;
fruitTea.sweetness = 30;
fruitTea.iced = YES;
從上面的代碼比對來看,method chaining 是一個(gè)較為優(yōu)雅的調(diào)用方式,如此設(shè)計(jì)使用讓代碼看起來變得簡潔干凈,優(yōu)點(diǎn)如下:
- 調(diào)用過程更接近自然語言,便于閱讀理解
- 在數(shù)據(jù)處理方面,可以讓數(shù)據(jù)保持單向流動(dòng)
- 將參數(shù)列表復(fù)雜的一個(gè)方法改為參數(shù)列表簡單的多個(gè)方法進(jìn)行調(diào)用
- 減少不必要的代碼量
這很有益于開發(fā)效率的提高, 特別是使用者可以很愉快的調(diào)用,當(dāng)然,他也不是萬能的,畢竟他只能返回本身對象的方法里使用
-
method chaining 在 Objective-C 里的實(shí)現(xiàn)
method chaining 在 Objective-C 中的應(yīng)用,很有名的就有 Masonry
make.left.equalTo(self.XXView.mas_right).mas_offset(8);
那它具體是如果在 Objective-C 實(shí)現(xiàn)的呢?其實(shí)就是 block 的一個(gè)使用
首先.的用法在Objective-C里多見于屬性的調(diào)用(或者無參數(shù)設(shè)置的方法),同時(shí)屬性的setter/getter 為自動(dòng)補(bǔ)足,最終其實(shí)依然是[fruitTea setFruitVariety:LYFruitVariety_Kiwi];的方法調(diào)用,所以.其實(shí)算是語法糖
@property (nonatomic, assign) LYFruitVariety fruitVariety;
- (LYFruitTea *)reserve;
//使用
LYFruitTea *fruitTea = [[LYFruitTea alloc] initWith:self];
fruitTea.fruitVariety = self.fruitVariety;
fruitTea.reserve;
到了這里是不是想到只要將無參數(shù)設(shè)置的方法返回對象本身就可以了,確實(shí)如此,可是總不能沒有參數(shù)設(shè)置吧,還需要能通過()傳參,這在 Objective-C 中即 block 能實(shí)現(xiàn),返回一個(gè)帶參的block,并且這個(gè)block執(zhí)行后返回對象本身
@property (nonatomic, strong, readonly) LYFruitTea *(^mc_setFruitVariety)(LYFruitVariety fruitVariety);
//實(shí)現(xiàn)
- (LYFruitTea *(^)(LYFruitVariety))mc_setFruitVariety {
__weak typeof(self) wSelf = self;
return ^LYFruitTea *(LYFruitVariety fruitVariety){
__strong typeof(wSelf) sSelf = wSelf;
sSelf.fruitVariety = fruitVariety;
return sSelf;
};
}
-
method chaining 在 Swift 里的實(shí)現(xiàn)
其實(shí) Swift 中實(shí)現(xiàn) method chaining 更簡單方便,Swift 就是通過.和()來調(diào)用的,只需在方法后返回對象本身就可以
func setFruitVariety(_ fruitVariety: LYFruitVariety) -> LYFruitTea {
self.fruitVariety = fruitVariety
return self
}
剛開始看還是有點(diǎn)繞,通過 . 來實(shí)現(xiàn)屬性調(diào)用,通過 block 實(shí)現(xiàn)傳參,同時(shí) block 執(zhí)行運(yùn)算后返回對象本身即可實(shí)現(xiàn)通過 . 連續(xù)調(diào)用了
雖然通過這種方式在實(shí)現(xiàn)上層次更深了,同時(shí)性能上降了一丟丟,但是對于使用者來說,使用上閱讀上簡直不要太爽,效率都提高了不少呢,原來一天碼/讀100行,現(xiàn)在一口氣碼/讀1000行都不累了有木有?(?????????)?,比藍(lán)瓶鈣還有效