TL; DR - Tôi đang cố gắng thiết kế cấu trúc dữ liệu tối ưu để xác định các đơn vị trong một đơn vị đo.
A Unit of measure
thực chất là một value
(hoặc số lượng) liên quan đến a unit
. Đơn vị SI có bảy cơ sở hoặc kích thước. Cụ thể: chiều dài, khối lượng, thời gian, dòng điện, nhiệt độ, lượng chất (nốt ruồi) và cường độ sáng.
Điều này sẽ đủ đơn giản, nhưng có một số đơn vị dẫn xuất cũng như tỷ lệ mà chúng tôi thường sử dụng. Một đơn vị kết hợp ví dụ sẽ là Newton: kg * m / s^2
và một tỷ lệ ví dụ sẽ là tons / hr
.
Chúng tôi có một ứng dụng dựa nhiều vào các đơn vị ngụ ý. Chúng tôi sẽ nhúng các đơn vị trong tên biến hoặc cột. Nhưng điều này tạo ra vấn đề khi chúng ta cần chỉ định một đơn vị đo lường với các đơn vị khác nhau. Có, chúng tôi có thể chuyển đổi các giá trị ở đầu vào và hiển thị nhưng điều này tạo ra rất nhiều mã trên cao mà chúng tôi muốn gói gọn trong lớp của chính nó.
Có một số giải pháp trên codeplex và các môi trường hợp tác khác. Việc cấp phép cho các dự án là dễ chịu nhưng bản thân dự án thường kết thúc quá nhẹ hoặc quá nặng. Chúng tôi đang theo đuổi kỳ lân của riêng mình "vừa phải."
Lý tưởng nhất, tôi có thể định nghĩa một đơn vị đo lường mới bằng cách sử dụng một cái gì đó như thế này:
UOM myUom1 = UOM mới (10, vôn);
UOM myUom2 = UOM mới (43.2, Newton);
Tất nhiên, chúng tôi sử dụng kết hợp các đơn vị Imperial và SI dựa trên nhu cầu của khách hàng.
Chúng tôi cũng cần giữ cấu trúc các đơn vị này được đồng bộ hóa với bảng cơ sở dữ liệu trong tương lai để chúng tôi cũng có thể cung cấp cùng một mức độ nhất quán trong dữ liệu của mình.
Cách tốt nhất để xác định đơn vị, đơn vị dẫn xuất và tỷ lệ mà chúng ta cần sử dụng để tạo đơn vị lớp đo lường là gì? Tôi có thể thấy việc sử dụng một hoặc nhiều enum, nhưng điều đó có thể gây khó chịu cho các nhà phát triển khác. Một enum sẽ rất lớn với hơn 200 mục trong khi nhiều enum có thể gây nhầm lẫn dựa trên các đơn vị SI vs Imperial và phân tích bổ sung dựa trên việc phân loại chính đơn vị đó.
Ví dụ Enum cho thấy một số mối quan tâm của tôi:
myUnits.Volt
myUnits.Newton
myUnits.meterSIUnit.meter
ImpUnit. feet
DrvdUnit.Newton
DrvdUnitSI.Newton DrvdUnitImp.FtLbs
Tập hợp các đơn vị sử dụng của chúng tôi được xác định khá rõ và đó là một không gian hữu hạn. Chúng tôi cần khả năng mở rộng và thêm các đơn vị hoặc tỷ lệ dẫn xuất mới khi chúng tôi có nhu cầu của khách hàng đối với họ. Dự án là trong C # mặc dù tôi nghĩ rằng các khía cạnh thiết kế rộng hơn có thể áp dụng cho nhiều ngôn ngữ.
Một trong những thư viện tôi đã xem xét cho phép nhập đơn vị dạng tự do thông qua chuỗi. Lớp UOM của họ sau đó phân tích chuỗi và xiên các thứ tương ứng. Thách thức với cách tiếp cận này là nó buộc nhà phát triển phải suy nghĩ và ghi nhớ các định dạng chuỗi chính xác là gì. Và tôi có nguy cơ xảy ra lỗi / ngoại lệ thời gian chạy nếu chúng ta không thêm các kiểm tra bổ sung trong mã để xác thực các chuỗi được truyền trong hàm tạo.
Một thư viện khác về cơ bản đã tạo ra quá nhiều lớp mà nhà phát triển sẽ phải làm việc với. Cùng với một Đơn vị đo lường tương đương với nó cung cấp một DerivedUnit
và RateUnit
vân vân. Về cơ bản, mã quá phức tạp đối với các vấn đề chúng ta đang giải quyết. Thư viện đó về cơ bản sẽ cho phép mọi: mọi kết hợp (hợp pháp trong thế giới đơn vị) nhưng chúng tôi rất vui khi phạm vi vấn đề của chúng tôi (đơn giản hóa mã của chúng tôi) bằng cách không cho phép mọi kết hợp có thể.
Các thư viện khác rất đơn giản và thậm chí còn không xem xét quá tải toán tử.
Ngoài ra, tôi không lo lắng về các nỗ lực chuyển đổi không chính xác (ví dụ: vôn sang mét). Các nhà phát triển là những người duy nhất sẽ truy cập ở cấp độ này vào thời điểm này và chúng tôi không nhất thiết phải bảo vệ chống lại các loại sai lầm đó.