ในฉบับที่แล้ว เราได้พูดคุยถึงการออกแบบองค์ประกอบการจัดการคิวและตั้งชื่อให้ดังและไม่ซ้ำใคร: Smart Queue ในครั้งนี้ เราจะนำผลการออกแบบก่อนหน้านี้ไปปฏิบัติจริงและนำไปใช้กับโค้ด
อันดับแรก เราต้องพิจารณาเค้าโครงไฟล์ต้นฉบับ นั่นคือ ตัดสินใจว่าจะแยกโค้ดออกเป็นไฟล์อิสระอย่างไร ทำไมทำเช่นนี้? จำตอนท้ายของฉบับที่แล้วที่ฉันพูดถึงว่าส่วนประกอบนี้จะใช้ "รหัสภายนอก" หรือไม่ เพื่อแยกแยะวัตถุประสงค์ของโค้ด จึงตัดสินใจแบ่งโค้ดออกเป็นอย่างน้อยสองส่วน ได้แก่ ไฟล์โค้ดภายนอกและไฟล์ Smart Queue
วัตถุประสงค์ในการสร้างความแตกต่างเป็นเพียงวัตถุประสงค์เดียว และประการที่สอง การกระจายออกเป็นไฟล์อิสระจะเป็นประโยชน์ต่อการบำรุงรักษาโค้ด ลองนึกภาพว่าวันหนึ่งในอนาคตคุณตัดสินใจที่จะเพิ่มฟังก์ชันเพิ่มเติมใหม่ให้กับฟังก์ชันพื้นฐานที่มีอยู่ของการจัดการคิว หรือจัดแพคเกจลงในส่วนประกอบที่ดำเนินงานเฉพาะเจาะจง แต่คุณต้องการรักษาฟังก์ชันที่มีอยู่ (การใช้งานภายใน) และการโทร วิธีการ (อินเทอร์เฟซภายนอก) ยังคงไม่เปลี่ยนแปลง ดังนั้นการเขียนโค้ดใหม่ลงในไฟล์แยกต่างหากจึงเป็นตัวเลือกที่ดีที่สุด
คราวหน้าเราจะเน้นไปที่หัวข้อเค้าโครงไฟล์ ทีนี้เรามาดูประเด็นกันดีกว่า ขั้นตอนแรกคือการสร้างเนมสเปซของตัวเองสำหรับส่วนประกอบ โค้ดทั้งหมดของส่วนประกอบจะถูกจำกัดไว้เฉพาะเนมสเปซระดับบนสุดนี้:
var SmartQueue = window.SmartQueue ||.
SmartQueue.version = '0.1';
ในระหว่างการเริ่มต้น หากคุณพบข้อขัดแย้งของเนมสเปซ ให้ดึงมันออกมาแล้วใช้งาน โดยปกติความขัดแย้งนี้เกิดจากการอ้างอิงถึงโค้ดส่วนประกอบซ้ำ ๆ ดังนั้น "pull over" จะเขียนออบเจ็กต์ใหม่ด้วยการใช้งานแบบเดียวกัน ในกรณีที่แย่ที่สุด หากมีเกิดขึ้นกับออบเจ็กต์อื่นบนเพจที่เรียกว่า SmartQueue นั่นเป็นเรื่องที่น่าอาย ฉันจะ แทนที่การใช้งานของคุณ - หากไม่มีความขัดแย้งในการตั้งชื่อเพิ่มเติม โดยพื้นฐานแล้วทั้งสององค์ประกอบสามารถทำงานได้โดยไม่มีเหตุการณ์ใดๆ แจ้งเลขเวอร์ชั่นให้ด้วย
ถัดไป สร้างสามคิวสำหรับ SmartQueue ตามลำดับความสำคัญสามประการ:
var Q = SmartQueue.Queue = [[], [], []];
แต่ละรายการเป็นอาร์เรย์ว่างเนื่องจากยังไม่มีการเพิ่มงานใดๆ และอีกนัยหนึ่ง ให้สร้าง "ทางลัด" ให้กับมัน หากคุณต้องการเข้าถึงอาร์เรย์ในภายหลัง เพียงแค่เขียน Q[n]
ต่อไป Task ตัวเอกของเราปรากฏตัวอย่างยิ่งใหญ่ - วิธีสร้าง Task ใหม่ถูกกำหนดไว้ที่นี่:
ฉันจะไม่ลงรายละเอียดที่เฉพาะเจาะจงภายใน ด้วยความคิดเห็นที่จำเป็น โดยทั่วไปโค้ดของเราสามารถอธิบายได้ด้วยตนเอง และเช่นเดียวกันกับโค้ดที่ตามมา ที่นี่เราแจ้งลูกค้า (ผู้ใช้): หากคุณต้องการสร้างอินสแตนซ์ SmartQueue.Task ใหม่ คุณต้องส่งพารามิเตอร์อย่างน้อยหนึ่งตัวไปยังตัวสร้างนี้ (สามตัวสุดท้ายสามารถละเว้นได้สำหรับการประมวลผลเริ่มต้น) มิฉะนั้นข้อยกเว้นจะถูกส่งออกไป
แต่นี่ยังไม่เพียงพอ บางครั้ง ลูกค้าต้องการโคลนอินสแตนซ์ใหม่จากงานที่มีอยู่ หรือซ่อมแซม "เนื้อความที่สมบูรณ์แข็งแรง" (อินสแตนซ์วัตถุงานจริง) จาก "เนื้อความที่ถูกปิดใช้งาน" (วัตถุที่มีคุณลักษณะของงานบางอย่าง) โดย วิธีการก่อสร้างข้างต้นค่อนข้างอึดอัด - ลูกค้าต้องเขียนดังนี้:
var task1 = SmartQueue.Task ใหม่ (obj.fn, 1, '', obj.dependencies);
ที่มา: Alipay UED
var T = SmartQueue.Task = function (fn, ระดับ, ชื่อ, การขึ้นต่อกัน) {
ถ้า (ประเภทของ fn !== ฟังก์ชัน) {
โยนข้อผิดพลาดใหม่ ('ประเภทอาร์กิวเมนต์ไม่ถูกต้อง: fn.');
-
นี่.fn = fn;
this.level = _validateLevel(ระดับ) ? ระดับ : LEVEL_NORMAL;
// ตรวจจับประเภทของชื่อ
this.name = ประเภทของชื่อ === STRING && ชื่อ ? ชื่อ : 't' + _id++;
// การขึ้นต่อกันสามารถดึงข้อมูลเป็น 'Object' ได้ ดังนั้นให้ใช้ instanceof แทน
this.dependencies = การอ้างอิงอินสแตนซ์ของ Array ?
-