การผกผันการพึ่งพา 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)





































![รายการที่เชื่อมโยงคืออะไร? [ส่วนที่ 1]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)