วิธีที่ดีที่สุดในการบันทึกการตั้งค่าแอปพลิเคชัน


17

ใน Windows วิธีการเริ่มต้นคือรีจิสทรี สิ่งนี้ช่วยให้คุณสามารถแยกความแตกต่างของการตั้งค่าทั้งระบบและต่อผู้ใช้

ใน Unix คุณควรใช้ไฟล์ข้อความในโฟลเดอร์ / etc สำหรับการตั้งค่าทั้งระบบ (การประชุมแบบต่อผู้ใช้คืออะไร)

โปรแกรมใหม่จำนวนมาก (และโดยเฉพาะอย่างยิ่งที่ออกแบบมาสำหรับพกพา) ใช้ไฟล์ XML

  • อะไรคือวิธีที่ดีที่สุด (และตำแหน่ง) ในการจัดเก็บการตั้งค่าที่ไม่ใช่ BLOB
  • เราควรทำตามค่าเริ่มต้นของแต่ละระบบหรือมีวิธีการแก้ปัญหาแบบครบวงจร?
  • และวิธีพกพาที่ดีที่สุดคืออะไร

โปรดที่เฉพาะเจาะจงมากเกี่ยวกับสิ่งที่คุณหมายถึงกับ "ดีที่สุด"

3
@ Thorbjørn: ที่ดีที่สุด adj \ ที่ดีที่สุด \ สุดยอดของดี
Wizard79

3
คุณจะประหลาดใจกับความหลากหลายของความหมายของ "ดีที่สุด" บนไซต์ StackExchange

คำตอบ:


23

อะไรคือวิธีที่ดีที่สุด (และตำแหน่ง) ในการจัดเก็บการตั้งค่าที่ไม่ใช่ BLOB

บน Windows ดูเหมือนว่าจะยอมรับการใช้รีจิสทรี ในความคิดของฉันรีจิสทรีเป็นระบบที่มีการวางแผนไม่ดีและควรใช้ไฟล์ข้อความธรรมดาในUsers\Username\AppDataไดเรกทอรีแทน ง่ายต่อการสำรองข้อมูลน้อยกว่าอันตรายสำหรับผู้ใช้ในการปรับเปลี่ยนและทำความสะอาดได้ง่ายขึ้น

บน Linux และ Unixes ส่วนใหญ่ตำแหน่งที่ต้องการ/home/user/.config/appnameใช้สำหรับการตั้งค่าเฉพาะผู้ใช้และการตั้งค่า/etc/ทั่วโลก (ทั้งระบบ) ตำแหน่งที่ต้องการ (แต่ยอมรับได้) น้อยกว่าสำหรับการตั้งค่าของผู้ใช้คือ~/.appnameแต่โดยทั่วไปแล้วจะไม่ได้รับความนิยม ไฟล์เหล่านี้ควรสามารถแก้ไขได้โดยผู้ใช้ดังนั้นรูปแบบที่มนุษย์สามารถอ่านได้จึงเป็นที่ต้องการเสมอ

ฉันไม่เห็นด้วยกับคนส่วนใหญ่ว่า XML เป็นรูปแบบที่ยอมรับได้สำหรับการจัดเก็บข้อมูลที่ไม่ใช่หยด ในความคิดของฉันรูปแบบ overwrought และซับซ้อนมากเกินไปสำหรับสิ่งที่มักจะกลายเป็นชิ้นส่วนเล็ก ๆ ของข้อมูลที่มีโครงสร้าง ฉันต้องการดูไฟล์ใน YAML, JSON, ASN.1, name = value pairs หรือรูปแบบที่คล้ายกัน การมีไวยากรณ์มากเกินไปทำให้ผู้ใช้สับสนและปล่อยให้ไฟล์ในรูปแบบที่ไม่ถูกต้อง

เราควรทำตามค่าเริ่มต้นของแต่ละระบบหรือมีวิธีการแก้ปัญหาแบบครบวงจร?

