最近一直在思考并持續(xù)的擴(kuò)充著自己的技術(shù)棧跺嗽,比如每天堅(jiān)持著學(xué)習(xí)前端知識(shí)战授,并且時(shí)常想著在移動(dòng)端這條路上页藻,自己的技術(shù)盲區(qū)。誠然植兰,想要在一個(gè)領(lǐng)域達(dá)到一定的技術(shù)高度是挺困難的一件事情份帐,操之過急萬萬不可,最主要的還是保持對(duì)技術(shù)的熱情楣导,慢慢沉淀废境。
以前的公司并不需要高強(qiáng)度的加班,所以時(shí)長有時(shí)間去發(fā)掘一些新鮮玩意兒筒繁,圈內(nèi)有了技術(shù)熱潮噩凹,也能及時(shí)跟進(jìn)觀望或者學(xué)習(xí),但是最近在一波高強(qiáng)度加班過后毡咏,這種業(yè)務(wù)代碼與自身學(xué)習(xí)之間的沖突也讓我產(chǎn)生了一些自己的看法驮宴。一個(gè)程序員,不論何時(shí)呕缭,不能拋掉持續(xù)學(xué)習(xí)的習(xí)慣堵泽。
最近的大面積寫業(yè)務(wù)代碼,當(dāng)碰到兩個(gè)類之間的傳值問題恢总,我習(xí)慣性的解決方案是使用delegate
迎罗,我覺得delegate
本身當(dāng)命名得當(dāng)并且功能單一時(shí),可閱讀性會(huì)比較好片仿。在習(xí)慣了這種思維后纹安,開發(fā)中也養(yǎng)成了自己的習(xí)慣。
但是在最近封裝代碼的時(shí)候砂豌,我發(fā)覺delegate
對(duì)于我自己定義并編寫代碼來說厢岂,可讀性和使用性很好,但是當(dāng)他人來使用我封裝的代碼的時(shí)候奸鸯,也許Block
更容易被理解一點(diǎn)。舉個(gè)簡單的例子可帽,就比如
[UIView animateWithDuration:1 animations:^{
//do something
}];
這是我們?nèi)粘W畛S玫?code>Block結(jié)構(gòu)之一娄涩,需要執(zhí)行的事情,只要在Block
中交代清楚就可以了映跟,在閱讀他人的代碼時(shí)蓄拣,可以直接在Block
中直接閱讀到執(zhí)行的事件,并不用再去關(guān)注各種delegate
中執(zhí)行了什么努隙。大大提高了代碼的可讀性球恤。
我認(rèn)為,程序員首先是寫人能看得懂的代碼荸镊,順便運(yùn)行咽斧。
在這個(gè)理念的驅(qū)使下堪置,我大概會(huì)在之后的開發(fā)過程中,對(duì)可讀性這個(gè)概念更上心一點(diǎn)张惹,能用block
處理的事件舀锨,盡量的用block
處理。很久以前我寫過一篇博客宛逗,講述的是blcok
的傳值坎匿,iOS4.0開始,蘋果爸爸引入了block
的特性雷激,而自從block
特性誕生之日起替蔬,似乎它就受到了蘋果爸爸特殊的照顧和青睞。字面上說屎暇,block
就是一個(gè)代碼塊承桥,但是它的神奇之處在于在內(nèi)聯(lián)(inline)執(zhí)行的時(shí)候(這和C++很像)還可以傳遞參數(shù)。同時(shí)block本身也可以被作為參數(shù)在方法和函數(shù)間傳遞恭垦,這就給予了block
無限的可能快毛。
在日常的coding
里絕大時(shí)間里開發(fā)者會(huì)是各種block
的使用者,但是當(dāng)你需要構(gòu)建一些比較基礎(chǔ)的番挺,提供給別人用的類的時(shí)候唠帝,使用block
會(huì)給別人的使用帶來很多便利。當(dāng)然如果你已經(jīng)厭煩了一直使用delegate
模式來編程的話玄柏,偶爾轉(zhuǎn)轉(zhuǎn)寫一些block
襟衰,不僅可以鍛煉思維,也能讓你寫的代碼看起來高端洋氣一些粪摘,而且因?yàn)榇a跳轉(zhuǎn)變少瀑晒,所以可讀性也會(huì)增加。
今天我用一個(gè)判斷奇數(shù)偶數(shù)的例子徘意,來說說如何在封裝的方法中苔悦,根據(jù)條件來執(zhí)行方法內(nèi)攜帶的block
。
首先看看我們這個(gè)含有blcok
的類是如何聲明的椎咧。
typedef void (^LixExcuteOperation)(NSInteger);
typedef void(^LixError)(void);
@interface LixBlock : NSObject
- (void)isOddNumber:(NSInteger)number Excute:(LixExcuteOperation)excute Lixerror:(LixError)error;
@end
結(jié)合下面的圖片玖详,來看看block
是如何聲明并且定義的。
再來看看這個(gè)方法的內(nèi)部勤讽,是如何使用block
的蟋座,因?yàn)槭鞘纠晕液艽致缘娜ヅ袛嗔似媾紨?shù)脚牍,并沒有考慮特殊情況肆糕,見諒逗柴,只是個(gè)栗子讲冠。
- (void)isOddNumber:(NSInteger)number Excute:(LixExcuteOperation)excute Lixerror:(LixError)error {
BOOL isOddNum = number % 2 == 0 ? NO : YES;
if (isOddNum && excute) {
excute(number);
}
if (!isOddNum && error) {
error();
}
}
至于調(diào)用,就更加隨意了君纫。
LixBlock *block = [[LixBlock alloc] init];
[block isOddNumber:9 Excute:^(NSInteger number) {
NSLog(@"is OddNumber %ld", number);
} Lixerror:^{
NSLog(@"is not OddNumber");
}];
至此,一個(gè)簡單的封裝block
進(jìn)方法的栗子就已經(jīng)講完了三娩。舉一反三的講庵芭,我們在對(duì)網(wǎng)絡(luò)請求進(jìn)行二次封裝,執(zhí)行success
或者error
狀態(tài)的閉包時(shí)雀监,就可以用到類似的思想了双吆。代碼的可讀性是否如愿提升了呢。
簡單的栗子講到這里会前,Coding
還是需要多寫多思考的好乐。