คำถามหลักคือ: คุณต้องการให้ไฟล์การกำหนดค่าของคุณเป็นภาษาทัวริงที่สมบูรณ์ (เช่น Python หรือไม่) หากคุณต้องการคุณอาจพิจารณาฝังภาษาสคริปต์ (ทัวริงสมบูรณ์) อื่น ๆเช่นGuileหรือLua (เพราะอาจถูกมองว่าเป็น "ง่ายกว่า" เพื่อใช้หรือฝังมากกว่า Python คืออ่านบทเกี่ยวกับการขยาย & การฝัง Python ) ฉันจะไม่พูดคุยเรื่องนี้เพิ่มเติม (เพราะคำตอบอื่น ๆ- โดย Amon - กล่าวถึงเรื่องนี้ในเชิงลึก) แต่โปรดสังเกตว่าการฝังภาษาสคริปต์ในแอปพลิเคชันของคุณเป็นตัวเลือกสถาปัตยกรรมที่สำคัญที่คุณควรพิจารณาก่อน; ฉันไม่แนะนำให้เลือกในภายหลัง!
ตัวอย่างที่รู้จักกันดีของโปรแกรมผ่าน "สคริปต์" ที่สามารถกำหนดค่าได้คือตัวแก้ไขGNU emacs (หรืออาจเป็นAutoCADในขอบเขตที่เป็นกรรมสิทธิ์); ดังนั้นโปรดทราบว่าหากคุณยอมรับการใช้สคริปต์ผู้ใช้บางคนอาจใช้ - และอาจใช้ในทางที่ผิดในมุมมองของคุณ - สิ่งอำนวยความสะดวกนั้นครอบคลุมและสร้างสคริปต์หลายพันบรรทัด ดังนั้นการเลือกภาษาสคริปต์ที่ดีพอจึงเป็นสิ่งสำคัญ
อย่างไรก็ตาม (อย่างน้อยในระบบ POSIX) คุณอาจพิจารณาความสะดวกในการเปิดใช้งานการกำหนดค่า "ไฟล์" ที่จะคำนวณแบบไดนามิกในเวลาเริ่มต้น (แน่นอนทำให้ภาระในการตั้งค่าสติไปยังผู้ดูแลระบบหรือผู้ใช้ของคุณจริงๆแล้วมันเป็นการกำหนดค่าข้อความที่มาจากไฟล์บางไฟล์หรือจากบางคำสั่ง) เพื่อที่คุณก็สามารถนำมาใช้ในการประชุม (และเอกสารมัน) ที่เส้นทางแฟ้มการกำหนดค่าเริ่มต้นด้วยเช่น!
หรือ|
เป็นจริงเปลือกคำสั่งที่คุณจะอ่านเป็นท่อ สิ่งนี้จะทำให้ผู้ใช้ของคุณมีตัวเลือกในการใช้ "preprocessor" หรือ "ภาษาสคริปต์" ที่ผู้ใช้คุ้นเคยที่สุด
(คุณต้องไว้วางใจผู้ใช้ของคุณเกี่ยวกับปัญหาด้านความปลอดภัยหากคุณยอมรับการกำหนดค่าที่คำนวณแบบไดนามิก)
ดังนั้นในรหัสการเริ่มต้นของคุณmain
จะ (ตัวอย่าง) ยอมรับ--config
ข้อโต้แย้ง confarg
และรับบางอย่างFILE*configf;
จากมัน ถ้าอาร์กิวเมนต์ที่เริ่มต้นด้วย!
(เช่นถ้า(confarg[0]=='!')
.... ) คุณจะใช้และปิดท่อที่มีconfigf = popen(confarg+1, "r");
pclose(configf);
มิฉะนั้นคุณจะใช้configf=fopen(confarg, "r");
และปิดไฟล์นั้นด้วยfclose(configf);
(อย่าลืมตรวจสอบข้อผิดพลาด) ดูท่อ (7) , popen (3) , fopen (3) สำหรับแอปพลิเคชันที่เขียนใน Python อ่านเกี่ยวกับos.popenฯลฯ ...
(เอกสารยังสำหรับผู้ใช้ที่ต้องการแปลกที่จะผ่านการตั้งค่าไฟล์ชื่อ!foo.config
ที่จะผ่าน./!foo.config
ข้ามpopen
เคล็ดลับด้านบน)
BTW กลอุบายดังกล่าวเป็นเพียงความสะดวกสบาย (เพื่อหลีกเลี่ยงการต้องการผู้ใช้ขั้นสูงเช่นรหัสเชลล์สคริปต์บางส่วนเพื่อสร้างไฟล์การกำหนดค่า) หากผู้ใช้ต้องการรายงานข้อผิดพลาดใด ๆ เขาควรส่งไฟล์การกำหนดค่าที่สร้างขึ้นให้คุณ...
โปรดสังเกตว่าคุณสามารถออกแบบแอปพลิเคชันของคุณด้วยความสามารถในการใช้และโหลดปลั๊กอินในเวลาเริ่มต้นเช่นด้วยdlopen (3) (และคุณต้องเชื่อใจผู้ใช้ของคุณเกี่ยวกับปลั๊กอินนั้น) นี่คือการตัดสินใจทางสถาปัตยกรรมที่สำคัญมาก (และคุณต้องกำหนดและให้APIและระเบียบที่มีความเสถียรเกี่ยวกับปลั๊กอินและแอปพลิเคชันของคุณ)
สำหรับแอปพลิเคชันที่เขียนด้วยภาษาสคริปต์เช่น Python คุณสามารถยอมรับอาร์กิวเมนต์ของโปรแกรมบางอย่างสำหรับevalหรือexecหรือ primitives ที่คล้ายกัน อีกครั้งปัญหาด้านความปลอดภัยแล้วความกังวลของ (ขั้นสูง) ของผู้ใช้
เกี่ยวกับรูปแบบข้อความสำหรับไฟล์กำหนดค่าของคุณ (ไม่ว่าจะสร้างขึ้นหรือไม่ก็ตาม) ฉันเชื่อว่าส่วนใหญ่คุณต้องจัดทำเอกสารให้ดี (และการเลือกรูปแบบเฉพาะบางอย่างนั้นไม่สำคัญ) อย่างไรก็ตามฉันแนะนำให้ผู้ใช้ของคุณวาง มีความคิดเห็น -skipped- อยู่ข้างใน) คุณสามารถใช้ JSON (โดยเฉพาะกับตัวแยกวิเคราะห์ JSON บางส่วนที่ยอมรับและข้ามความคิดเห็นด้วยปกติ//
จนถึง eol หรือ/*
... */
... ) หรือ YAML หรือ XML หรือ INI หรือของคุณเอง การแยกไฟล์การกำหนดค่านั้นง่ายมาก (และคุณจะพบกับไลบรารีจำนวนมากที่เกี่ยวข้องกับงานนั้น)