TL; DR - Bir ölçü birimi içindeki birimleri tanımlamak için en uygun veri yapısını tasarlamaya çalışıyorum.
A Unit of measure
esasen a value
ile ilişkili bir (veya miktar) ' dır unit
. SI Üniteleri yedi tabana veya boyuta sahiptir. Yani: uzunluk, kütle, zaman, elektrik akımı, sıcaklık, madde miktarı (mol) ve ışık şiddeti.
Bu yeterince basit olacaktır, ancak sık kullandığımız oranların yanı sıra bir dizi türetilmiş birim de vardır. Örnek birleşik birim Newton: kg * m / s^2
örnek bir oran olacaktır tons / hr
.
Zımni birimlere dayanan bir uygulamamız var. Birimleri değişken veya sütun adı içine gömeceğiz. Ancak bu, farklı birimlerle bir ölçü birimi belirtmemiz gerektiğinde sorun yaratır. Evet, değerleri giriş ve görüntüde dönüştürebiliriz, ancak bu, kendi sınıfında kapsüllemek istediğimiz çok fazla genel kod oluşturur.
Codeplex ve diğer ortak çalışma ortamlarında bir takım çözümler var. Projelerin lisanslanması kabul edilebilir ancak projenin kendisi genellikle çok hafif veya çok ağır olur. Kendi "tek doğru" unicorn'umuzu kovalıyoruz.
İdeal olarak, böyle bir şey kullanarak yeni bir ölçü birimi tanımlayabilirim:
UOM myUom1 = yeni UOM (10, volt);
UOM myUom2 = yeni UOM (43.2, Newton);
Elbette, müşterilerimizin ihtiyaçlarına göre bir dizi Imperial ve SI birimi kullanıyoruz.
Verilerimizde de aynı tutarlılık derecesini sağlayabilmemiz için, bu birimler yapısını gelecekteki bir veritabanı tablosuyla senkronize tutmamız gerekir.
Ölçü birimi sınıfımızı oluşturmak için kullanmamız gereken birimleri, türetilmiş birimleri ve oranları tanımlamanın en iyi yolu nedir? Bir veya daha fazla numaralandırma kullandığını görebiliyordum, ancak bu diğer geliştiriciler için sinir bozucu olabilir. Tek bir numaralandırma 200'den fazla girişle çok büyük olurken, birden fazla numara SI ve Imperial birimlerine göre kafa karıştırıcı olabilir ve birimin kendisinin kategorize edilmesine dayalı olarak ek bir arıza olabilir.
Endişelerimin bazılarını gösteren numaralandırma örnekleri:
myUnits.Volt
myUnits.Newton
myUnits.meterSIUnit.meter
ImpUnit.foot DrvdUnit.Newton
DrvdUnitSI.Newton
DrvdUnitImp.FtLbs
Kullanımdaki birimlerimiz oldukça iyi tanımlanmış ve sonlu bir alan. Müşteri talebi olduğunda yeni türetilmiş birimleri veya oranları genişletme ve ekleme yeteneğine ihtiyacımız var. Daha geniş tasarım yönlerinin birden çok dile uygulanabilir olduğunu düşünmeme rağmen proje C # 'da.
Baktığım kütüphanelerden biri, birimlerin dize yoluyla serbest biçimli girilmesine izin veriyor. Daha sonra UOM sınıfları dizeyi ayrıştırdı ve buna göre oluk açıyor. Bu yaklaşımla ilgili zorluk, geliştiriciyi doğru dize biçimlerinin ne olduğunu düşünmeye ve hatırlamaya zorlamasıdır. Ve yapıcıya geçirilen dizeleri doğrulamak için kod içinde ek denetimler eklemezsek bir çalışma zamanı hatası / istisna riski çalıştırıyorum.
Başka bir kütüphane aslında geliştiricinin birlikte çalışması gereken çok fazla sınıf oluşturdu. Eşdeğer UOM ile birlikte bir sağlanan DerivedUnit
ve RateUnit
vb. Esasen, çözdüğümüz sorunlar için kod aşırı derecede karmaşıktı. Bu kütüphane esasen herhangi bir kombinasyona izin verecektir: (birimler dünyasında meşru olan) herhangi bir kombinasyon (ancak olası her kombinasyona izin vermeyerek) sorunumuzu kapsamaktan (kodumuzu basitleştirmekten) memnuniyet duyuyoruz.
Diğer kütüphaneler gülünç derecede basitti ve örneğin operatör aşırı yüklemesi bile düşünmemişti.
Ayrıca, yanlış dönüşüm girişimleri konusunda endişelenmiyorum (örneğin: volt - metre). Bu noktada bu düzeyde erişebilecek olan yalnızca geliştiricilerdir ve bu tür hatalara karşı korunmamız gerekmez.