iOS六大設計原則:單一職責原則(Single Responsibility Principle)凉逛、開閉原則(Open Close Principle)、里氏替換原則(Liskov Substitution Principle)阁危、接口隔離原則(Interface Segregation Principle)玛痊、依賴倒置原則(Dependence Inversion Principle)、迪米特原則(Law Of Demeter)
單一職責原則
單一職責狂打,從字面上就能看出擂煞,各自有各自的職責,可以這樣理解:
UIView:負責事件的傳遞趴乡、響應
CALayer:負責視圖的顯示对省、動畫
他們各自都有自己的職責
例如:在開發(fā)過程中,我們自定義對象晾捏,每個類/對象官辽,只負責一個功能,不要一個對象處理很多邏輯粟瞬。
開閉原則
開閉原則同仆,可以這樣理解:
開:開放出接口供外部使用
閉:不能修改,想要修改裙品,采用繼承的方式
這樣的話俗批,能夠保證APP的穩(wěn)定性及可拓展性
例如:封裝出一個公用類俗或,提供可使用接口。如果不能滿足需求岁忘,不要直接修改類代碼辛慰,最好采用繼承/組合的方式,來拓展以滿足需求干像。
里氏替換原則
理解:父類可被子類無縫替換帅腌,而原有所有功能不受任何影響。
注:可以拓展父類方法麻汰,不要復寫父類方法
例:
//父類
-(void)carName{
NSLog(@"小汽車");
}
//子類
//正確的
-(void)carName{
NSLog(@"小汽車");
}
-(void)carColor{
NSLog(@"紅色的");
}
//錯誤的 影響到了父類原有功能
-(void)carName{
NSLog(@"小汽車速客,紅色的");
}
接口隔離原則
理解:設計接口時,應當各個功能隔離開五鲫,應更具體溺职,更詳細。不要擁擠到一起位喂,做很多用不到的功能浪耘。
例:自定義類中,每個功能單獨設計接口塑崖,不要一個接口中做很多事七冲,有的場景卻用不到其中的某件事
//錯誤的
//有時候不需要開空調(diào)
-(void)usedCar{
NSLog(@"行駛");
NSLog(@"開空調(diào)");
}
//正確的
-(void)usedCar{
NSLog(@"行駛");
}
-(void)openTheAircondition{
NSLog(@"開空調(diào)");
}
依賴倒置原則
理解:抽象不應該依賴于具體實現(xiàn),實現(xiàn)應依賴于抽象
例:
//錯誤的 這里依賴具體的 Gasoline90规婆、Gasoline93類型
class Car {
func refuel(_ gaso: Gasoline90) {
print("加90號汽油")
}
func refuel(_ gaso: Gasoline93) {
print("加93號汽油")
}
}
class Gasoline90 {
}
class Gasoline93 {
}
//正確的 將Gasoline90癞埠、Gasoline93抽象成IGasoline類,然后就不要管具體是啥
class Car {
func refuel(_ gaso: IGasoline) {
print("加\(gaso.name)汽油")
}
}
protocol IGasoline {
var name: String { get }
}
class Gasoline90: IGasoline {
var name: String = "90號"
}
class Gasoline93: IGasoline {
var name: String = "93號"
}
迪米特原則
理解:對象之間互相不要知道太多具體實現(xiàn)聋呢,知道的越多耦合性越強苗踪,修改一個對象對另一個影響越大。
//錯誤的
//類A
-(void)isUseCar{
if([B.person isEqualToString: @"男人"]){
NSLog(@"開車");
}else if([B.person isEqualToString: @"女人"]){
NSLog(@"不開車");
}
//正確的
//類A
-(void)useCar{
if(B.isUseCar){
NSLog(@"開車");
}else{
NSLog(@"不開車");
}
//類B
-(BOOL)isUseCar{
if([B.person isEqualToString: @"男人"]){
return YES;
}else if([B.person isEqualToString: @"女人"]){
return NO;
}
}
/*
這樣設計削锰,后面對B類中的判斷條件進行更改通铲,不會影響到A類。
例如添加判斷條件器贩,“是否是小孩”颅夺。這樣只需更改B類中代碼即可。
從而達到:高內(nèi)聚蛹稍、低耦合
*/
}