มันง่ายจริง ๆ แล้ว:
แทนที่จะมีตัวสร้างซึ่งทำการตั้งค่าของคุณ
// c-family pseudo-code
public class Thing {
public Thing (a, b, c, d) { this.x = a; this.y = b; /* ... */ }
}
... ให้นวกรรมิกของคุณทำน้อยหรือไม่มีเลยและเขียนวิธีการที่เรียกว่า.init
หรือ.initialize
ซึ่งจะทำในสิ่งที่ตัวสร้างของคุณทำตามปกติ
public class Thing {
public Thing () {}
public void initialize (a, b, c, d) {
this.x = a; /*...*/
}
}
ดังนั้นตอนนี้แทนที่จะเป็นเช่น:
Thing thing = new Thing(1, 2, 3, 4);
คุณสามารถไปที่:
Thing thing = new Thing();
thing.doSomething();
thing.bind_events(evt_1, evt_2);
thing.initialize(1, 2, 3, 4);
ประโยชน์ที่ได้รับคือตอนนี้คุณสามารถใช้การพึ่งพาการฉีด / การผกผันของการควบคุมได้ง่ายขึ้นในระบบของคุณ
แทนที่จะพูด
public class Soldier {
private Weapon weapon;
public Soldier (name, x, y) {
this.weapon = new Weapon();
}
}
คุณสามารถสร้างทหารให้เขาวิธีการติดตั้งที่คุณมอบให้เขาอาวุธแล้วโทรทั้งหมดส่วนที่เหลือของฟังก์ชั่นคอนสตรัคที่
ดังนั้นแทนที่จะเป็น subclassing ศัตรูที่ทหารคนหนึ่งมีปืนพกและอีกคนมีปืนยาวและอีกคนมีปืนลูกซองและนั่นเป็นความแตกต่างเพียงอย่างเดียวคุณสามารถพูดได้ว่า:
Soldier soldier1 = new Soldier(),
soldier2 = new Soldier(),
soldier3 = new Soldier();
soldier1.equip(new Pistol());
soldier2.equip(new Rifle());
soldier3.equip(new Shotgun());
soldier1.initialize("Bob", 32, 48);
soldier2.initialize("Doug", 57, 200);
soldier3.initialize("Mike", 92, 30);
ข้อตกลงเดียวกันกับการทำลาย หากคุณมีความต้องการพิเศษ (ลบผู้ฟังเหตุการณ์ลบอินสแตนซ์จากอาร์เรย์ / โครงสร้างใด ๆ ที่คุณทำงานด้วย ฯลฯ ) จากนั้นคุณจะเรียกพวกเขาด้วยตนเองเพื่อให้คุณรู้ว่าเมื่อใดและที่ไหนในโปรแกรมที่เกิดขึ้น
แก้ไข
ดังที่ Kryotan ได้ระบุไว้ด้านล่างคำตอบนี้เป็นคำตอบของโพสต์ต้นฉบับว่า "อย่างไร"แต่ไม่ได้ผลที่ดีของ "ทำไม"
ดังที่คุณเห็นได้จากคำตอบข้างต้นอาจไม่มีความแตกต่างระหว่าง:
var myObj = new Object();
myObj.setPrecondition(1);
myObj.setOtherPrecondition(2);
myObj.init();
และการเขียน
var myObj = new Object(1,2);
ในขณะที่มีฟังก์ชั่นคอนสตรัคเตอร์ขนาดใหญ่กว่า
มีการโต้แย้งที่จะสร้างขึ้นสำหรับวัตถุที่มีเงื่อนไขล่วงหน้า 15 หรือ 20 ข้อซึ่งจะทำให้ตัวสร้างเป็นอย่างมากยากมากที่จะทำงานด้วยและมันจะทำให้สิ่งต่าง ๆ มองเห็นและจดจำได้ง่ายขึ้นโดยดึงสิ่งเหล่านั้นออกมาในส่วนต่อประสาน เพื่อให้คุณสามารถดูว่าการสร้างอินสแตนซ์ทำงานได้สูงขึ้นไปหนึ่งระดับ
การกำหนดค่าทางเลือกของวัตถุนั้นเป็นส่วนขยายตามธรรมชาติของสิ่งนี้ ตั้งค่าเป็นทางเลือกบนอินเทอร์เฟซก่อนที่จะทำให้วัตถุทำงาน
JS มีทางลัดที่ยอดเยี่ยมสำหรับความคิดนี้ซึ่งดูเหมือนจะไม่เป็นภาษาที่ใช้ภาษา c
ที่กล่าวว่ามีโอกาสถ้าคุณกำลังจัดการกับรายการอาร์กิวเมนต์ที่ยาวในนวกรรมิกของคุณว่าวัตถุของคุณมีขนาดใหญ่เกินไปและทำมากเกินไปตามที่เป็นอยู่ อีกครั้งนี่เป็นสิ่งที่ชอบเป็นส่วนตัวและมีข้อยกเว้นมากมายและกว้างไกล แต่ถ้าคุณส่ง 20 สิ่งเข้าไปในวัตถุโอกาสที่ดีที่คุณสามารถหาวิธีทำให้วัตถุนั้นทำได้น้อยลงโดยทำให้วัตถุเล็กลง .
เหตุผลที่เกี่ยวข้องมากขึ้นและเหตุผลที่ใช้ได้อย่างกว้างขวางคือการเริ่มต้นของวัตถุนั้นอาศัยข้อมูลแบบอะซิงโครนัสซึ่งคุณยังไม่มี
คุณรู้ว่าคุณต้องการวัตถุดังนั้นคุณจะสร้างมันต่อไป แต่เพื่อให้มันทำงานได้อย่างถูกต้องมันต้องการข้อมูลจากเซิร์ฟเวอร์หรือจากไฟล์อื่นซึ่งตอนนี้มันต้องโหลด
อีกครั้งไม่ว่าคุณจะส่งข้อมูลที่ต้องการไปสู่การเริ่มต้นที่มโหฬารหรือการสร้างอินเทอร์เฟซนั้นไม่สำคัญสำหรับแนวคิดมากเท่าที่มันสำคัญสำหรับอินเทอร์เฟซของวัตถุของคุณและการออกแบบระบบของคุณ ...
แต่ในแง่ของการสร้างวัตถุคุณอาจทำสิ่งนี้:
var obj_w_async_dependencies = new Object();
async_loader.load(obj_w_async_dependencies.async_data, obj_w_async_dependencies);
async_loader
อาจได้รับชื่อไฟล์หรือชื่อทรัพยากรหรืออะไรก็ตามโหลดทรัพยากรนั้น - มันอาจโหลดไฟล์เสียงหรือข้อมูลภาพหรืออาจโหลดสถิติอักขระที่บันทึกไว้ ...
... แล้วมันจะดึงข้อมูลนั้นกลับเข้าobj_w_async_dependencies.init(result);
มา
ไดนามิกประเภทนี้พบได้บ่อยในเว็บแอพ
ไม่จำเป็นต้องอยู่ในโครงสร้างของวัตถุสำหรับแอปพลิเคชันระดับสูงกว่า: ตัวอย่างเช่นแกลเลอรีอาจโหลดและเริ่มต้นได้ทันทีจากนั้นแสดงรูปภาพขณะที่สตรีมเข้า - นั่นไม่ใช่การเริ่มต้นแบบ async แต่ที่เห็นบ่อยขึ้น ในไลบรารี JavaScript
หนึ่งโมดูลอาจขึ้นอยู่กับอีกโมดูลหนึ่งและดังนั้นการเริ่มต้นของโมดูลนั้นอาจถูกเลื่อนออกไปจนกว่าการโหลดของผู้ติดตามจะเสร็จสมบูรณ์
ในแง่ของอินสแตนซ์เฉพาะของเกมให้พิจารณาGame
คลาสจริง
ทำไมเราไม่สามารถโทรหา.start
หรือ.run
ในตัวสร้าง?
จำเป็นต้องโหลดทรัพยากร - ทุกอย่างที่เหลือถูกกำหนดไว้แล้วและดีต่อการเดินทาง แต่ถ้าเราลองเล่นเกมโดยไม่ต้องเชื่อมต่อฐานข้อมูลหรือไม่มีพื้นผิวหรือแบบจำลองหรือเสียงหรือระดับมันจะไม่เป็นเช่นนั้น เกมที่น่าสนใจโดยเฉพาะ ...
... ดังนั้นอะไรคือความแตกต่างระหว่างสิ่งที่เราเห็นของแบบทั่วไปGame
ยกเว้นว่าเราจะให้ชื่อของ "ไปข้างหน้า" ซึ่งเป็นวิธีที่น่าสนใจกว่า.init
(หรือตรงกันข้ามทำลายการเริ่มต้นแยกกันยิ่งกว่าเพื่อแยกโหลด การตั้งค่าสิ่งต่าง ๆ ที่ถูกโหลดและเรียกใช้โปรแกรมเมื่อทุกอย่างได้รับการตั้งค่า