Nomnoml: ไดอะแกรม UML ที่วาดด้วยไวยากรณ์แบบข้อความ
(nomnoml.com)- เครื่องมือสำหรับเขียนไดอะแกรม UML ราวกับเขียนโค้ด โดยเมื่อแก้ไข ไวยากรณ์แบบข้อความ ทางด้านซ้าย ไดอะแกรมที่เรนเดอร์แล้วก็จะเปลี่ยนตามไปด้วย
- รองรับ องค์ประกอบของไดอะแกรม และการแสดงเส้นความสัมพันธ์หลายแบบ เช่น class, component, flowchart, use case, database และ table
- เนื้อหาที่แก้ไขจะถูกบันทึกไว้ใน localStorage ของเบราว์เซอร์ และอาจยังคงอยู่เมื่อกลับมาเยี่ยมชมครั้งถัดไป แต่ไม่ได้รับประกันว่าจะถูกเก็บไว้เสมอ
- แคนวาสสามารถ เลื่อนและซูมเข้า/ออก ได้ด้วยการลากและสกรอลล์ในพื้นที่ 1/3 ด้านขวา และตัวแก้ไขรองรับคีย์แมปบางส่วนของ Sublime Text
- สามารถปรับฟอนต์ ทิศทาง ระยะห่าง สี รูปแบบเส้น และ สไตล์ classifier แบบกำหนดเอง ได้ด้วย directive
#และ directive สไตล์.
ไดอะแกรมที่ประกอบด้วยไวยากรณ์แบบข้อความ
- Nomnoml เป็นเครื่องมือสำหรับเขียนและเรนเดอร์ไดอะแกรมด้วย ไวยากรณ์แบบข้อความ
-
การเขียนเส้นความสัมพันธ์
- สามารถใช้ association, dependency, generalization, implementation, composition, aggregation, ball and socket, note, hidden เป็นต้น
- ตัวอย่าง:
[Car]->[Engine] - ตัวอย่าง:
[Car] +-> 0..* [RustPatch] - ตัวอย่าง:
[Car]o->[Manufacturer] - ตัวอย่าง:
[Car]<:-[Pickup]
-
classifier ที่รองรับ
- ไดอะแกรมคลาสรองรับ
abstract,instance,reference,package,frameนอกเหนือจากคลาสพื้นฐาน - ในไดอะแกรม component สามารถใช้รูปแบบ
socket,lollipopได้ - องค์ประกอบของ flowchart ได้แก่
start,end,state,choice,sync,input,sender,receiver,transceiver - ไดอะแกรม use case รองรับ
actor,usecase - องค์ประกอบอื่น ๆ ที่ใช้ได้คือ
note,label,hidden,database,pipe,table- ตัวอย่างตารางอยู่ในรูปแบบ
[<table>Fruits| Apples | 17 || Oranges | 4711]
- ตัวอย่างตารางอยู่ในรูปแบบ
- ไดอะแกรมคลาสรองรับ
การแก้ไข, directive และสไตล์
//ที่ต้นบรรทัดจะถูกประมวลผลเป็น คอมเมนต์//ที่อยู่กลางบรรทัด เช่น[not //commented]จะไม่ถือเป็นคอมเมนต์
- หากใช้พร็อพเพอร์ตี
idก็สามารถทำให้โหนดสองตัวที่มีชื่อแสดงผลเหมือนกันเป็น คนละโหนด ได้- ตัวอย่าง:
[<actor id=a>User],[<actor id=b>User],[a] -- [b]
- ตัวอย่าง:
-
ปรับ layout และการเรนเดอร์ด้วย directive
##import: filename#direction: down | right#edges: hard | rounded#background: transparent#font,#fontSize,#spacing,#padding,#stroke,#fill,#zoom#ranker: network-simplex | tight-tree | longest-path
-
กำหนดสไตล์ classifier ด้วย directive
.- ตัวอย่าง:
#.box: fill=#8f8 dashed - ตัวอย่าง:
#.blob: visual=ellipse title=bold - สามารถใช้คีย์/ค่าอย่าง
fill,stroke,align,direction,visualได้ - สามารถกำหนดสไตล์ข้อความของหัวเรื่องและเนื้อหาได้ เช่น
title=left,italic,bold,body=center,italic,bold - ตัวอย่างการใช้งานครอบคลุมการเปลี่ยนฟอนต์, layout แบบกระชับ, การสร้างตาราง, สไตล์กำหนดเอง และการแยกหลายไฟล์
- การแยกหลายไฟล์ใช้รูปแบบ
#import: blobby_styles - การเปลี่ยนแปลงในหน้าจอแก้ไขจะถูกบันทึกไว้ใน localStorage ของเบราว์เซอร์ และแคนวาสสามารถเลื่อนกับซูมเข้า/ออกได้ด้วยการลากและสกรอลล์ในพื้นที่ 1/3 ด้านขวา
- ตัวแก้ไขรองรับคีย์แมปบางส่วนของ Sublime Text และ Nomnoml โฮสต์อยู่บน GitHub
- ตัวอย่าง:
1 ความคิดเห็น
ความคิดเห็นจาก Hacker News
ลิงก์ GitHub: https://github.com/skanaar/nomnoml
ตอนแรกค่อนข้างงง และเพิ่งเข้าใจหลังจากหา ปุ่ม about เจอ
บางทีอาจโชคดีที่ใช้ชีวิตมาโดยไม่สามารถมอง UML แล้วเข้าใจได้ทันที ตอนแรกนึกว่ากำลังอธิบายไวยากรณ์อะไรสักอย่างที่เป็นภาษาพูดแบบโจรสลัดปลอม ๆ
ผมคิดว่าวิธีแบบนี้ดีกว่ามาก เพราะยอมรับความจริงว่าไม่มีใครมานั่งจำลูกศร 10 แบบเพื่ออ่านไดอะแกรม UML เป็นครั้งคราว: https://buck2.build/docs/concepts/concept_map/
แต่เครื่องมือจำนวนมากที่ใช้คำว่า “UML” ก็เป็นแบบนั้น และในทางปฏิบัติก็มักต้องการอะไรที่แม่นยำน้อยกว่าและเยิ่นเย้อน้อยกว่า UML เชิงทฤษฎี
เมื่อก่อนเคยมีไซต์โอเพนซอร์สที่เปรียบเทียบเครื่องมือแปลง “ข้อความเป็นไดอะแกรม”: https://text-to-diagram.com/
nomnoml ไม่ได้อยู่ในรายการ
[1]: https://d2lang.com/
ชอบ Nomnoml ช่วงหลังใช้มันในการแสดงโครงสร้างแท็กแบบลำดับชั้นในโปรเจกต์ การจัดการความรู้ส่วนบุคคล (PKM) บนเบราว์เซอร์ที่กำลังทำอยู่
เลย์เอาต์ออกมาค่อนข้างเรียบร้อย ตัวอย่าง: https://imgbox.com/9A1mDyNv
ฝั่งมือถือดูเหมือนต้องปรับปรุง เปิดบนโทรศัพท์แล้ว ไดอะแกรมถูกวาดทับบนเอดิเตอร์ จนใช้เอดิเตอร์ไม่ได้
ไลบรารี JavaScript ที่อยู่ข้างใต้สามารถเรนเดอร์โดยตรงไปยัง HTML canvas หรือ SVG จากโปรแกรม Node.js ได้ และถ้าต้องการก็รันจาก command line ได้ด้วย
เมื่อก่อนเคยสร้างเครื่องมือหลายอย่างด้วย nomnoml รวมถึงกราฟ control flow และกราฟ dependency ของ โค้ดแอสเซมบลี GPU ด้วย
ชอบมากจริง ๆ แต่เสียดายที่ไม่มีวิธีบังคับอย่างเสถียรให้องค์ประกอบบางอย่างถูกจัดวางไว้ใกล้กัน ในไดอะแกรมขนาดใหญ่มาก ๆ บางครั้งมันเลือกได้ไม่ดีจนดูรก
ถึงเอกสารจะไม่สมบูรณ์นัก แต่โค้ดก็แก้ค่อนข้างง่าย เลยแฮ็กให้แสดง tooltip เมื่อเอาเมาส์ไปวาง และให้คลิกกล่องบางกล่องแล้วลิงก์ไปยังไดอะแกรมอื่นได้ ขอบคุณที่เครื่องมือดี ๆ แบบนี้เป็นโอเพนซอร์ส
การจะได้เลย์เอาต์ที่ดีพึ่งพา ลำดับการนิยาม มากเกินไป ในไดอะแกรมใหญ่ ๆ ผู้ใช้อาจแก้ยาก แต่กับไดอะแกรมเล็ก ๆ ก็ดูโอเค
เช่น ถ้าเขียนตัวอย่างโจรสลัดเดิมด้วยลำดับอื่น แม้จะ valid แต่ได้เลย์เอาต์ที่ดูแย่
ผมเคยลองใช้ผลิตภัณฑ์ ไดอะแกรมที่อิงโค้ด หลายตัว เพราะฝันถึงโลกที่เอกสารเทคนิคซึ่งรวมถึงไดอะแกรมกลายเป็นส่วนหนึ่งของซอร์สโค้ดโปรเจกต์ แต่การได้เลย์เอาต์ที่ยอมรับได้ โดยเฉพาะสำหรับเผยแพร่ภายนอก แม้แต่ใช้ภายในก็ยังยาก
ความหงุดหงิดนั้นมักลงเอยด้วยผลลัพธ์แย่ ๆ สองอย่าง คือไดอะแกรมอ่านไม่ออก หรือไม่ถูกดูแลต่อ
พูดตรง ๆ ไอเดียที่ว่าเอกสารจะถูก code review ตอนเช็กอินก็แทบจะเป็นตำนาน diff ของเอกสารแบบนี้เข้าใจยากมาก และแทบเป็นไปไม่ได้ที่จะตรวจอย่างมีความหมายว่าเอกสารถูกต้องหรือไม่โดยไม่เรนเดอร์แล้วดูผลลัพธ์
เป็นปัญหาประเภทที่อยากให้แก้ได้จริง ๆ และสักวันหนึ่งอาจกลายเป็นปัญหาที่ถูกแก้แล้วก็ได้
ถ้าเทียบตาราง Pirate เดิมกับตาราง Pirate ของคอมเมนต์แม่ จะเห็นว่าบนล่างกลับด้านกัน แม้จะนิยาม beard กับ parrot ก่อนตามลำดับที่อยากให้แสดง ก็ยังออกมากลับด้านอยู่ดี
ดูดี และดูดีกว่า PlantUML class diagram มาก
[0]: https://plantuml.com/class-diagram
นึกถึง graphviz