อาจ
ในบทความนี้ซึ่งเป็นภาพรวมโดยธรรมชาติ เราจะพยายามดูพื้นฐานบางส่วนของสถาปัตยกรรม Eclipse เพื่อเป็นแพลตฟอร์มสำหรับการสร้างเครื่องมือการพัฒนาแบบรวมและให้แนวคิดเบื้องต้นเกี่ยวกับส่วนประกอบ Eclipse ที่เป็นรากฐานของเทคโนโลยี แพลตฟอร์มสำหรับ "ตัวกำหนดค่าใหม่" 1C: Enterprise
รู้เบื้องต้นเกี่ยวกับสถาปัตยกรรม Eclipse
ขั้นแรกเรามาดูลักษณะทั่วไปบางประการของสถาปัตยกรรม Eclipse โดยใช้ตัวอย่างกันก่อน
ประการแรก ควรสังเกตว่า Eclipse มีลักษณะเฉพาะด้วยการแบ่งชั้นทางสถาปัตยกรรมที่ค่อนข้างชัดเจน โดยมีการแยกฟังก์ชันการทำงานที่ไม่ขึ้นอยู่กับภาษาออกจากฟังก์ชันการทำงานที่ออกแบบมาเพื่อรองรับภาษาการเขียนโปรแกรมเฉพาะ และการแยกส่วนประกอบ "หลัก" ที่ไม่ขึ้นกับ UI ออกจากส่วนประกอบที่เกี่ยวข้อง พร้อมส่วนต่อประสานผู้ใช้ที่รองรับ
ดังนั้น แพลตฟอร์ม Eclipse จึงกำหนดโครงสร้างพื้นฐานทั่วไปที่ไม่ขึ้นอยู่กับภาษา และเครื่องมือการพัฒนา Java จะเพิ่ม Java IDE ที่มีคุณลักษณะครบถ้วนลงใน Eclipse ทั้งแพลตฟอร์ม Eclipse และ JDT ประกอบด้วยองค์ประกอบหลายอย่าง ซึ่งแต่ละองค์ประกอบเป็นของ “คอร์” ที่ไม่ขึ้นกับ UI หรือเลเยอร์ UI (รูปที่ 1)
ข้าว. 1. แพลตฟอร์ม Eclipse และ JDT
เรามาแสดงรายการส่วนประกอบหลักของแพลตฟอร์ม Eclipse:
- Runtime — กำหนดโครงสร้างพื้นฐานของปลั๊กอิน Eclipse โดดเด่นด้วยสถาปัตยกรรมแบบโมดูลาร์ โดยพื้นฐานแล้ว Eclipse คือชุดของ "จุดส่วนขยาย" และ "ส่วนขยาย"
- พื้นที่ทำงาน — จัดการหนึ่งหรือหลายโครงการ โปรเจ็กต์ประกอบด้วยโฟลเดอร์และไฟล์ที่แมปกับระบบไฟล์โดยตรง
- ชุดเครื่องมือวิดเจ็ตมาตรฐาน (SWT) - จัดเตรียมองค์ประกอบส่วนต่อประสานผู้ใช้พื้นฐานที่รวมเข้ากับระบบปฏิบัติการ
- เจเฟซ — จัดเตรียมเฟรมเวิร์ก UI จำนวนหนึ่งที่สร้างขึ้นบน SWT
- ม้านั่งทำงานของช่างเครื่อง — กำหนดกระบวนทัศน์ Eclipse UI: เอดิเตอร์ มุมมอง มุมมอง
ต้องบอกว่าแพลตฟอร์ม Eclipse ยังมีส่วนประกอบที่มีประโยชน์อื่นๆ อีกมากมายสำหรับการสร้างเครื่องมือการพัฒนาแบบรวม รวมถึง Debug, เปรียบเทียบ, ค้นหา และทีม ควรกล่าวถึงเป็นพิเศษเกี่ยวกับ JFace Text ซึ่งเป็นพื้นฐานสำหรับการสร้าง "ตัวแก้ไขอัจฉริยะ" ของซอร์สโค้ด น่าเสียดายที่แม้แต่การตรวจสอบส่วนประกอบเหล่านี้อย่างคร่าว ๆ รวมถึงส่วนประกอบเลเยอร์ UI ก็ไม่สามารถทำได้ภายในขอบเขตของบทความนี้ ดังนั้นในส่วนที่เหลือของส่วนนี้ เราจะจำกัดตัวเองอยู่เพียงภาพรวมของส่วนประกอบ "หลัก" หลักของ แพลตฟอร์ม Eclipse และ JDT
รันไทม์หลัก
โครงสร้างพื้นฐานปลั๊กอิน Eclipse ขึ้นอยู่กับ
พื้นที่ทำงานหลัก
สภาพแวดล้อมการพัฒนาแบบรวมเกือบทั้งหมดที่สร้างขึ้นบนแพลตฟอร์ม Eclipse ทำงานร่วมกับพื้นที่ทำงาน Eclipse เป็นพื้นที่ทำงานที่มักจะมีซอร์สโค้ดของแอปพลิเคชันที่พัฒนาใน IDE พื้นที่ทำงานแมปกับระบบไฟล์โดยตรงและประกอบด้วยโปรเจ็กต์ซึ่งมีโฟลเดอร์และไฟล์ โปรเจ็กต์ โฟลเดอร์ และไฟล์เหล่านี้ถูกเรียก ทรัพยากร พื้นที่ทำงาน การใช้งานพื้นที่ทำงานใน Eclipse ทำหน้าที่เป็นแคชที่เกี่ยวข้องกับระบบไฟล์ ซึ่งทำให้สามารถเร่งความเร็วการข้ามผ่านแผนผังทรัพยากรได้อย่างมาก นอกจากนี้ พื้นที่ทำงานยังให้บริการเพิ่มเติมอีกมากมาย ได้แก่
คอมโพเนนต์ Core Resources (ปลั๊กอิน org.eclipse.core.resources) มีหน้าที่รับผิดชอบในการสนับสนุนเวิร์กสเปซและรีซอร์ส โดยเฉพาะอย่างยิ่ง ส่วนประกอบนี้ให้การเข้าถึงพื้นที่ทำงานในรูปแบบทางโปรแกรม โมเดลทรัพยากร. เพื่อให้ทำงานกับโมเดลนี้ได้อย่างมีประสิทธิภาพ ลูกค้าจำเป็นต้องมีวิธีง่ายๆ ในการนำเสนอลิงก์ไปยังแหล่งข้อมูล ในกรณีนี้ ขอแนะนำให้ซ่อนออบเจ็กต์ที่เก็บสถานะของทรัพยากรในโมเดลโดยตรงจากการเข้าถึงของไคลเอ็นต์ มิฉะนั้น ในกรณี เช่น การลบไฟล์ ไคลเอ็นต์สามารถเก็บอ็อบเจ็กต์ที่ไม่ได้อยู่ในโมเดลต่อไปได้ โดยจะเกิดปัญหาตามมา Eclipse แก้ไขปัญหานี้โดยใช้สิ่งที่เรียกว่า จัดการ ทรัพยากร. Handle ทำหน้าที่เป็นคีย์ (รู้เส้นทางไปยังทรัพยากรในพื้นที่ทำงานเท่านั้น) และควบคุมการเข้าถึงออบเจ็กต์โมเดลภายในอย่างสมบูรณ์ ซึ่งจะจัดเก็บข้อมูลเกี่ยวกับสถานะของทรัพยากรโดยตรง การออกแบบนี้เป็นรูปแบบของรูปแบบ
ข้าว. รูปที่ 2 แสดงให้เห็นถึงสำนวน Handle/Body ที่ใช้กับโมเดลทรัพยากร อินเทอร์เฟซ IResource แสดงถึงหมายเลขอ้างอิงของทรัพยากรและเป็น API ซึ่งแตกต่างจากคลาส Resource ซึ่งใช้อินเทอร์เฟซนี้ และคลาส ResourceInfo ซึ่งแสดงถึงเนื้อหา ซึ่งไม่ใช่ API เราเน้นย้ำว่าตัวจัดการรู้เฉพาะเส้นทางไปยังทรัพยากรที่สัมพันธ์กับรูทของพื้นที่ทำงาน และไม่มีลิงก์ไปยังข้อมูลทรัพยากร ออบเจ็กต์ข้อมูลทรัพยากรก่อให้เกิดสิ่งที่เรียกว่า "แผนผังองค์ประกอบ" โครงสร้างข้อมูลนี้เกิดขึ้นจริงในหน่วยความจำอย่างสมบูรณ์ หากต้องการค้นหาอินสแตนซ์ข้อมูลทรัพยากรที่สอดคล้องกับหมายเลขอ้างอิง แผนผังองค์ประกอบจะถูกสำรวจตามเส้นทางที่เก็บไว้ในหมายเลขอ้างอิงนั้น
ข้าว. 2. IResource และ ResourceInfo
ดังที่เราจะเห็นในภายหลัง การออกแบบพื้นฐานของโมเดลทรัพยากร (เราอาจเรียกว่าอิงตามแฮนเดิล) จะถูกนำมาใช้ใน Eclipse สำหรับโมเดลอื่นๆ เช่นกัน ในตอนนี้ เรามาแสดงรายการคุณสมบัติพิเศษบางประการของการออกแบบนี้:
- หมายเลขอ้างอิงเป็นวัตถุที่มีค่า วัตถุค่าเป็นวัตถุที่ไม่เปลี่ยนรูปซึ่งความเท่าเทียมกันไม่ได้ขึ้นอยู่กับตัวตน อ็อบเจ็กต์ดังกล่าวสามารถใช้เป็นคีย์ในคอนเทนเนอร์ที่แฮชได้อย่างปลอดภัย หมายเลขอ้างอิงหลายอินสแตนซ์สามารถอ้างอิงทรัพยากรเดียวกันได้ หากต้องการเปรียบเทียบ คุณต้องใช้วิธีเท่ากับ (Object)
- หมายเลขอ้างอิงกำหนดพฤติกรรมของทรัพยากร แต่ไม่มีข้อมูลเกี่ยวกับสถานะของทรัพยากร (ข้อมูลเดียวที่เก็บไว้คือ "คีย์" ซึ่งเป็นเส้นทางไปยังทรัพยากร)
- หมายเลขอ้างอิงอาจหมายถึงทรัพยากรที่ไม่มีอยู่ (ทั้งทรัพยากรที่ยังไม่ได้สร้างหรือทรัพยากรที่ถูกลบไปแล้ว) สามารถตรวจสอบการมีอยู่ของทรัพยากรได้โดยใช้เมธอด IResource.exists()
- การดำเนินการบางอย่างสามารถนำไปใช้ได้โดยอาศัยข้อมูลที่จัดเก็บไว้ในตัวจัดการเท่านั้น (เรียกว่าการดำเนินการเฉพาะตัวจัดการ) ตัวอย่าง ได้แก่ IResource.getParent(), getFullPath() ฯลฯ ไม่จำเป็นต้องมีทรัพยากรเพื่อให้การดำเนินการดังกล่าวสำเร็จ การดำเนินการที่จำเป็นต้องมีทรัพยากรเพื่อให้สำเร็จจะโยน CoreException หากไม่มีทรัพยากรอยู่
Eclipse จัดเตรียมกลไกที่มีประสิทธิภาพสำหรับการแจ้งเตือนการเปลี่ยนแปลงทรัพยากรพื้นที่ทำงาน (รูปที่ 3) รีซอร์สสามารถเปลี่ยนแปลงได้เป็นผลจากการดำเนินการที่ทำภายใน Eclipse IDE เอง หรือเป็นผลจากการซิงโครไนซ์กับระบบไฟล์ ในทั้งสองกรณี ลูกค้าที่สมัครรับการแจ้งเตือนจะได้รับข้อมูลโดยละเอียดเกี่ยวกับการเปลี่ยนแปลงในรูปแบบของ "เดลต้าทรัพยากร" เดลต้าอธิบายการเปลี่ยนแปลงระหว่างสองสถานะของทรีทรัพยากรพื้นที่ทำงาน (ย่อย) และตัวมันเองเป็นทรี ซึ่งแต่ละโหนดจะอธิบายการเปลี่ยนแปลงในทรัพยากรและมีรายการเดลต้าในระดับถัดไปที่อธิบายการเปลี่ยนแปลงในทรัพยากรย่อย
ข้าว. 3. IResourceChangeEvent และ IResourceDelta
กลไกการแจ้งเตือนตามเดลต้าทรัพยากรมีลักษณะดังต่อไปนี้:
- การเปลี่ยนแปลงครั้งเดียวและการเปลี่ยนแปลงหลายอย่างอธิบายโดยใช้โครงสร้างเดียวกัน เนื่องจากเดลต้าถูกสร้างขึ้นโดยใช้หลักการขององค์ประกอบแบบเรียกซ้ำ ลูกค้าสมาชิกสามารถประมวลผลการแจ้งเตือนการเปลี่ยนแปลงทรัพยากรโดยใช้การสืบทอดแบบเรียกซ้ำผ่านแผนผังเดลตา
- เดลต้ามีข้อมูลที่ครบถ้วนเกี่ยวกับการเปลี่ยนแปลงทรัพยากร รวมถึงการเคลื่อนไหวและ/หรือการเปลี่ยนแปลงใน "เครื่องหมาย" ที่เกี่ยวข้อง (เช่น ข้อผิดพลาดในการคอมไพล์จะแสดงเป็นเครื่องหมาย)
- เนื่องจากการอ้างอิงทรัพยากรทำผ่านหมายเลขอ้างอิง เดลต้าจึงสามารถอ้างอิงทรัพยากรระยะไกลได้ตามธรรมชาติ
ดังที่เราจะได้เห็นในเร็วๆ นี้ ส่วนประกอบหลักของการออกแบบกลไกการแจ้งเตือนการเปลี่ยนแปลงแบบจำลองทรัพยากรยังเกี่ยวข้องกับแบบจำลองตามหมายเลขอ้างอิงอื่นๆ อีกด้วย
เจดีที คอร์
โมเดลรีซอร์สเวิร์กสเปซ Eclipse เป็นโมเดลที่ไม่เชื่อเรื่องภาษาพื้นฐาน คอมโพเนนต์ JDT Core (ปลั๊กอิน org.eclipse.jdt.core) จัดเตรียม API สำหรับการนำทางและวิเคราะห์โครงสร้างเวิร์กสเปซจากเปอร์สเปคทีฟ Java ซึ่งเรียกว่า "โมเดล Java" (โมเดลจาวา). API นี้ถูกกำหนดในแง่ขององค์ประกอบ Java ซึ่งตรงข้ามกับ API โมเดลทรัพยากรพื้นฐาน ซึ่งถูกกำหนดในแง่ของโฟลเดอร์และไฟล์ อินเทอร์เฟซหลักของแผนผังองค์ประกอบ Java จะแสดงในรูป 4.
ข้าว. 4. องค์ประกอบโมเดล Java
โมเดล Java ใช้สำนวนที่จับ/เนื้อหาเดียวกันกับโมเดลทรัพยากร (รูปที่ 5) IJavaElement เป็นตัวจัดการ และ JavaElementInfo มีบทบาทเป็นเนื้อหา อินเทอร์เฟซ IJavaElement กำหนดโปรโตคอลทั่วไปสำหรับองค์ประกอบ Java ทั้งหมด วิธีการบางอย่างเป็นแบบจัดการเท่านั้น: getElementName(), getParent() ฯลฯ วัตถุ JavaElementInfo เก็บสถานะขององค์ประกอบที่เกี่ยวข้อง: โครงสร้างและคุณลักษณะ
ข้าว. 5. IJavaElement และ JavaElementInfo
โมเดล Java มีความแตกต่างบางประการในการใช้งานการออกแบบตัวจัดการ/ตัวเครื่องพื้นฐานเมื่อเปรียบเทียบกับโมเดลทรัพยากร ตามที่ระบุไว้ข้างต้น ในโมเดลทรัพยากร แผนผังองค์ประกอบซึ่งมีโหนดเป็นออบเจ็กต์ข้อมูลทรัพยากร จะถูกเก็บไว้ในหน่วยความจำทั้งหมด แต่โมเดล Java สามารถมีองค์ประกอบจำนวนมากกว่าแผนผังทรัพยากรได้อย่างมาก เนื่องจากโมเดลยังแสดงถึงโครงสร้างภายในของไฟล์ .java และ .class ได้แก่ ประเภท ฟิลด์ และเมธอด
เพื่อหลีกเลี่ยงไม่ให้โครงสร้างองค์ประกอบทั้งหมดในหน่วยความจำเป็นรูปเป็นร่างโดยสมบูรณ์ การใช้งานโมเดล Java จะใช้แคช LRU ขนาดจำกัดของข้อมูลองค์ประกอบ โดยที่คีย์จะจัดการ IJavaElement ออบเจ็กต์ข้อมูลองค์ประกอบจะถูกสร้างขึ้นตามความต้องการเมื่อมีการสำรวจแผนผังองค์ประกอบ ในกรณีนี้ รายการที่ใช้บ่อยที่สุดจะถูกไล่ออกจากแคช และการใช้หน่วยความจำของโมเดลยังคงจำกัดอยู่ที่ขนาดแคชที่ระบุ นี่เป็นข้อดีอีกประการหนึ่งของการออกแบบที่ใช้มือจับ ซึ่งจะซ่อนรายละเอียดการใช้งานดังกล่าวจากโค้ดไคลเอ็นต์โดยสิ้นเชิง
กลไกในการแจ้งการเปลี่ยนแปลงองค์ประกอบ Java โดยทั่วไปจะคล้ายกับกลไกในการติดตามการเปลี่ยนแปลงทรัพยากรพื้นที่ทำงานที่กล่าวถึงข้างต้น ลูกค้าที่ต้องการติดตามการเปลี่ยนแปลงในโมเดล Java สมัครรับการแจ้งเตือน ซึ่งแสดงเป็นวัตถุ ElementChangedEvent ที่มี IJavaElementDelta (รูปที่ 6)
ข้าว. 6. ElementChangedEvent และ IJavaElementDelta
โมเดล Java ไม่มีข้อมูลเกี่ยวกับเนื้อความของวิธีการหรือการจำแนกชื่อ ดังนั้นสำหรับการวิเคราะห์โดยละเอียดของโค้ดที่เขียนด้วย Java นั้น JDT Core จึงมีโมเดลเพิ่มเติม (แบบไม่ใช้แฮนเดิล):
เนื่องจากแผนผังไวยากรณ์สามารถใช้หน่วยความจำจำนวนมากได้ JDT จึงแคชเพียง AST เดียวสำหรับเอดิเตอร์ที่แอ็คทีฟ แตกต่างจากโมเดล Java โดยทั่วไป AST จะถูกมองว่าเป็นโมเดล "ระดับกลาง" "ชั่วคราว" ซึ่งสมาชิกไม่ควรถูกอ้างอิงโดยไคลเอนต์นอกบริบทของการดำเนินการที่นำไปสู่การสร้าง AST
โมเดลทั้งสามที่ระบุไว้ (โมเดล Java, AST, การเชื่อมโยง) รวมกันเป็นพื้นฐานสำหรับการสร้าง “เครื่องมือพัฒนาอัจฉริยะ” ใน JDT รวมถึงโปรแกรมแก้ไข Java ที่ทรงพลังพร้อม “ตัวช่วย” ต่างๆ การดำเนินการต่างๆ สำหรับการประมวลผลซอร์สโค้ด (รวมถึงการจัดระเบียบรายการนำเข้า ชื่อและการจัดรูปแบบตามสไตล์ที่กำหนดเอง) เครื่องมือค้นหาและการปรับโครงสร้างใหม่ ในกรณีนี้ โมเดล Java มีบทบาทพิเศษ เนื่องจากโมเดล Java ถูกใช้เป็นพื้นฐานสำหรับการแสดงภาพของโครงสร้างของแอปพลิเคชันที่กำลังพัฒนา (เช่น ใน Package Explorer, Outline, Search, Call Hierarchy และ ประเภทลำดับชั้น)
ส่วนประกอบ Eclipse ที่ใช้ใน 1C: เครื่องมือพัฒนาองค์กร
ในรูป รูปที่ 7 แสดงส่วนประกอบ Eclipse ที่สร้างรากฐานของแพลตฟอร์มเทคโนโลยีสำหรับ 1C: เครื่องมือพัฒนาองค์กร
ข้าว. 7. Eclipse เป็นแพลตฟอร์มสำหรับ 1C: เครื่องมือพัฒนาองค์กร
แพลตฟอร์มคราส ให้โครงสร้างพื้นฐาน เราได้ดูบางแง่มุมของโครงสร้างพื้นฐานนี้ในส่วนที่แล้ว
เช่นเดียวกับเครื่องมืออเนกประสงค์ทั่วไป EMF เหมาะสำหรับการแก้ปัญหาการสร้างแบบจำลองที่หลากหลาย แต่คลาสของโมเดลบางคลาส (เช่น โมเดลแบบมือจับที่กล่าวถึงข้างต้น) อาจต้องใช้เครื่องมือการสร้างแบบจำลองพิเศษมากกว่า การพูดถึง EMF นั้นเป็นงานที่ไร้คุณค่า โดยเฉพาะอย่างยิ่งภายในขอบเขตที่จำกัดของบทความเดียว เนื่องจากนี่เป็นหัวข้อของหนังสือเล่มอื่นและเป็นเล่มที่ค่อนข้างหนา ให้เราทราบเพียงว่าระบบคุณภาพสูงของลักษณะทั่วไปที่เป็นรากฐานของ EMF อนุญาตให้เกิดโครงการทั้งหมดที่เกี่ยวข้องกับการสร้างแบบจำลอง ซึ่งรวมอยู่ในโครงการระดับบนสุด
1C:Enterprise Development Tools ใช้ทั้ง EMF เองและโปรเจ็กต์ Eclipse Modeling อื่นๆ จำนวนมาก โดยเฉพาะอย่างยิ่ง Xtext เป็นหนึ่งในรากฐานของเครื่องมือการพัฒนาสำหรับภาษา 1C:Enterprise เช่นภาษาโปรแกรมและภาษาคิวรีในตัว พื้นฐานอีกประการหนึ่งสำหรับเครื่องมือการพัฒนาเหล่านี้คือโปรเจ็กต์ Eclipse Handly ซึ่งเราจะหารือในรายละเอียดเพิ่มเติม (ของส่วนประกอบ Eclipse ที่แสดงอยู่ แต่ยังคงเป็นที่รู้จักน้อยที่สุด)
หลักการทางสถาปัตยกรรมพื้นฐานของโมเดลแบบแฮนเดิล เช่น สำนวนแฮนเดิล/เนื้อหา ได้ถูกกล่าวถึงข้างต้นโดยใช้โมเดลทรัพยากรและโมเดล Java เป็นตัวอย่าง นอกจากนี้ยังตั้งข้อสังเกตอีกว่าทั้งโมเดลทรัพยากรและโมเดล Java เป็นรากฐานที่สำคัญสำหรับเครื่องมือการพัฒนา Eclipse Java (JDT) และเนื่องจากโปรเจ็กต์ *DT Eclipse เกือบทั้งหมดมีสถาปัตยกรรมที่คล้ายคลึงกับ JDT จึงไม่ใช่เรื่องเกินจริงที่จะกล่าวว่าโมเดลแบบแฮนเดิลรองรับหลาย ๆ ตัว หากไม่ใช่ IDE ทั้งหมดที่สร้างขึ้นบนแพลตฟอร์ม Eclipse ตัวอย่างเช่น Eclipse C/C++ Development Tooling (CDT) มีโมเดล C/C++ แบบอิงแฮนเดิลที่มีบทบาทในสถาปัตยกรรม CDT เหมือนกับที่โมเดล Java ทำใน JDT
ก่อน Handly Eclipse ไม่มีไลบรารีเฉพาะสำหรับการสร้างแบบจำลองภาษาที่ใช้แฮนเดิล โมเดลที่มีอยู่ในปัจจุบันถูกสร้างขึ้นโดยการปรับโค้ดโมเดล Java โดยตรง (หรือที่เรียกว่าการคัดลอก/วาง) ในกรณีที่อนุญาต ใบอนุญาตสาธารณะ Eclipse (EPL) (แน่นอนว่านี่ไม่ใช่ปัญหาทางกฎหมายสำหรับโปรเจ็กต์ Eclipse เอง แต่ไม่ใช่สำหรับผลิตภัณฑ์แบบปิด) นอกเหนือจากความบังเอิญโดยธรรมชาติแล้ว เทคนิคนี้ยังแนะนำปัญหาที่ทราบกันดีอีกด้วย: การทำสำเนาโค้ดที่เกิดขึ้นเมื่อปรับให้เข้ากับข้อผิดพลาด ฯลฯ ที่แย่กว่านั้นคือผลลัพธ์ที่ออกมายังคงเป็น "สิ่งต่าง ๆ ในตัวเอง" และไม่ใช้ประโยชน์จากศักยภาพในการรวมเป็นหนึ่งเดียว แต่การแยกแนวคิดและโปรโตคอลทั่วไปสำหรับโมเดลภาษาที่ใช้แฮนเดิลอาจนำไปสู่การสร้างส่วนประกอบที่นำมาใช้ซ้ำได้สำหรับการทำงานกับโมเดลเหล่านั้น คล้ายกับสิ่งที่เกิดขึ้นในกรณีของ EMF
ไม่ใช่ว่า Eclipse ไม่เข้าใจปัญหาเหล่านี้ ย้อนกลับไปในปี 2005
ในแง่หนึ่ง โปรเจ็กต์ Handly ได้รับการออกแบบมาเพื่อแก้ปัญหาโดยประมาณเหมือนกับ EMF แต่สำหรับโมเดลที่ใช้แฮนเดิลและโมเดลภาษาหลัก (เช่น การแสดงองค์ประกอบของโครงสร้างของภาษาการเขียนโปรแกรมบางภาษา) เป้าหมายหลักที่กำหนดเมื่อออกแบบ Handly มีดังต่อไปนี้:
- การระบุนามธรรมหลักของสาขาวิชา
- ลดความพยายามและปรับปรุงคุณภาพของการใช้งานโมเดลภาษาที่ใช้แฮนเดิลผ่านการใช้โค้ดซ้ำ
- จัดเตรียม API ระดับเมตาแบบรวมให้กับโมเดลผลลัพธ์ ทำให้สามารถสร้างส่วนประกอบ IDE ทั่วไปที่ทำงานร่วมกับโมเดลที่ใช้การจัดการภาษาได้
- ความยืดหยุ่นและความสามารถในการขยายขนาด
- บูรณาการกับ Xtext (ในเลเยอร์แยกต่างหาก)
เพื่อเน้นแนวคิดและโปรโตคอลทั่วไป จึงมีการวิเคราะห์การใช้งานแบบจำลองที่ใช้การจัดการภาษาที่มีอยู่ อินเทอร์เฟซหลักและการใช้งานพื้นฐานที่ Handly มอบให้จะแสดงในรูป 8.
ข้าว. 8. อินเทอร์เฟซทั่วไปและการใช้งานพื้นฐานขององค์ประกอบ Handly
อินเทอร์เฟซ IElement แสดงถึงตัวจัดการขององค์ประกอบและใช้ร่วมกับองค์ประกอบของโมเดลที่ใช้ Handly ทั้งหมด องค์ประกอบคลาสนามธรรมใช้กลไกการจัดการ/ร่างกายทั่วไป (รูปที่ 9)
ข้าว. 9. IElement และการใช้งานการจัดการ/เนื้อหาทั่วไป
นอกจากนี้ Handly ยังมีกลไกทั่วไปสำหรับการแจ้งเตือนเกี่ยวกับการเปลี่ยนแปลงองค์ประกอบของโมเดล (รูปที่ 10) อย่างที่คุณเห็น กลไกการแจ้งเตือนนี้มีความคล้ายคลึงในวงกว้างกับกลไกการแจ้งเตือนที่ใช้งานในโมเดลทรัพยากรและโมเดล Java และใช้ IElementDelta เพื่อนำเสนอข้อมูลการเปลี่ยนแปลงองค์ประกอบแบบรวมศูนย์
ข้าว. 10. อินเทอร์เฟซทั่วไปและการใช้งานพื้นฐานของกลไกการแจ้งเตือน Handly
ส่วน Handly ที่กล่าวถึงข้างต้น (รูปที่ 9 และ 10) สามารถใช้แทนโมเดลที่ใช้มือจับได้เกือบทุกรุ่น สำหรับการสร้าง ภาษาศาสตร์ โครงการนำเสนอฟังก์ชันการทำงานเพิ่มเติม - โดยเฉพาะอินเทอร์เฟซทั่วไปและการใช้งานพื้นฐานสำหรับองค์ประกอบของโครงสร้างข้อความต้นฉบับที่เรียกว่า องค์ประกอบแหล่งที่มา (รูปที่ 8) อินเทอร์เฟซ ISourceFile แสดงถึงไฟล์ต้นฉบับ และ ISourceConstruct แสดงถึงองค์ประกอบภายในไฟล์ต้นฉบับ คลาสนามธรรม SourceFile และ SourceConstruct ใช้กลไกทั่วไปเพื่อรองรับการทำงานกับไฟล์ต้นฉบับและองค์ประกอบ ตัวอย่างเช่น การทำงานกับบัฟเฟอร์ข้อความ การเชื่อมโยงกับพิกัดขององค์ประกอบในข้อความต้นฉบับ การกระทบยอดโมเดลกับเนื้อหาปัจจุบันของบัฟเฟอร์การคัดลอกที่ใช้งานได้ ฯลฯ การใช้กลไกเหล่านี้มักจะค่อนข้างท้าทาย และ Handly สามารถลดความพยายามในการพัฒนาโมเดลภาษาที่ใช้แฮนเดิลได้อย่างมาก โดยมอบการใช้งานพื้นฐานคุณภาพสูง
นอกเหนือจากกลไกหลักที่กล่าวข้างต้น Handly ยังมีโครงสร้างพื้นฐานสำหรับบัฟเฟอร์ข้อความและสแน็ปช็อต รองรับการทำงานร่วมกับโปรแกรมแก้ไขซอร์สโค้ด (รวมถึงการรวมเข้ากับโปรแกรมแก้ไข Xtext ได้ทันที) รวมถึงองค์ประกอบ UI ทั่วไปบางอย่างที่ ทำงานร่วมกับโปรแกรมแก้ไขซอร์สโค้ด โมเดลที่ใช้งานง่าย เช่น กรอบงานเค้าร่าง เพื่อแสดงให้เห็นถึงความสามารถ โปรเจ็กต์จึงมีตัวอย่างหลายตัวอย่าง รวมถึงการใช้งานโมเดล Java ใน Handly (เมื่อเปรียบเทียบกับการใช้งานโมเดล Java อย่างสมบูรณ์ใน JDT โมเดลนี้ตั้งใจทำให้ง่ายขึ้นเพื่อความชัดเจนที่มากขึ้น)
ตามที่ระบุไว้ก่อนหน้านี้ จุดสนใจหลักในระหว่างการออกแบบเบื้องต้นของ Handly และการพัฒนาที่ตามมาคือและยังคงมุ่งเน้นไปที่ความสามารถในการขยายขนาดและความยืดหยุ่น
โดยหลักการแล้ว รุ่นที่ใช้มือจับจะปรับขนาดได้ค่อนข้างดี "ตามการออกแบบ" ตัวอย่างเช่น สำนวนที่จับ/เนื้อหาช่วยให้คุณสามารถจำกัดจำนวนหน่วยความจำที่โมเดลใช้ แต่ก็มีความแตกต่างเช่นกัน ดังนั้น เมื่อทดสอบความสามารถในการปรับขนาดได้ Handly จึงพบปัญหาในการใช้กลไกการแจ้งเตือน - เมื่อองค์ประกอบจำนวนมากมีการเปลี่ยนแปลง การสร้างเดลต้าใช้เวลานานเกินไป ปรากฎว่ามีปัญหาเดียวกันนี้ในโมเดล JDT Java ซึ่งครั้งหนึ่งเคยมีการปรับเปลี่ยนโค้ดที่เกี่ยวข้อง เราได้แก้ไขข้อผิดพลาดใน Handly และเตรียมแพตช์ที่คล้ายกันสำหรับ JDT ซึ่งได้รับการตอบรับอย่างซาบซึ้งใจ นี่เป็นเพียงตัวอย่างหนึ่งที่การนำ Handly ไปใช้ในการใช้งานโมเดลที่มีอยู่อาจมีประโยชน์ เนื่องจากในกรณีนี้ข้อบกพร่องดังกล่าวสามารถแก้ไขได้ในที่เดียว
เพื่อให้การนำ Handly ไปใช้ในการใช้งานโมเดลที่มีอยู่นั้นมีความเป็นไปได้ทางเทคนิค ไลบรารีจะต้องมีความยืดหยุ่นอย่างมาก ปัญหาหลักคือการรักษาความเข้ากันได้แบบย้อนหลังในโมเดล API ปัญหานี้ได้รับการแก้ไขแล้วใน
ความยืดหยุ่นยังมีด้านอื่นด้วย ตัวอย่างเช่น Handly แทบไม่มีข้อจำกัดใดๆ เกี่ยวกับโครงสร้างของโมเดล และสามารถนำไปใช้ในการสร้างแบบจำลองทั้งภาษาสำหรับวัตถุประสงค์ทั่วไปและภาษาเฉพาะโดเมน เมื่อสร้างโครงสร้างของไฟล์ต้นฉบับ Handly ไม่ได้กำหนดรูปแบบเฉพาะของการแสดง AST ใดๆ และโดยหลักการแล้ว ไม่จำเป็นต้องใช้ AST ด้วยซ้ำ ดังนั้นจึงรับประกันความเข้ากันได้กับกลไกการแยกวิเคราะห์เกือบทุกชนิด สุดท้ายนี้ Handly รองรับการผสานรวมอย่างสมบูรณ์กับพื้นที่ทำงาน Eclipse แต่ยังสามารถทำงานกับระบบไฟล์ได้โดยตรงด้วยการผสานรวมกับ
เวอร์ชันปัจจุบัน
ตามที่ระบุไว้ข้างต้น หนึ่งในผลิตภัณฑ์เหล่านี้คือ 1C:เครื่องมือพัฒนาองค์กร โดยที่ Handly ถูกใช้ตั้งแต่เริ่มต้นเพื่อสร้างแบบจำลององค์ประกอบของโครงสร้างระดับสูงของภาษา 1C:Enterprise เช่นภาษาโปรแกรมในตัวและภาษาคิวรี . สินค้าอีกชิ้นหนึ่งไม่ค่อยเป็นที่รู้จักของสาธารณชนทั่วไป นี้
เราหวังว่าหลังจากการเปิดตัวเวอร์ชัน 1.0 พร้อมการรับประกันความเสถียรของ API และโครงการออกจากสถานะบ่มเพาะ Handly จะมีผู้ใช้รายใหม่ ในระหว่างนี้ โปรเจ็กต์ยังคงทดสอบและปรับปรุง API ต่อไป โดยออกรุ่น "หลัก" สองรุ่นต่อปี ในเดือนมิถุนายน (วันเดียวกับการเปิดตัว Eclipse พร้อมกัน) และเดือนธันวาคม โดยมีกำหนดการที่คาดการณ์ได้ซึ่งผู้ใช้งานสามารถไว้วางใจได้ นอกจากนี้เรายังสามารถเพิ่มเติมได้ว่า "อัตราข้อผิดพลาด" ของโครงการยังคงอยู่ที่ระดับต่ำอย่างต่อเนื่อง และ Handly ทำงานได้อย่างน่าเชื่อถือในผลิตภัณฑ์ของผู้ใช้งานกลุ่มแรกตั้งแต่เวอร์ชันแรกสุด หากต้องการสำรวจ Eclipse Handly เพิ่มเติม คุณสามารถใช้
ที่มา: will.com