ทั้งหมดนี้ขึ้นอยู่กับคุณ แต่โปรดระลึกไว้เสมอว่า:

  • แพลตฟอร์มเช่น * ระวังมีข้อ จำกัด ที่เข้มงวดเกี่ยวกับตำแหน่งที่สามารถเขียนได้ เข้มงวดกว่า Windows ดังนั้น:
    • ที่เดียวที่คุณควรเขียนถึงอะไรอยู่ในโฮมไดเร็กตอรี่ของผู้ใช้.
    • เว้นแต่ว่าแอปพลิเคชันของคุณเป็นบริการระบบ /var/ซึ่งในกรณีที่ไฟล์ข้อมูลที่ไม่แน่นอนทุกคนควรจะเขียนใน ไฟล์ข้อมูล Nonmutable ควรจะเก็บไว้ในไดเรกทอรีแอปของคุณ/usr/share/หรือ/usr/local/share/หรือ/opt/
    • แอปพลิเคชันไม่/etc/ควรเขียนไฟล์การกำหนดค่าในขณะที่ทำงานแม้ว่าไฟล์นั้นจะมีสิทธิ์เข้าถึงเพื่อเขียนก็ตาม ควรเป็นพื้นที่เก็บข้อมูลสำหรับพฤติกรรมเริ่มต้นและไม่มีอะไรอื่น/etc/
    • แผนสำหรับการประยุกต์ใช้ของคุณจะถูกติดตั้งอยู่ในหนึ่งในสามของสถานที่: /usr/local/, หรือ/opt/appname/home/username/appname
    • ควรจัดเก็บ Blobs ไว้ข้างๆไฟล์การกำหนดค่าอื่น ๆ หากมีการเปลี่ยนแปลง มันเป็นโดยทั่วไปที่นิยมการใช้รูปแบบการใช้งานที่สามารถแก้ไขได้ดังนั้นสิ่งที่ต้องการ SQLite หรือ Berkeley DB เป็นที่ต้องการ (ตั้งแต่มีเครื่องมือบรรทัดคำสั่งสำหรับแต่ละ) แต่ไม่จำเป็นต้องใช้
  • บน Windows แอปพลิเคชันของคุณควรเขียนในไดเรกทอรีผู้ใช้เท่านั้น Users\User\AppDataสถานที่ตั้งมาตรฐานสำหรับไฟล์ข้อมูล ดูเหมือนไม่มีที่อื่นที่ยอมรับได้
  • ใน Mac OS X การตั้งค่าแอปพลิเคชันของคุณควรเก็บไว้~/Library/Preferencesพร้อมกับไฟล์ plist ของแอพพลิเคชั่นอื่นทั้งหมด plistดูเหมือนว่าจะเป็นรูปแบบที่ต้องการ แต่คุณจะต้องตรวจสอบอีกครั้งตามหลักเกณฑ์ของ Apple

และวิธีพกพาที่ดีที่สุดคืออะไร

ไม่มี "ดีที่สุด" ที่จะซื่อสัตย์ มีข้อ จำกัด และความคาดหวังเฉพาะแพลตฟอร์มเท่านั้น คำแนะนำของฉันคือการใช้วิธีการเฉพาะแพลตฟอร์มแม้ว่ามันจะหมายถึงการเขียนรหัสเพิ่มเติม


1
ฉันคิดว่า Microsoft ได้ลดทอนการใช้งานของรีจิสทรีมาหลายปีแล้ว - ซึ่งก็ดี การเขียนไปที่ AppData ดังที่คุณกล่าวถึงเป็นวิธีที่จะไป ใน. NET (อาจจะเป็นใน Windows API ด้วย) มีวิธีใดวิธีหนึ่งที่ส่งกลับเส้นทางที่ถูกต้อง
MetalMikester

นอกจากนี้ยังมีตัวแปรสภาพแวดล้อม:%APPDATA%
greyfade

