0. คำจำกัดความโหมดล่าม:
ให้ภาษากำหนดการเป็นตัวแทนของไวยากรณ์และกำหนดล่ามที่ใช้การเป็นตัวแทนเพื่อตีความประโยคในภาษา เป็นของโหมดพฤติกรรม
โหมดล่ามนั้นใช้น้อยมากในการพัฒนาระบบจริงเพราะอาจทำให้เกิดปัญหาเช่นประสิทธิภาพประสิทธิภาพและการบำรุงรักษา
แผนภาพคลาสทั่วไปของโหมดล่ามแสดงในรูป
1. ข้อดีของโหมดล่าม
ล่ามเป็นเครื่องมือวิเคราะห์ไวยากรณ์อย่างง่าย ข้อได้เปรียบที่โดดเด่นที่สุดคือการขยายตัว การปรับเปลี่ยนกฎไวยากรณ์เป็นเพียงการปรับเปลี่ยนนิพจน์ที่ไม่ใช่ขั้วที่สอดคล้องกัน หากคุณขยายไวยากรณ์คุณเพียงแค่ต้องเพิ่มคลาสที่ไม่ใช่เทอร์มินัล
2. ข้อเสียของโหมดล่าม
รูปแบบล่ามจะทำให้เกิดการขยายตัวของคลาส: แต่ละไวยากรณ์จำเป็นต้องสร้างนิพจน์ที่ไม่ใช่เทอร์มินัล เมื่อกฎไวยากรณ์ค่อนข้างซับซ้อนอาจมีการสร้างไฟล์คลาสจำนวนมากซึ่งนำปัญหามาสู่การบำรุงรักษามากมาย
รูปแบบล่ามใช้วิธีการโทรแบบเรียกซ้ำ: นิพจน์ที่ไม่ใช่เทอร์มินัลแต่ละตัวจะสนใจการแสดงออกที่เกี่ยวข้องกับตัวเอง แต่ละนิพจน์จำเป็นต้องทราบผลลัพธ์สุดท้ายและจะต้องเป็นเลเยอร์ที่ไม่เคลือบผิวโดยเลเยอร์ ไม่ว่าจะเป็นภาษาที่มุ่งเน้นกระบวนการหรือภาษาเชิงวัตถุการเรียกซ้ำจะใช้ภายใต้เงื่อนไขที่จำเป็นซึ่งนำไปสู่การดีบักที่ซับซ้อนมาก ลองคิดดูถ้าเราต้องการแก้ไขข้อผิดพลาดทางไวยากรณ์เราจำเป็นต้องดีบั๊กทีละตัวจนกระทั่งหน่วยไวยากรณ์ที่เล็กที่สุดหรือไม่?
ปัญหาประสิทธิภาพ: โหมดล่ามใช้ลูปและการเรียกซ้ำจำนวนมากประสิทธิภาพเป็นปัญหาที่ไม่สามารถเพิกเฉยได้โดยเฉพาะอย่างยิ่งเมื่อใช้เพื่อแยกวิเคราะห์ไวยากรณ์ที่ซับซ้อนและยาวนาน ประสิทธิภาพนั้นทนไม่ได้
3. ใช้สถานการณ์ของโหมดล่าม
ปัญหาซ้ำ ๆ สามารถใช้กับโหมดล่าม: ตัวอย่างเช่นแอปพลิเคชันเซิร์ฟเวอร์หลายตัวสร้างบันทึกจำนวนมากทุกวันและไฟล์บันทึกจะต้องวิเคราะห์และประมวลผล เนื่องจากรูปแบบการบันทึกของแต่ละเซิร์ฟเวอร์นั้นแตกต่างกันองค์ประกอบข้อมูลจึงเหมือนกัน ตามที่ล่ามระบุว่าการแสดงออกของเทอร์มิเนเตอร์นั้นเหมือนกัน แต่จำเป็นต้องมีการแสดงออกที่ไม่ใช่เทอร์มิเนเตอร์ ในกรณีนี้ปัญหาสามารถแก้ไขได้ทุกครั้งและสำหรับทั้งหมดผ่านโปรแกรม
สถานการณ์ที่ต้องมีการอธิบายไวยากรณ์ง่ายๆ: ทำไมมันจึงเรียบง่าย? ดูการแสดงออกที่ไม่ใช่เทอร์มินัล ยิ่งกฎไวยากรณ์มากขึ้นความซับซ้อนและการโทรแบบเรียกซ้ำจะสูงขึ้นระหว่างคลาส (ดูสแต็กในตัวอย่างของเรา) ซึ่งไม่ซับซ้อนโดยทั่วไป ลองคิดดูสิคุณต้องใช้ความอดทนและความมั่นใจแบบไหนในการแก้ไขปัญหาเมื่อโทรหลายชั้นเรียน ดังนั้นโหมดล่ามโดยทั่วไปจะใช้เพื่อแยกชุดอักขระมาตรฐานเปรียบเทียบเช่นการวิเคราะห์ไวยากรณ์ SQL แต่ส่วนนี้จะค่อยๆถูกแทนที่ด้วยเครื่องมือพิเศษ ในสภาพแวดล้อมทางธุรกิจพิเศษบางรุ่นจะมีการใช้โมเดลล่าม ตัวอย่างที่เราเพิ่งทำคือสภาพแวดล้อมทางธุรกิจและมีตัวอย่างมากมายของการดำเนินงานรูปแบบในขณะนี้ สถาบันการค้าหลายแห่งสามารถให้ข้อมูลจำนวนมากสำหรับการวิเคราะห์
4. ตัวอย่างง่ายๆ
/ *** ประกาศการดำเนินการตีความแบบนามธรรม*/ ล่ามอินเตอร์เฟสสาธารณะ {การตีความโมฆะสาธารณะ (บริบทบริบท); // ในความเป็นจริงอาจมีประเภทที่ส่งคืนเพื่อกำหนดวัตถุข้อมูลที่ตีความ} คลาสสาธารณะ XMLSaxInterpreter ใช้ล่าม {@Override โมฆะสาธารณะตีความ (บริบทบริบท) {System.out.println ("XML Sax Interpreter:" }} คลาสสาธารณะ XMLDOMInterpreter ใช้ล่าม {@Override โมฆะสาธารณะตีความ (บริบทบริบท) {System.out.println ("XML DOM Interpreter:" + context.getData ()); }} / *** มีข้อมูลบางอย่างนอก Interpreter* / บริบทคลาสสาธารณะ {ข้อมูลสตริงส่วนตัว; สตริงสาธารณะ getData () {ส่งคืนข้อมูล; } โมฆะสาธารณะ setData (ข้อมูลสตริง) {this.data = ข้อมูล; }} การทดสอบคลาสสาธารณะ {โมฆะคงที่สาธารณะหลัก (สตริง [] args) {บริบทบริบท = บริบทใหม่ (); context.setData ("ชิ้นส่วนของข้อมูล XML"); ใหม่ XMLSaxInterpreter (). ตีความ (บริบท); ใหม่ xmldominterpreter (). ตีความ (บริบท); -5. หมายเหตุเกี่ยวกับโหมดล่าม
พยายามอย่าใช้โหมดล่ามในโมดูลสำคัญมิฉะนั้นการบำรุงรักษาจะเป็นปัญหาใหญ่ ในโครงการคุณสามารถใช้ภาษาสคริปต์เช่น Shell, Jruby และ Groovy เพื่อแทนที่โหมดล่ามเพื่อสร้างข้อบกพร่องของภาษาที่รวบรวม Java เราใช้ JRuby สำหรับการประมวลผลการคำนวณในโครงการวิเคราะห์ของธนาคารหลีกเลี่ยงการดำเนินการสี่ตัวในโหมดล่ามและทำงานได้ดีในทุกด้านของประสิทธิภาพและประสิทธิภาพ