Đảo ngược phụ thuộc iOS

Apr 15 2023
Đảo ngược phụ thuộc là gì: Đảo ngược phụ thuộc là một nguyên tắc thiết kế có thể áp dụng cho phát triển iOS (cũng như phát triển phần mềm khác). Nguyên tắc gợi ý rằng các mô-đun hoặc thành phần cấp cao không nên phụ thuộc trực tiếp vào các mô-đun hoặc thành phần cấp thấp.

Đảo ngược phụ thuộc là gì:

Đảo ngược phụ thuộc là một nguyên tắc thiết kế có thể áp dụng cho phát triển iOS (cũng như phát triển phần mềm khác). Nguyên tắc gợi ý rằng các mô-đun hoặc thành phần cấp cao không nên phụ thuộc trực tiếp vào các mô-đun hoặc thành phần cấp thấp. Thay vào đó, cả các thành phần cấp cao và cấp thấp đều phải phụ thuộc vào sự trừu tượng hóa hoặc giao thức.

Tại sao trừu tượng hóa và giao thức:

Về mặt thực tế, điều này có nghĩa là khi xây dựng một ứng dụng iOS, các nhà phát triển nên tạo các giao thức hoặc giao diện xác định hành vi của một số tính năng hoặc thành phần nhất định trong ứng dụng. Các giao thức này sau đó sẽ được triển khai bởi các lớp hoặc mô-đun cụ thể cung cấp chức năng cho các tính năng đó.

bằng cách sử dụng các giao thức và trừu tượng, mã sẽ dễ bảo trì và kiểm tra hơn, đồng thời cho phép linh hoạt hơn trong việc thay đổi hoặc thay thế các thành phần mà không ảnh hưởng đến kiến ​​trúc tổng thể của ứng dụng. Ví dụ: nếu một thành phần nhất định cần được thay thế, ứng dụng có thể tiếp tục hoạt động miễn là thành phần thay thế tuân theo cùng một giao thức hoặc giao diện.

Ví dụ thực tế:

Giả sử bạn đang xây dựng ứng dụng iOS truy xuất dữ liệu từ API web và hiển thị dữ liệu đó trong chế độ xem bảng. Một cách để triển khai điều này là có bộ điều khiển chế độ xem quản lý chế độ xem bảng thực hiện các lệnh gọi trực tiếp đến lớp ứng dụng khách API web để tìm nạp dữ liệu.

Tuy nhiên, điều này tạo ra sự liên kết chặt chẽ giữa bộ điều khiển chế độ xem và ứng dụng khách API web, điều này có thể khiến mã khó kiểm tra và bảo trì. Nếu bạn muốn thay đổi cách dữ liệu được tìm nạp hoặc hiển thị, bạn sẽ phải sửa đổi bộ điều khiển chế độ xem, điều này vi phạm nguyên tắc đóng/mở.

Để áp dụng nguyên tắc Đảo ngược phụ thuộc, bạn có thể tạo một bản tóm tắt ở dạng giao thức hoặc giao diện xác định hành vi của ứng dụng API web. Ví dụ: bạn có thể định nghĩa một giao thức được gọi APIClientbằng một phương thức có tên là fetchData, phương thức này trả về một mảng các đối tượng dữ liệu.

protocol APIClient {
    func fetchData(completion: @escaping ([DataObject]) -> Void)
}

class WebAPIClient: APIClient {
    func fetchData(completion: @escaping ([DataObject]) -> Void) {
        // Make HTTP request to fetch data and call completion block
    }
}

class TableViewController: UIViewController {
    let apiClient: APIClient
    
    init(apiClient: APIClient) {
        self.apiClient = apiClient
        super.init(nibName: nil, bundle: nil)
    }
    
    // ...
}

Ví dụ: bạn có thể tạo một triển khai mô phỏng APIClienttrả về dữ liệu giả cho mục đích thử nghiệm.

class MockAPIClient: APIClient {
    func fetchData(completion: @escaping ([DataObject]) -> Void) {
        let dataObjects = [DataObject(id: 1, name: "Object 1"), 
                           DataObject(id: 2, name: "Object 2")]
        completion(dataObjects)
    }
}

let mockAPIClient = MockAPIClient()
let tableViewController = TableViewController(apiClient: mockAPIClient)