@ MetalMikester - ใช่แล้ว AppData รองรับ Roaming Profile สำหรับสภาพแวดล้อมของโดเมนเช่นกัน
JBRWilkinson

settings! = config
Yousha Aleayoub

> In my opinion, the registry was a poorly-devised system, and instead a simple text file in the Users\Username\AppData directory should be preferred. @greyfade - ผู้พัฒนา Windows API มานาน Raymond Chen กล่าวถึงเรื่องนี้และอธิบายว่าทำไมการใช้ไฟล์ข้อความผ่านรีจิสตรีไม่ใช่รูปแบบการออกแบบที่ดีกว่า: ทำไมไฟล์ INI จึงเลิกใช้งานแทนสตรี
Mick

8

ภายใต้ Windows %APPDATA%\appnameใช้ ภายใต้ NIX * ~/.appnameใช้ อย่าใช้ชื่อไดเรกทอรีคงที่ในทั้งสองแพลตฟอร์มเนื่องจากไดเรกทอรีหลักของผู้ใช้อาจแตกต่างจากค่าเริ่มต้น (ตัวอย่างเช่นอาจอยู่ในเครือข่าย)

สำหรับรูปแบบให้ใช้สิ่งที่คุณคิดว่าดีที่สุด นั่นคือการตัดสินใจที่มีเพียงคุณเท่านั้นที่สามารถทำได้ในบริบทของการสมัครของคุณ มันไม่จำเป็นและแน่นอนว่าไม่สมควรที่จะมีวิธี "มาตรฐาน" ในการทำถ้าวิธี "มาตรฐาน" นั้นไม่ใช่สิ่งที่ดีที่สุดสำหรับโปรแกรมเฉพาะของคุณ

ตัวอย่างเช่น XML / JSON อาจเป็นวิธีที่ดีในการจัดเก็บข้อมูลผู้ใช้ / การกำหนดค่าหากแอปพลิเคชันของคุณใช้ XML / JSON เป็นอย่างอื่นอยู่แล้ว แต่ถ้าเป็นไฟล์การกำหนดค่าอย่างง่ายทำไมเพิ่ม bloat ลงในแอพของคุณโดยแนะนำการพึ่งพา? ในกรณีนี้อาจเป็นการดีที่สุดที่จะใช้ไฟล์ข้อความธรรมดาที่มีvar: value\nบรรทัดแทน

แก้ไข:ไม่มีวิธีพกพา "ดีที่สุด" เนื่องจากระบบปฏิบัติการใช้การประชุมที่แตกต่างกันมากสำหรับเรื่องนี้ อย่าทำลายมาตรฐานระบบปฏิบัติการโดยไม่มีเหตุผลที่ดี

EDIT2:หากคุณพบว่าตัวเองทำระบบการตั้งค่ากว้าง/etcหรือHKEY_LOCAL_MACHINEถามตัวเองว่าการตั้งค่าจริงๆทั่วโลก จากนั้นรอ 5 นาทีแล้วถามตัวเองอีกครั้ง หากคำตอบคือยังใช่แล้วโดยทั้งหมดให้ทำการตั้งค่าระดับโลก โปรดจำไว้ว่าผู้ใช้ทั่วไปไม่มีสิทธิ์เข้าถึงเพื่อเขียน/etcหรือหรือHKEY_LOCAL_MACHINEทำสิ่งนี้คุณมั่นใจได้ว่าผู้ที่ไม่มีสิทธิ์ของผู้ดูแลระบบไม่สามารถติดตั้งแอปของคุณได้


