TL; DR - Saya mencoba merancang struktur data yang optimal untuk mendefinisikan unit dalam satuan ukuran.
A Unit of measure
pada dasarnya adalah value
(atau kuantitas) yang terkait dengan a unit
. Unit SI memiliki tujuh pangkalan atau dimensi. Yaitu: panjang, massa, waktu, arus listrik, suhu, jumlah zat (mol), dan intensitas cahaya.
Ini akan cukup mudah, tetapi ada sejumlah unit turunan serta tarif yang sering kita gunakan. Satuan gabungan contoh adalah Newton: kg * m / s^2
dan contoh laju adalah tons / hr
.
Kami memiliki aplikasi yang sangat bergantung pada unit tersirat. Kami akan menyematkan unit dalam nama variabel atau kolom. Tapi ini menciptakan masalah ketika kita perlu menentukan satuan ukuran dengan unit yang berbeda. Ya, kami dapat mengonversi nilai pada input dan tampilan tetapi ini menghasilkan banyak kode overhead yang ingin kami enkapsulasi di dalam kelasnya sendiri.
Ada sejumlah solusi pada codeplex dan lingkungan kolaboratif lainnya. Lisensi untuk proyek-proyek tersebut disetujui tetapi proyek itu sendiri biasanya berakhir terlalu ringan atau terlalu berat. Kami mengejar unicorn kami sendiri "benar."
Idealnya, saya bisa mendefinisikan satuan ukuran baru menggunakan sesuatu seperti ini:
UOM myUom1 = UOM baru (10, volt);
UOM myUom2 = UOM baru (43.2, Newton);
Tentu saja, kami menggunakan campuran unit Imperial dan SI berdasarkan kebutuhan klien kami.
Kami juga perlu menjaga struktur unit ini disinkronkan dengan tabel basis data masa depan sehingga kami dapat memberikan tingkat konsistensi yang sama di dalam data kami juga.
Apa cara terbaik untuk mendefinisikan unit, unit turunan, dan kurs yang perlu kita gunakan untuk membuat unit kelas pengukuran kita? Saya bisa melihat menggunakan satu atau lebih enum, tetapi itu bisa membuat frustasi bagi pengembang lain. Satu enum akan sangat besar dengan 200+ entri sedangkan beberapa enum bisa membingungkan berdasarkan unit SI vs Imperial dan rincian tambahan berdasarkan kategorisasi unit itu sendiri.
Contoh-contoh Enum yang menunjukkan beberapa kekhawatiran saya:
myUnits.Volt
myUnits.Newton
myUnits.meterSIUnit.meter
ImpUnit.foot DrvdUnit.Newton
DrvdUnitSI.Newton
DrvdUnitImp.FtLbs
Seperangkat unit yang kami gunakan didefinisikan dengan cukup baik dan ini adalah ruang yang terbatas. Kami benar-benar membutuhkan kemampuan untuk memperluas dan menambahkan unit atau tarif turunan baru ketika kami memiliki permintaan klien untuk mereka. Proyek ini dalam C # meskipun saya pikir aspek desain yang lebih luas berlaku untuk berbagai bahasa.
Salah satu perpustakaan yang saya lihat memungkinkan untuk input bebas bentuk unit melalui string. Kelas UOM mereka kemudian mengurai string dan mengatur hal-hal yang sesuai. Tantangan dengan pendekatan ini adalah bahwa hal itu memaksa pengembang untuk berpikir dan mengingat apa format string yang benar. Dan saya menjalankan risiko kesalahan runtime / pengecualian jika kita tidak menambahkan pemeriksaan tambahan dalam kode untuk memvalidasi string yang diteruskan dalam konstruktor.
Pustaka lain pada dasarnya menciptakan terlalu banyak kelas yang harus dikerjakan pengembang. Seiring dengan UOM yang setara itu disediakan DerivedUnit
dan RateUnit
dan seterusnya. Pada dasarnya, kode itu terlalu rumit untuk masalah yang kami pecahkan. Pustaka itu pada dasarnya akan membolehkan apa saja: kombinasi apa pun (yang sah di dunia unit) tapi kami senang lingkup masalah kami (menyederhanakan kode kami) dengan tidak mengizinkan setiap kombinasi yang mungkin.
Perpustakaan lain sangat sederhana dan bahkan tidak mempertimbangkan kelebihan operator misalnya.
Selain itu, saya tidak khawatir tentang upaya konversi yang salah (misalnya: volt ke meter). Devs adalah satu-satunya yang akan mengakses pada tingkat ini pada saat ini dan kita tidak perlu melindungi dari jenis kesalahan tersebut.