ลองมาอีกตัวอย่างหนึ่งที่ไม่ค่อยเต็มไปด้วยแนวคิดและความคาดหวัง ฉันได้รับ enum ที่นี่และมันเป็นชุดของลำดับความสำคัญสำหรับข้อผิดพลาด
คุณเก็บค่าอะไรในฐานข้อมูล
ดังนั้นฉันอาจจะจัดเก็บ'C'
, 'H'
, 'M'
และ'L'
ในฐานข้อมูล หรือ'HIGH'
อื่น ๆ นี่เป็นปัญหาของข้อมูลที่พิมพ์อย่างเคร่งครัด มีชุดของค่าที่ถูกต้องที่รู้จักกันดีและหากคุณไม่ได้จัดเก็บชุดนั้นไว้ในฐานข้อมูลอาจเป็นเรื่องยากที่จะทำงานด้วย
ทำไมคุณถึงจัดเก็บข้อมูลในรหัส?
คุณมีList<String> priorities = {'CRITICAL', 'HIGH', 'MEDIUM', 'LOW'};
หรือมีบางอย่างที่ส่งผลต่อโค้ด หมายความว่าคุณมีการแมปข้อมูลต่าง ๆ ในรูปแบบที่เหมาะสม (คุณใส่ตัวพิมพ์ใหญ่ทั้งหมดลงในฐานข้อมูล แต่คุณแสดงเป็นCritical
) รหัสของคุณก็ยากที่จะแปล คุณผูกการแสดงฐานข้อมูลของแนวคิดกับสตริงที่เก็บไว้ในรหัส
ทุกที่ที่คุณต้องการเข้าถึงรายการนี้คุณต้องทำซ้ำรหัสหรือคลาสที่มีค่าคงที่จำนวนมาก ไม่มีตัวเลือกใดที่ดี สิ่งหนึ่งที่ไม่ควรลืมก็คือมีแอปพลิเคชั่นอื่น ๆที่อาจใช้ข้อมูลนี้ (ซึ่งอาจเขียนเป็นภาษาอื่น - เว็บแอปพลิเคชัน Java มีระบบรายงาน Crystal Reports ที่ใช้และPerlข้อมูลการป้อนงานแบทช์) เอ็นจิ้นการรายงานจำเป็นต้องทราบรายการข้อมูลที่ถูกต้อง (จะเกิดอะไรขึ้นหากไม่มีการทำเครื่องหมายใน'LOW'
ลำดับความสำคัญและคุณจำเป็นต้องรู้ว่านั่นเป็นลำดับความสำคัญที่ถูกต้องสำหรับรายงานหรือไม่) และงานแบ็ตช์จะมีข้อมูล ค่าคือ
สมมุติฐานคุณอาจพูดว่า "เราเป็นร้านค้าภาษาเดียว - ทุกอย่างเขียนด้วยภาษา Java" และมี. jar เดียวที่มีข้อมูลนี้ - แต่ตอนนี้ก็หมายความว่าแอปพลิเคชันของคุณเชื่อมโยงกันอย่างแน่นหนา ข้อมูล. คุณจะต้องปล่อยส่วนการรายงานและส่วนการอัปเดตแบทช์พร้อมกับเว็บแอปพลิเคชันทุกครั้งที่มีการเปลี่ยนแปลง - และหวังว่าการเผยแพร่นั้นจะเป็นไปอย่างราบรื่นสำหรับทุกส่วน
เกิดอะไรขึ้นเมื่อเจ้านายของคุณต้องการลำดับความสำคัญอื่น
เจ้านายของคุณมาถึงแล้ววันนี้ มีความสำคัญเป็นใหม่ CEO
- ตอนนี้คุณต้องไปและเปลี่ยนรหัสทั้งหมดและทำการคอมไพล์และปรับใช้ใหม่
ด้วยวิธีการ 'enum-in-the-table' คุณจะอัพเดตรายการ enum เพื่อให้มีลำดับความสำคัญใหม่ รหัสทั้งหมดที่ได้รับรายการดึงออกจากฐานข้อมูล
ข้อมูลไม่ค่อยโดดเดี่ยว
ด้วยลำดับความสำคัญคีย์ข้อมูลลงในตารางอื่น ๆที่อาจมีข้อมูลเกี่ยวกับเวิร์กโฟลว์หรือผู้ที่สามารถกำหนดลำดับความสำคัญนี้หรืออะไรก็ตาม
กลับไปที่เพศตามที่กล่าวถึงในคำถามเล็กน้อย: เพศมีลิงก์ไปยังสรรพนามที่ใช้งาน: he/his/him
และshe/hers/her
... และคุณต้องการหลีกเลี่ยงการเข้ารหัสที่เป็นรหัสอย่างหนัก และจากนั้นเจ้านายของคุณก็มาด้วยและคุณต้องเพิ่มว่าคุณมี'OTHER'
เพศ (เพื่อให้เป็นเรื่องง่าย) และคุณต้องเชื่อมโยงเพศนี้กับthey/their/them
... และเจ้านายของคุณเห็นว่า Facebook มีอะไรและ ... ดีใช่
โดยการ จำกัด ตัวเองให้เป็นข้อมูลที่พิมพ์อย่างเข้มงวดแทนที่จะเป็นตาราง enum ตอนนี้คุณจำเป็นต้องทำซ้ำสตริงนั้นในกลุ่มของตารางอื่น ๆ เพื่อรักษาความสัมพันธ์ระหว่างข้อมูลและบิตอื่น ๆ
แล้วดาต้าสโตร์อื่น ๆ ล่ะ?
ไม่ว่าคุณจะเก็บสิ่งนี้ไว้ที่ไหนหลักการเดียวกันก็มีอยู่
- คุณอาจมีไฟล์
priorities.prop
นั่นคือรายการลำดับความสำคัญ คุณอ่านรายการนี้จากไฟล์คุณสมบัติ
คุณสามารถมีฐานข้อมูลที่เก็บเอกสาร (เช่นCouchDB ) ที่มีรายการสำหรับenums
(แล้วเขียนฟังก์ชันการตรวจสอบใน JavaScript ):
{
"_id": "c18b0756c3c08d8fceb5bcddd60006f4",
"_rev": "1-c89f76e36b740e9b899a4bffab44e1c2",
"priorities": [ "critical", "high", "medium", "low" ],
"severities": [ "blocker", "bad", "annoying", "cosmetic" ]
}
คุณสามารถมีไฟล์ XML ที่มีสคีมาเล็กน้อย:
<xs:element name="priority" type="priorityType"/>
<xs:simpleType name="priorityType">
<xs:restriction base="xs:string">
<xs:enumeration value="critical"/>
<xs:enumeration value="high"/>
<xs:enumeration value="medium"/>
<xs:enumeration value="low"/>
</xs:restriction>
</xs:simpleType>
แนวคิดหลักเหมือนกัน ที่เก็บข้อมูลนั้นเป็นที่ที่รายการของค่าที่ถูกต้องจะต้องถูกจัดเก็บและบังคับใช้ โดยการวางไว้ที่นี่มันง่ายกว่าที่จะให้เหตุผลเกี่ยวกับรหัสและข้อมูล คุณไม่ต้องกังวลเกี่ยวกับการตรวจสอบอย่างละเอียดว่ามีอะไรบ้างในแต่ละครั้ง (มันเป็นตัวพิมพ์ใหญ่หรือต่ำกว่าทำไมมีchritical
คอลัมน์ในประเภทนี้หรือไม่ ฯลฯ ... ) เพราะคุณรู้ว่าคุณได้รับอะไรกลับมาจาก datastore สิ่งที่ว่าที่เก็บข้อมูลคาดหวังให้คุณส่งเป็นอย่างอื่น - และคุณสามารถสอบถามที่เก็บข้อมูลสำหรับรายการค่าที่ถูกต้อง
การพกพา
ชุดของค่าที่ถูกต้องคือข้อมูลไม่ใช่รหัส คุณไม่จำเป็นต้องมุ่งมั่นเพื่อความแห้งรหัส - แต่ปัญหาของการทำซ้ำคือการที่คุณจะทำซ้ำข้อมูลในรหัสแทนที่จะเคารพสถานที่ที่เป็นข้อมูลและเก็บไว้ในฐานข้อมูล
มันทำให้การเขียนแอพพลิเคชั่นหลาย ๆ ตัวเทียบกับดาต้าสโตร์ได้ง่ายขึ้นและหลีกเลี่ยงการมีอินสแตนซ์ที่คุณจะต้องปรับใช้ทุกอย่างที่เชื่อมโยงกับข้อมูลอย่างแน่นหนา - เพราะคุณไม่ได้ใส่รหัสของคุณเข้ากับข้อมูล
มันทำให้การทดสอบแอปพลิเคชันง่ายขึ้นเพราะคุณไม่ต้องทดสอบซ้ำทั้งแอปพลิเคชันเมื่อCEO
มีการเพิ่มลำดับความสำคัญเนื่องจากคุณไม่มีรหัสใด ๆ ที่เกี่ยวข้องกับมูลค่าที่แท้จริงของลำดับความสำคัญ
ความสามารถในการใช้เหตุผลเกี่ยวกับรหัสและข้อมูลที่เป็นอิสระจากกันทำให้ง่ายต่อการค้นหาและแก้ไขข้อบกพร่องเมื่อทำการบำรุงรักษา