TL; DR - Я намагаюся створити оптимальну структуру даних для визначення одиниць у межах одиниці вимірювання.
A Unit of measure
по суті є value
(або кількістю), пов'язаною з a unit
. Одиниці SI мають сім основ або розмірів. А саме: довжина, маса, час, електричний струм, температура, кількість речовини (молі) та інтенсивність світла.
Це було б досить просто, але є ряд похідних одиниць, а також ставки, які ми часто використовуємо. Прикладом комбінованої одиниці може бути Ньютон: kg * m / s^2
і приклад ставки tons / hr
.
У нас є додаток, який в значній мірі покладається на маються на увазі одиниці. Ми вбудуємо одиниці в назву змінної або стовпця. Але це створює проблеми, коли нам потрібно вказати одиницю виміру з різними одиницями. Так, ми можемо конвертувати значення при введенні та відображенні, але це генерує багато накладних кодів, які ми хотіли б інкапсулювати в межах свого власного класу.
Існує ряд рішень для кодеплексу та інших середовищ для спільної роботи. Ліцензування проектів є приємним, але сам проект зазвичай закінчується занадто легким або занадто важким. Ми переслідуємо власного єдинорога "просто правильно".
В ідеалі я міг би визначити нову одиницю вимірювання, використовуючи щось подібне:
UOM myUom1 = новий UOM (10, вольт);
UOM myUom2 = новий UOM (43,2, ньютонів);
Звичайно, ми використовуємо поєднання імперських та SI-одиниць на основі потреб наших клієнтів.
Нам також потрібно зберегти цю структуру одиниць синхронізованою з майбутнім таблицею баз даних, щоб ми могли забезпечити однакову ступінь узгодженості і в наших даних.
Який найкращий спосіб визначення одиниць, похідних одиниць і ставок, які нам потрібно використовувати для створення нашого класу одиниць вимірювання? Я міг бачити використання одного або декількох перерахунків, але це може неприємно для інших розробників. Один перерахунок був би величезним із 200+ записів, тоді як декілька перерахунків можуть бути заплутаними на основі СІ проти Імператорських одиниць та додаткового розбиття на основі категоризації самої одиниці.
Приклади переліків, які показують деякі мої проблеми:
myUnits.Volt
myUnits.Newton
myUnits.meterSIUnit.meter
ImpUnit.foot DrvdUnit.Newton
DrvdUnitSI.Newton
DrvdUnitImp.FtLbs
Наш набір одиниць, що використовуються, досить чітко визначений і це обмежений простір. Нам потрібна можливість розширювати та додавати нові похідні одиниці або ставки, коли у нас є попит клієнта на них. Проект є на C #, хоча я думаю, що більш широкі аспекти дизайну застосовні до декількох мов.
Одна з бібліотек, яку я розглядав, дозволяє вводити одиниці у вільній формі через рядок. Їх клас UOM потім розбирав рядок і відповідно розрізував речі. Завдання такого підходу полягає в тому, що він змушує розробника думати і пам’ятати, які правильні формати рядків. І я ризикую помилкою / винятком виконання, якщо ми не додамо додаткові перевірки в код, щоб перевірити рядки, що передаються в конструктор.
Інша бібліотека по суті створила занадто багато класів, з якими розробнику доведеться працювати. Поряд з еквівалентної UoM він надав , DerivedUnit
і RateUnit
і так далі. По суті, код був надмірно складним для проблем, які ми вирішуємо. Ця бібліотека по суті дозволить дозволити будь-які: будь-які комбінації (що є законним у світі одиниць), але ми раді розширити нашу проблему (спростити наш код), не допускаючи будь-якої можливої комбінації.
Інші бібліотеки були смішно простими, наприклад, навіть не вважали перевантаження оператора.
Крім того, мене не так хвилюють спроби неправильних перетворень (наприклад: вольт до метрів). Диви - це єдині, хто отримає доступ на цьому рівні в цей момент, і нам не обов’язково потрібно захищати від таких типів помилок.