iOS開發基礎108-常見的程式設計正規化

Mr.陳發表於2024-07-16

1. 程序導向程式設計(Process-Oriented Programming, POP)

程式碼示例(Swift)

import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        
        printGreeting()
        printNumber(num: 42)
    }
    
    // 函式定義
    func printGreeting() {
        print("Hello, World!")
    }

    func printNumber(num: Int) {
        print("Number: \(num)")
    }
}

2. 物件導向程式設計(Object-Oriented Programming, OOP)

程式碼示例(Swift)

import UIKit

// 類定義
class Animal {
    var name: String
    
    // 建構函式
    init(name: String) {
        self.name = name
    }
    
    // 方法
    func makeSound() {
        print("\(name) makes a sound.")
    }
}

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        
        // 建立物件
        let dog = Animal(name: "Dog")
        // 呼叫方法
        dog.makeSound()
    }
}

3. 面向切面程式設計(Aspect-Oriented Programming, AOP)

在iOS中,面向切面程式設計可以透過Method Swizzling來實現。

程式碼示例(Objective-C)

#import <objc/runtime.h>
#import <UIKit/UIKit.h>

@implementation UIViewController (Swizzling)

// 交換 viewDidLoad 方法
+ (void)load {
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        SEL originalSelector = @selector(viewDidLoad);
        SEL swizzledSelector = @selector(swizzled_viewDidLoad);
        
        Method originalMethod = class_getInstanceMethod(self, originalSelector);
        Method swizzledMethod = class_getInstanceMethod(self, swizzledSelector);
        
        method_exchangeImplementations(originalMethod, swizzledMethod);
    });
}

- (void)swizzled_viewDidLoad {
    [self swizzled_viewDidLoad];
    NSLog(@"viewDidLoad: %@", self);
}

@end

4. 函數語言程式設計(Functional Programming, FP)

程式碼示例(Swift)

import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        
        // 函式定義
        let add: (Int, Int) -> Int = { $0 + $1 }
        let square: (Int) -> Int = { $0 * $0 }
        
        // 函式呼叫
        let result = square(add(2, 3))
        print(result) // 輸出:25
    }
}

5. 響應式程式設計

在iOS中,可以使用RxSwift來實現響應式程式設計。

程式碼示例(Swift)

import UIKit
import RxSwift

class ViewController: UIViewController {
    
    let disposeBag = DisposeBag()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        Observable.just("Hello, World!")
            .subscribe(onNext: { print($0) })
            .disposed(by: disposeBag)
    }
}

6. 鏈式程式設計

在iOS中,SnapKit是一個使用鏈式程式設計風格的自動佈局庫。

程式碼示例(Swift)

import UIKit
import SnapKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        
        let button = UIButton(type: .system)
        self.view.addSubview(button)
        
        button.setTitle("Click Me", for: .normal)
        button.setTitleColor(.blue, for: .normal)
        
        button.snp.makeConstraints { make in
            make.center.equalTo(self.view)
            make.width.height.equalTo(100)
        }
        
        button.addTarget(self, action: #selector(buttonClicked), for: .touchUpInside)
    }
    
    @objc func buttonClicked(_ sender: UIButton) {
        sender.setTitle("Clicked!", for: .normal)
        sender.setTitleColor(.red, for: .normal)
        UIView.animate(withDuration: 1.0) {
            sender.alpha = 0.0
        }
    }
}

總結

每種程式設計正規化都有其獨特的優缺點,適用於不同的場景和問題。下面我們詳細分析程序導向程式設計、物件導向程式設計、面向切面程式設計、函數語言程式設計、響應式程式設計和鏈式程式設計這幾種正規化的優缺點。

1. 程序導向程式設計(Process-Oriented Programming, POP)

優點

  • 簡單直觀:程式碼按順序執行,容易理解和除錯。
  • 效能高:由於沒有複雜的抽象層,通常效能較高。
  • 適用於小型專案:在較小的、邏輯清晰的問題中很有效。

缺點

  • 可維護性差:隨著專案的增大,程式碼會變得難以管理。
  • 缺乏抽象:難以重用程式碼,功能模組之間往往緊密耦合。
  • 不易擴充套件:新增新功能可能需要大幅修改現有程式碼。

