真正的大師永遠懷著一顆學徒的心。
寫在前面
連續(xù)近兩周的加班,僅僅可以換來一周的積累與沉淀(閑)。這時就可以點開書簽欄里面吃灰的文章,再溫習一番同廉。有感,想把一些知識點用OC再寫一遍柑司。
我忘的快迫肖,我個人寫一遍,能抵得上我看十遍攒驰。
正文
單一職責原則是最簡單的面向對象設計原則蟆湖,它用于控制類的粒度大小。單一職責原則定義如下:
單一職責原則(Single Responsibility Principle, SRP):一個類只負責一個功能領域中的相應職責玻粪,或者可以定義為:就一個類而言隅津,應該只有一個引起它變化的原因诬垂。
單一職責原則告訴我們:一個類不能太“累”!在軟件系統(tǒng)中伦仍,一個類(大到模塊结窘,小到方法)承擔的職責越多,它被復用的可能性就越小充蓝,而且一個類承擔的職責過多隧枫,就相當于將這些職責耦合在一起,當其中一個職責變化時棺克,可能會影響其他職責的運作悠垛,因此要將這些職責進行分離,將不同的職責封裝在不同的類中娜谊,即將不同的變化原因封裝在不同的類中确买,如果多個職責總是同時發(fā)生改變則可將它們封裝在同一類中。
單一職責原則是實現(xiàn)高內聚纱皆、低耦合的指導方針湾趾,它是最簡單但又最難運用的原則,需要設計人員發(fā)現(xiàn)類的不同職責并將其分離派草,而發(fā)現(xiàn)類的多重職責需要設計人員具有較強的分析設計能力和相關實踐經(jīng)驗搀缠。
舉例
一個生活中計算工資的場景。在公司里面每人都有對應不同的職位近迁,或者是每人都有自己的等級艺普,例如阿里的P等級。不同的等級對應不同的計算公式鉴竭,一切從簡歧譬,整出來一個工資計算類。
- .h
@interface WageManager : NSObject
/** 根據(jù)名字計算薪資 */
- (CGFloat)calcWageWithName:(NSString *)name;
@end
- .m
#import "WageManager.h"
@implementation WageManager
- (CGFloat)calcWageWithName:(NSString *)name {
NSInteger level = [self calcLevelWithName:name];
return [self calcWageWithLevel:level];
}
/** 計算人所在的等級 */
- (NSInteger)calcLevelWithName:(NSString *)name {
if ([name isEqualToString:@"張三"]) {
return 1;
}else if ([name isEqualToString:@"李四"]) {
return 2;
}else {
return 3;
}
}
/** 不同等級對應不同的薪資計算方式 */
- (CGFloat)calcWageWithLevel:(NSInteger)level {
CGFloat wage = 0;
switch (level) {
case 1: {
wage = level * 10000;
break;
}
case 2: {
wage = level * 1000;
break;
}
case 3: {
wage = level * 100;
break;
}
default:
wage = 50;
break;
}
return wage;
}
@end
可以看到搏存,WageManager
還有2個職責瑰步,一是計算工資等級
,二是根據(jù)工資等級計算工資
璧眠。
問題來了缩焦,如果修改等級制度,就要修改WageManager
责静;如果修改工資計算公式袁滥,也要修改WageManager
。這就違背單一職責原則的定義:就一個類而言泰演,應該只有一個引起它變化的原因呻拌。
可做以下修改:
把一個類分成三個類,各司其職睦焕。以后等級制度劃分變動藐握,或者薪資計算公式有更新的話靴拱,只需要改對應的類就行了。
Demo傳送門
總結
單一職責原則是六大原則里面最簡單的一個猾普,就算沒有聽過袜炕,有經(jīng)驗的coder也會寫出與之對應的代碼。不過在快速迭代的時期初家,沒有養(yǎng)成習慣的話還是會有點出入的偎窘。
后記
如有不足的地方,請留言溜在,以便及時改正陌知。