ดูเหมือนจะมีความสับสนมากมายเกี่ยวกับรูปแบบการพลิกกลับของการควบคุม (IoC) ผู้คนจำนวนมากได้รับการบรรจุด้วยรูปแบบกลยุทธ์หรือแบบจำลองส่วนประกอบ แต่การเปรียบเทียบเหล่านี้ไม่ได้จับภาพสิ่งที่เป็นจริงเกี่ยวกับ IoC IoC เป็นจริงเกี่ยวกับวิธีการได้รับการพึ่งพา ผมขอยกตัวอย่าง:
class Game {
void Load() {
this.Sprite.Load(); // loads resource for drawing later
}
}
class Sprite {
void Load() {
FileReader reader = new FileReader("path/to/resource.gif");
// load image from file
}
}
ในข้างต้นเป็นที่ชัดเจนว่ามีการพึ่งพาได้Sprite.Load
FileReader
เมื่อคุณต้องการทดสอบวิธีที่คุณต้องการดังต่อไปนี้:
- ระบบไฟล์ในสถานที่
- ไฟล์ทดสอบที่จะโหลดจากระบบไฟล์
- ความสามารถในการทริกเกอร์ข้อผิดพลาดของระบบไฟล์ทั่วไป
สองรายการแรกนั้นชัดเจน แต่ถ้าคุณต้องการให้แน่ใจว่าการจัดการข้อผิดพลาดของคุณทำงานตามที่คาดไว้คุณก็จำเป็นต้องมี # 3 เช่นกัน ในทั้งสองกรณีคุณอาจทำให้การทดสอบของคุณช้าลงเล็กน้อยเนื่องจากตอนนี้พวกเขาจำเป็นต้องไปที่ดิสก์และคุณอาจทำให้สภาพแวดล้อมการทดสอบของคุณซับซ้อนขึ้น
เป้าหมายของ IoC คือการแยกการใช้พฤติกรรมออกจากการก่อสร้าง สังเกตว่าสิ่งนี้แตกต่างจากรูปแบบกลยุทธ์อย่างไร ด้วยรูปแบบกลยุทธ์เป้าหมายคือการห่อหุ้มพฤติกรรมที่สามารถใช้ซ้ำได้เพื่อให้คุณสามารถขยายได้ในอนาคต ไม่มีอะไรจะพูดเกี่ยวกับวิธีการสร้างกลยุทธ์
หากเราต้องเขียนSprite.Load
วิธีข้างต้นอีกครั้งเราอาจจะจบลงด้วย:
class Sprite {
void Load(IReader reader) {
// load image through reader
}
}
ตอนนี้เราแยกการสร้างผู้อ่านออกจากการใช้งานแล้ว ดังนั้นจึงเป็นไปได้ที่จะสลับในเครื่องอ่านทดสอบระหว่างการทดสอบ ซึ่งหมายความว่าสภาพแวดล้อมการทดสอบของคุณไม่ต้องการระบบไฟล์อีกต่อไปไฟล์ทดสอบและสามารถจำลองเหตุการณ์ข้อผิดพลาดได้อย่างง่ายดาย
โปรดทราบว่าฉันทำสองสิ่งในการเขียนใหม่ ฉันสร้างส่วนต่อประสานIReader
ที่ห่อหุ้มพฤติกรรมบางอย่าง - เช่นนำรูปแบบกลยุทธ์มาใช้ นอกจากนี้ฉันย้ายความรับผิดชอบในการสร้างผู้อ่านที่เหมาะสมไปยังชั้นเรียนอื่น
บางทีเราไม่ต้องการชื่อรูปแบบใหม่เพื่ออธิบายข้างต้น มันทำให้ฉันเป็นส่วนผสมของกลยุทธ์และรูปแบบของโรงงาน (สำหรับคอนเทนเนอร์ IoC) ที่ถูกกล่าวว่าฉันไม่แน่ใจเกี่ยวกับสิ่งที่ผู้คนคัดค้านรูปแบบนี้เพราะเห็นได้ชัดว่ามันแก้ปัญหาจริงและแน่นอนฉันไม่เห็นชัดเจนว่าสิ่งนี้เกี่ยวกับ Java