2. 物件導向程式設計(Object-Oriented Programming, OOP)

優點

  • 模組化:透過類和物件封裝資料和行為,提高系統的模組化程度。
  • 可重用性:透過繼承和多型實現程式碼重用。
  • 易於維護:高內聚低耦合的特性使得系統易於維護和擴充套件。
  • 抽象:可以更自然地對映現實世界中的物件。

缺點

  • 複雜度較高:引入了類、物件、繼承等概念,增加了系統複雜性。
  • 效能開銷:動態分派和額外的記憶體消耗可能會影響效能。
  • 過度設計的風險:容易陷入過度設計,導致程式碼臃腫。

3. 面向切面程式設計(Aspect-Oriented Programming, AOP)

優點

  • 橫切關注點分離:可以將日誌、事務管理等橫切關注點從業務邏輯中分離出來,提高程式碼的模組化程度。
  • 提高可維護性:減少了程式碼的重複,業務邏輯更加清晰。
  • 動態改變行為:可以在不修改原始碼的情況下動態地改變或擴充套件系統行為。

缺點

  • 複雜性:引入了額外的複雜性和學習曲線,需要理解切面、連線點和通知等概念。
  • 除錯困難:由於行為是動態決定的,可能難以除錯和理解程式的執行流程。
  • 潛在的效能問題:切面程式碼的執行可能會對效能有一定影響。

4. 函數語言程式設計(Functional Programming, FP)

優點

  • 無副作用:函式無副作用,使得程式碼易於測試和除錯。
  • 高階函式:能夠方便地建立和操作函式,提高程式碼的靈活性和重用性。
  • 平行計算:天然適合平行計算,因為不變性和無副作用減少了資料競爭的風險。
  • 簡潔表達:程式碼往往更簡潔和優雅。

缺點

  • 學習曲線:需要理解純函式、閉包、高階函式等概念,有一定的學習曲線。
  • 效能問題:純函式帶來的不可變資料結構可能會影響效能,需要最佳化。
  • 除錯不便:由於函式的鏈式呼叫,有時會較難定位問題。

5. 響應式程式設計

優點

  • 響應變化:方便地處理隨時間變化的資料流,非常適用於UI和實時資料處理。
  • 簡潔性:透過宣告性程式碼簡化了複雜的事件處理邏輯。
  • 高抽象層次:使得程式碼更加模組化和可重用。

缺點

  • 學習曲線:需要理解Observable、Observer、Subject等概念,有一定的學習曲線。
  • 除錯複雜:由於事件驅動的特性,除錯某些Bug可能比較困難。
  • 效能開銷:大量的事件監聽和回撥可能帶來效能問題。

6. 鏈式程式設計

優點

  • 程式碼簡潔:鏈式呼叫使程式碼更加簡潔和易讀。
  • 流暢介面:能提升API的流暢度和使用者體驗。
  • 可組合性:方便地組合多個方法,提升程式碼的靈活性。

缺點

  • 除錯困難:鏈式呼叫可能會使定位錯誤變得複雜,因為堆疊跟蹤較深。
  • 易讀性問題:過長的鏈式呼叫可能會使程式碼難以閱讀。
  • 異常處理:中間步驟出錯的處理可能較為複雜。

7、總結

每種程式設計正規化都有其獨特的優缺點,適用於不同的場景。瞭解和掌握多種程式設計正規化,能夠使開發者在面對不同問題時,選擇最適合的方法,從而提高程式碼質量和開發效率。

  • 程序導向程式設計適用於邏輯簡單、流程線性的場景。
  • 物件導向程式設計適用於需要高可維護性、可擴充套件性的複雜系統。
  • 面向切面程式設計適用於需要分離橫切關注點的系統。
  • 函數語言程式設計適用於需要無副作用、高併發處理的場景。
  • 響應式程式設計適用於需要處理動態資料流和事件驅動的應用。
  • 鏈式程式設計適用於需要簡潔流暢介面設計的庫和API開發。

相關文章