TL; DR - ฉันพยายามออกแบบโครงสร้างข้อมูลที่ดีที่สุดเพื่อกำหนดหน่วยภายในหน่วยการวัด
Unit of measure
เป็นหลักvalue
(หรือปริมาณ) unit
ที่เกี่ยวข้องกับ หน่วย SIมีเจ็ดฐานหรือขนาด กล่าวคือความยาวมวลเวลากระแสไฟฟ้าอุณหภูมิปริมาณสาร (โมล) และความเข้มการส่องสว่าง
สิ่งนี้จะตรงไปตรงมามากพอ แต่มีหน่วยที่ได้รับมาจำนวนมากรวมทั้งอัตราที่เราใช้บ่อย ตัวอย่างรวมหน่วยจะเป็นนิวตัน: และอัตราตัวอย่างจะเป็นkg * m / s^2
tons / hr
เรามีแอปพลิเคชั่นที่ต้องอาศัยหน่วยงานโดยนัย เราจะฝังหน่วยภายในชื่อตัวแปรหรือคอลัมน์ แต่สิ่งนี้จะสร้างปัญหาเมื่อเราจำเป็นต้องระบุหน่วยการวัดด้วยหน่วยที่แตกต่างกัน ใช่เราสามารถแปลงค่าที่อินพุทและจอแสดงผล แต่สิ่งนี้จะสร้างรหัสค่าใช้จ่ายจำนวนมากที่เราต้องการห่อหุ้มในคลาสของตัวเอง
มีโซลูชั่นจำนวนมากเกี่ยวกับ codeplex และสภาพแวดล้อมการทำงานร่วมกันอื่น ๆ การอนุญาตให้ใช้สิทธิ์สำหรับโครงการนั้นเป็นที่ยอมรับ แต่โดยทั่วไปแล้วโครงการมักจะมีน้ำหนักเบาหรือหนักเกินไป เรากำลังไล่ตามยูนิคอร์นของเรา "ถูกต้อง"
เป็นการดีที่ฉันสามารถกำหนดหน่วยวัดใหม่โดยใช้สิ่งนี้:
UOM myUom1 = UOM ใหม่ (10, โวลต์);
UOM myUom2 = UOM ใหม่ (43.2, Newtons);
แน่นอนว่าเราใช้การผสมผสานระหว่างหน่วย Imperial และ SI ตามความต้องการของลูกค้า
นอกจากนี้เรายังต้องรักษาโครงสร้างหน่วยของข้อมูลให้ตรงกันกับตารางฐานข้อมูลในอนาคตเพื่อให้เราสามารถให้ข้อมูลที่สอดคล้องกันในระดับเดียวกัน
อะไรคือวิธีที่ดีที่สุดในการกำหนดหน่วยหน่วยที่ได้รับและอัตราที่เราต้องใช้เพื่อสร้างหน่วยวัดระดับของเรา ฉันเห็นการใช้ enums ตั้งแต่หนึ่งตัวขึ้นไป แต่อาจทำให้ผู้พัฒนารายอื่นผิดหวังได้ enum เดียวจะมีขนาดใหญ่กว่า 200+ รายการในขณะที่หลาย enums อาจสร้างความสับสนโดยยึดตามหน่วย SI เทียบกับ Imperial และรายละเอียดเพิ่มเติมตามหมวดหมู่ของหน่วยเอง
ตัวอย่าง Enum แสดงข้อกังวลของฉัน:
myUnits.Volt
myUnits.Newton
myUnits.meterSIUnit.meter
ImpUnit.foot DrvdUnit.Newton
DrvdUnitSI.Newton
DrvdUnitImp.FtLbs
ชุดของหน่วยที่ใช้งานของเรานั้นค่อนข้างชัดเจนและเป็นพื้นที่ จำกัด เราต้องการความสามารถในการขยายและเพิ่มหน่วยที่ได้รับใหม่หรืออัตราเมื่อเรามีความต้องการของลูกค้าสำหรับพวกเขา โครงการอยู่ใน C # ถึงแม้ว่าฉันคิดว่าการออกแบบที่กว้างขึ้นสามารถใช้ได้กับหลายภาษา
หนึ่งในห้องสมุดที่ฉันดูช่วยให้สามารถป้อนหน่วยอิสระผ่านสายอักขระได้ จากนั้นคลาส UOM ของพวกเขาจะวิเคราะห์สตริงและ slotted สิ่งต่าง ๆ ตามลำดับ ความท้าทายด้วยวิธีนี้คือมันบังคับให้นักพัฒนาคิดและจดจำรูปแบบสตริงที่ถูกต้อง และฉันเสี่ยงต่อข้อผิดพลาด / ข้อยกเว้นรันไทม์หากเราไม่เพิ่มการตรวจสอบเพิ่มเติมภายในรหัสเพื่อตรวจสอบความถูกต้องของสตริงที่ส่งผ่านในตัวสร้าง
อีกไลบรารีหนึ่งสร้างคลาสมากเกินไปที่ผู้พัฒนาจะต้องทำงานด้วย พร้อมกับ UOM เทียบเท่ามันให้DerivedUnit
และRateUnit
และอื่น ๆ โดยพื้นฐานแล้วรหัสนั้นซับซ้อนเกินไปสำหรับปัญหาที่เรากำลังแก้ไข ไลบรารี่นั้นอนุญาตให้มีอะไรก็ได้: ชุดค่าผสมใด ๆ (ซึ่งถูกต้องตามกฎหมายในโลกหน่วย) แต่เรายินดีที่จะกำหนดขอบเขตปัญหาของเรา (ทำให้รหัสของเราง่ายขึ้น) โดยไม่อนุญาตให้ใช้ชุดค่าผสมที่เป็นไปได้ทั้งหมด
ห้องสมุดอื่น ๆ เรียบง่ายอย่างน่าขันและไม่เคยแม้แต่จะถือว่าผู้ให้บริการโหลดมากเกินไป
นอกจากนี้ฉันไม่กังวลเกี่ยวกับความพยายามในการแปลงที่ไม่ถูกต้อง (ตัวอย่างเช่น: โวลต์เป็นเมตร) ผู้พัฒนาเป็นคนเดียวที่จะเข้าถึงได้ในระดับนี้ ณ จุดนี้และเราไม่จำเป็นต้องป้องกันความผิดพลาดเหล่านั้น