การผกผันการพึ่งพา IOS

Apr 15 2023
การผกผันการพึ่งพาคืออะไร: การผกผันการพึ่งพาคือหลักการออกแบบที่สามารถประยุกต์ใช้กับการพัฒนา iOS (เช่นเดียวกับการพัฒนาซอฟต์แวร์อื่นๆ) หลักการแนะนำว่าโมดูลหรือส่วนประกอบระดับสูงไม่ควรขึ้นอยู่กับโมดูลหรือส่วนประกอบระดับต่ำโดยตรง

การผกผันการพึ่งพาคืออะไร:

การผกผันการพึ่งพาเป็นหลักการออกแบบที่สามารถใช้กับการพัฒนา iOS (เช่นเดียวกับการพัฒนาซอฟต์แวร์อื่น ๆ ) หลักการแนะนำว่าโมดูลหรือส่วนประกอบระดับสูงไม่ควรขึ้นอยู่กับโมดูลหรือส่วนประกอบระดับต่ำโดยตรง ส่วนประกอบทั้งระดับสูงและระดับต่ำควรขึ้นอยู่กับสิ่งที่เป็นนามธรรมหรือโปรโตคอลแทน

เหตุใดสิ่งที่เป็นนามธรรมและโปรโตคอล:

ในทางปฏิบัติ หมายความว่าเมื่อสร้างแอปพลิเคชัน iOS นักพัฒนาควรสร้างโปรโตคอลหรืออินเทอร์เฟซที่กำหนดลักษณะการทำงานของคุณลักษณะหรือส่วนประกอบบางอย่างในแอป โปรโตคอลเหล่านี้ควรนำไปใช้โดยคลาสหรือโมดูลเฉพาะที่มีฟังก์ชันการทำงานสำหรับคุณสมบัติเหล่านั้น

ด้วยการใช้ abstractions และโปรโตคอล โค้ดจึงง่ายต่อการบำรุงรักษาและทดสอบ และช่วยให้มีความยืดหยุ่นมากขึ้นในการเปลี่ยนหรือแทนที่ส่วนประกอบโดยไม่ส่งผลกระทบต่อสถาปัตยกรรมโดยรวมของแอป ตัวอย่างเช่น หากจำเป็นต้องเปลี่ยนส่วนประกอบบางอย่าง แอปจะยังคงทำงานต่อไปได้ตราบเท่าที่การเปลี่ยนนั้นสอดคล้องกับโปรโตคอลหรืออินเทอร์เฟซเดียวกัน

ตัวอย่างการปฏิบัติ:

สมมติว่าคุณกำลังสร้างแอป iOS ที่ดึงข้อมูลจาก Web API และแสดงในมุมมองตาราง วิธีหนึ่งในการดำเนินการนี้คือการให้ตัวควบคุมมุมมองที่จัดการมุมมองตารางทำการเรียกโดยตรงไปยังคลาสไคลเอนต์ API ของเว็บเพื่อดึงข้อมูล

อย่างไรก็ตาม สิ่งนี้จะสร้างความสัมพันธ์ที่แน่นแฟ้นระหว่างตัวควบคุมมุมมองและไคลเอนต์ API ของเว็บ ซึ่งอาจทำให้โค้ดยากต่อการทดสอบและบำรุงรักษา หากคุณต้องการเปลี่ยนวิธีการดึงข้อมูลหรือแสดงข้อมูล คุณจะต้องแก้ไขตัวควบคุมมุมมอง ซึ่งละเมิดหลักการเปิด/ปิด

หากต้องการใช้หลักการพึ่งพาการผกผัน คุณสามารถสร้างสิ่งที่เป็นนามธรรมในรูปแบบของโปรโตคอลหรืออินเทอร์เฟซที่กำหนดพฤติกรรมของเว็บไคลเอนต์ API ตัวอย่างเช่น คุณสามารถกำหนดโปรโตคอลที่เรียกAPIClientด้วยเมธอดที่เรียกว่าfetchDataซึ่งส่งคืนอาร์เรย์ของออบเจกต์ข้อมูล

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)
    }
    
    // ...
}

ตัวอย่างเช่น คุณสามารถสร้างแบบจำลองการใช้งานAPIClientที่ส่งคืนข้อมูลปลอมเพื่อวัตถุประสงค์ในการทดสอบ

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)