ย่อหน้าแรกอนุญาตให้หนึ่งใช้ Path.Combine หรือสิ่งที่คล้ายกันดังนั้นจึงตั้งค่าที่ตั้งรูทสัมพัทธ์หนึ่งครั้งเป็น% APPDATA% หรือ ~ และปล่อยให้โค้ดทำส่วนที่เหลือสำหรับ EDIT2 แน่นอนไม่มีโซลูชันข้ามแพลตฟอร์มที่ฉันรู้ ของ. อาจมีคนที่เขียนไลบรารีการกำหนดค่าข้ามแพลตฟอร์มเพื่อจุดประสงค์นั้นอย่างน้อยก็น่าจะเป็นความคิดที่ดี ...
Tamara Wijsman

1
@TomWij: แน่นอนนักพัฒนาที่มีความสามารถจะต้องเข้าใจว่าคุณไม่จำเป็นต้องใช้ตัวอักษรทุกที่;) นั่นคือตัวแปรสำหรับ
Chinmay Kanchi

1
~/.config/applicatonกำลังกลายเป็นสถานที่ที่ต้องการบน * ระวังมากขึ้น
greyfade

@greyfade: ฉันไม่เคยรู้เรื่องนี้จริง แต่คุณพูดถูก ในเครื่องของฉันประมาณหนึ่งในสี่ของการใช้งานที่เก็บข้อมูลการตั้งค่าในการทำเช่นนั้น~ ~/.config/appname
Chinmay Kanchi

แอพทั้งกลุ่มใช้ ~ / .appname ใน Windows (ซึ่งเทียบเท่ากับโปรไฟล์ผู้ใช้ของคุณไม่ใช่เอกสาร) และมันน่ารำคาญมาก โฟลเดอร์เหล่านั้นไม่ซ่อนตัว!
Alan Pearce

3

ฉันพยายามและออกจากรีจิสทรีมันเป็นวิธีที่ใช้มากกว่า ฉันหวังว่าทุกคนจะ

ฉันชอบเก็บไฟล์ config xml หรือไฟล์ bin หรือบางครั้งเป็นฐานข้อมูลท้องถิ่น (SQLite)


+1 สำหรับการออกจากรีจิสทรี ฉันหามันไม่พบในตอนนี้ แต่ดูเหมือนว่าจะจำได้ว่ามีคนใน MS ยอมรับว่าการลงทะเบียนเป็นความผิดพลาด
Chinmay Kanchi

1
เห็นด้วยกับคุณยกเว้นส่วน XML ฉันจะใช้ ini (หรือไฟล์ข้อความธรรมดา) สำหรับความต้องการการตั้งค่าอย่างง่ายและ SQLite สำหรับแอพที่ซับซ้อน
Codism

พวกเขาเพิ่งจะยอมรับว่า? ฉันบอกคุณได้ว่าในปี 1995! Mac OS Classic เข้าใจถูกต้อง: โฟลเดอร์กำหนดค่าเพื่อให้คุณเป็นศูนย์กลางในการจัดเก็บข้อมูลการกำหนดค่าโดยแต่ละแอปจะบันทึกลงในไฟล์ของตัวเอง เมื่อฉันเห็น Registry ครั้งแรกฉันก็เหมือน "ไมโครซอฟท์ไม่เคยได้ยินว่าไม่เอาไข่ของคุณใส่ในตะกร้าใบเดียวใช่มั้ย!?"
Mason Wheeler

1
ฉันคิดว่าเป็นสถานที่สำหรับวางการตั้งค่าระบบปฏิบัติการ (เช่นการลงทะเบียนนามสกุลไฟล์ ฯลฯ ) ก็ใช้ได้ แต่ถ้า Microsoft เผยแพร่เป็น api แบบอ่านอย่างเดียวพวกเขาอาจจะถูกฟ้องร้องดำเนินคดีและต้องทำการเขียนโปรแกรมต่อไป
µBio

@Chinmay, @Mason รีจิสตรีไม่ผิดเพราะรีจิสตรีทำมากกว่าแค่เก็บข้อมูลการกำหนดค่า (ดูที่: นโยบายกลุ่ม, โดเมน, การเรพลิเคท) ข้อผิดพลาดคือวิธีที่ Microsoft ส่งเสียงแหลมให้กับนักพัฒนาและการขาดมาตรฐานที่ดีในการใช้งาน มันสิ้นสุดลงที่การทุ่มตลาดสำหรับข้อมูลแอปซึ่งไม่ใช่สิ่งที่มันเคยมีความหมาย
Matt Olenik

