TL; DR - Próbuję zaprojektować optymalną strukturę danych, aby zdefiniować jednostki w jednostce miary.
A Unit of measure
jest zasadniczo value
(lub ilością) związaną z unit
. Jednostki SI mają siedem zasad lub wymiarów. Mianowicie: długość, masa, czas, prąd elektryczny, temperatura, ilość substancji (mole) i natężenie światła.
Byłoby to dość proste, ale istnieje wiele pochodnych jednostek, a także stawki, których często używamy. Przykładową połączoną jednostką byłby Newton: kg * m / s^2
a przykładową stawką byłby tons / hr
.
Mamy aplikację, która w dużej mierze opiera się na domyślnych jednostkach. Osadzimy jednostki w nazwie zmiennej lub kolumny. Ale to stwarza problemy, gdy musimy określić jednostkę miary z różnymi jednostkami. Tak, możemy przekonwertować wartości na wejściu i na wyświetlaczu, ale generuje to dużo kodu napowietrznego, który chcielibyśmy zamknąć w swojej klasie.
Istnieje wiele rozwiązań dla codeplex i innych środowisk współpracy. Licencjonowanie projektów jest przyjemne, ale sam projekt zwykle okazuje się zbyt lekki lub zbyt ciężki. Ścigamy własnego jednorożca „w sam raz”.
Idealnie byłoby zdefiniować nową jednostkę miary, używając czegoś takiego:
UOM myUom1 = nowy UOM (10 woltów);
UOM myUom2 = nowy UOM (43,2, niutony);
Oczywiście używamy kombinacji jednostek Imperial i SI w zależności od potrzeb naszych klientów.
Musimy również zsynchronizować tę strukturę jednostek z przyszłą tabelą bazy danych, abyśmy mogli zapewnić ten sam stopień spójności również w naszych danych.
Jaki jest najlepszy sposób definiowania jednostek, jednostek pochodnych i szybkości, których musimy użyć, aby stworzyć naszą klasę jednostek miary? Widziałem użycie jednego lub więcej wyliczeń, ale może to być frustrujące dla innych programistów. Pojedynczy wylicznik byłby ogromny z ponad 200 wpisami, podczas gdy wielokrotne wyliczenia mogłyby być mylące w oparciu o SI względem jednostek imperialnych i dodatkowy podział oparty na kategoryzacji samej jednostki.
Przykłady enum pokazujące niektóre z moich obaw:
myUnits.Volt
myUnits.Newton
myUnits.meterSIUnit.meter
ImpUnit.foot DrvdUnit.Newton
DrvdUnitSI.Newton
DrvdUnitImp.FtLbs
Nasz zestaw używanych jednostek jest dość dobrze zdefiniowany i ma ograniczoną przestrzeń. Potrzebujemy możliwości rozszerzenia i dodania nowych jednostek pochodnych lub stawek, gdy mamy na nie zapotrzebowanie klientów. Projekt jest w języku C #, chociaż myślę, że szersze aspekty projektowania dotyczą wielu języków.
Jedna z bibliotek, które przeglądałem, umożliwia swobodne wprowadzanie jednostek za pomocą łańcucha. Następnie klasa UOM parsowała łańcuch i odpowiednio wstawiała różne elementy. Wyzwanie związane z tym podejściem polega na tym, że zmusza programistę do myślenia i zapamiętywania poprawnych formatów ciągów. I narażam się na błąd / wyjątek w czasie wykonywania, jeśli nie dodamy dodatkowych kontroli w kodzie, aby sprawdzić ciągi znaków przekazywane do konstruktora.
Inna biblioteka zasadniczo stworzyła zbyt wiele klas, z którymi programista musiałby pracować. Wraz z równoważną JM zapewnił DerivedUnit
a RateUnit
i tak dalej. Zasadniczo kod był zbyt skomplikowany w przypadku problemów, które rozwiązujemy. Ta biblioteka zasadniczo umożliwiałaby dowolne: dowolne kombinacje (co jest uzasadnione w świecie jednostek), ale chętnie rozszerzymy nasz problem (uprościć nasz kod), nie zezwalając na każdą możliwą kombinację.
Inne biblioteki były absurdalnie proste i nawet nie brały pod uwagę na przykład przeciążenia operatora.
Ponadto nie martwię się tak bardzo o próby niepoprawnej konwersji (na przykład: woltów na metry). Deweloperzy są jedynymi, którzy uzyskają dostęp na tym poziomie w tym momencie i niekoniecznie musimy chronić się przed tego rodzaju błędami.