3

คำตอบของฉันคือการรวมกันของ Chinmay จิของคำตอบและ BioBuckyBall ของคำตอบ

XML / Json สำหรับการกำหนดค่าอย่างง่าย, SQLite สำหรับการซับซ้อน, การกำหนดค่าขนาดใหญ่ที่จอดไว้ในโฟลเดอร์แอปพลิเคชันระบบปฏิบัติการเริ่มต้นหรือโฟลเดอร์ผู้ใช้ระบบปฏิบัติการเริ่มต้นเมื่อการกำหนดค่าขึ้นอยู่กับผู้ใช้ ทั้งสองสามารถใช้



1

การตั้งค่าผู้ใช้มักจะมา

/home/<user>/.<application> 

ตัวอย่างเช่นสำหรับการตั้งค่า irssi คือ /home//.irssi/config


แต่นี่คือการประชุม Unix แล้ว Windows ล่ะ และในลีนุกซ์, ไม่ทำให้ไดเรกทอรีหลักของผู้ใช้ท่วมด้วยไดเรกทอรีย่อย? ทำไมไม่/home/<user>/etc/application?
Wizard79

@ Lorenzo: น้ำท่วมไดเรกทอรีบ้านของผู้ใช้ไม่ค่อยมีปัญหา
Chinmay Kanchi

1
การตั้งค่าการกำหนดค่าจะถูกย้ายไปที่มากขึ้น~/.config/applicationเพื่อช่วยให้ทุกอย่างรวม ฉันอยากเห็นด้วยกับการเคลื่อนไหวนี้
greyfade

1
@ Lorenzo: นี่เหมือนกับระเบียบ Windows ในการจัดเก็บไฟล์การกำหนดค่าAppDataมา
greyfade

1
@Chris: ไม่มีทาง! :-)
Wizard79

1

ฉันคิดว่าเป็นการดีที่สุดที่จะใช้กลไกเฉพาะแพลตฟอร์มที่ต้องการ ตัวอย่างเช่นบน OS X กลไกที่ต้องการคือการวางรายการคุณสมบัติใน ~ / Library / Preferences และ Cocoa API มีอินเทอร์เฟซที่เรียบง่ายจริงๆสำหรับการจัดเก็บและดึงการตั้งค่าจากที่นั่น

หากแอปของคุณเป็นแพลตฟอร์มข้ามคุณสามารถสรุปได้ด้วยคลาสหรืออะไรก็ตาม


0

สิ่งเดียวที่ฉันเขียนถึงรีจิสตรีคือที่ตั้งของแอพเพื่อให้ผู้ติดตั้งและตัวอัปเดตสามารถค้นหาได้ง่าย ทุกอย่างอื่นถูกเก็บไว้ในไฟล์ใน / AppData / บริษัท / แอพ


-2

สำหรับแอพ Java ฉันคิดว่าgsonเป็นตัวเลือกที่ดี สร้างวัตถุการตั้งค่าของคุณและใช้ gson เพื่อแปลงเป็น JSON และในทางกลับกัน มีความได้เปรียบในการเป็นมนุษย์ที่สามารถอ่านได้แทนที่จะเป็น Blob ต่อเนื่อง

แก้ไข: ตกลงดังนั้นอาจไม่ธรรมดา ...


-2

หากคุณกำลังเขียนใน. NET คุณสามารถใช้System.Environment.SpecialFoldersเพื่อค้นหาตำแหน่งโฟลเดอร์ที่คุณสามารถใช้สำหรับการบันทึกการกำหนดค่าหรือแม้แต่ข้อมูลบางส่วน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.