Hãy lấy một ví dụ khác ít gây khó khăn hơn với các khái niệm và kỳ vọng. Tôi đã có một enum ở đây, và đó là tập hợp các ưu tiên cho một lỗi.
Giá trị nào bạn đang lưu trữ trong cơ sở dữ liệu?
Vì vậy, tôi có thể được lưu trữ 'C'
, 'H'
, 'M'
, và 'L'
trong cơ sở dữ liệu. Hoặc 'HIGH'
và như vậy. Điều này có vấn đề về dữ liệu gõ nghiêm ngặt . Có một bộ giá trị hợp lệ đã biết và nếu bạn không lưu trữ bộ đó trong cơ sở dữ liệu, có thể khó làm việc với nó.
Tại sao bạn lưu trữ dữ liệu trong mã?
Bạn đã có List<String> priorities = {'CRITICAL', 'HIGH', 'MEDIUM', 'LOW'};
hoặc một cái gì đó để có hiệu lực trong mã. Điều đó có nghĩa là bạn đã có các ánh xạ khác nhau của dữ liệu này sang định dạng phù hợp (bạn đang chèn tất cả các giới hạn vào cơ sở dữ liệu, nhưng bạn đang hiển thị dưới dạng Critical
). Mã của bạn bây giờ cũng khó bản địa hóa. Bạn đã ràng buộc biểu diễn cơ sở dữ liệu của ý tưởng vào một chuỗi được lưu trữ trong mã.
Bất cứ nơi nào bạn cần truy cập vào danh sách này, bạn cần phải sao chép mã hoặc một lớp với một loạt các hằng số. Không phải trong số đó là lựa chọn tốt. Bạn cũng không nên quên rằng có những ứng dụng khác có thể sử dụng dữ liệu này (có thể được viết bằng các ngôn ngữ khác - ứng dụng web Java có hệ thống báo cáo Crystal Báo cáo được sử dụng và dữ liệu cung cấp công việc hàng loạt Perl vào dữ liệu đó). Công cụ báo cáo sẽ cần biết danh sách dữ liệu hợp lệ (điều gì xảy ra nếu không có gì được đánh dấu 'LOW'
ưu tiên và bạn cần biết rằng đó là ưu tiên hợp lệ cho báo cáo?), Và công việc hàng loạt sẽ có thông tin về những gì hợp lệ giá trị là.
Theo giả thuyết, bạn có thể nói "chúng tôi là một cửa hàng ngôn ngữ - mọi thứ đều được viết bằng Java" và có một .jar duy nhất chứa thông tin này - nhưng bây giờ điều đó có nghĩa là các ứng dụng của bạn được liên kết chặt chẽ với nhau và có chứa .jar dữ liệu. Bạn sẽ cần phát hành phần báo cáo và phần cập nhật hàng loạt cùng với ứng dụng web mỗi khi có thay đổi - và hy vọng rằng việc phát hành đó diễn ra suôn sẻ cho tất cả các phần.
Điều gì xảy ra khi sếp của bạn muốn một ưu tiên khác?
Ông chủ của bạn đến hôm nay. Có một ưu tiên mới - CEO
. Bây giờ bạn phải đi và thay đổi tất cả các mã và thực hiện biên dịch lại và triển khai lại.
Với cách tiếp cận 'enum-in-the-the', bạn cập nhật danh sách enum để có mức độ ưu tiên mới. Tất cả các mã có được danh sách kéo nó từ cơ sở dữ liệu.
Dữ liệu hiếm khi đứng một mình
Với các ưu tiên, các khóa dữ liệu vào các bảng khác có thể chứa thông tin về quy trình công việc hoặc ai có thể đặt mức độ ưu tiên này hoặc không có gì.
Quay trở lại giới tính như đã đề cập trong câu hỏi một chút: Giới tính có một liên kết đến các đại từ đang sử dụng: he/his/him
và she/hers/her
... và bạn muốn tránh mã hóa cứng vào chính mã. Và sau đó, sếp của bạn đến và bạn cần thêm bạn đã có 'OTHER'
giới tính (để đơn giản hóa) và bạn cần liên hệ giới tính này với they/their/them
... và sếp của bạn thấy những gì Facebook có và ... tốt, vâng.
Bằng cách giới hạn bản thân vào một bit dữ liệu được gõ theo chuỗi chứ không phải bảng enum, giờ đây bạn cần sao chép chuỗi đó trong một loạt các bảng khác để duy trì mối quan hệ này giữa dữ liệu và các bit khác.
Còn các kho dữ liệu khác thì sao?
Bất kể nơi nào bạn lưu trữ này, cùng một nguyên tắc tồn tại.
- Bạn có thể có một tập tin,
priorities.prop
có danh sách ưu tiên. Bạn đọc danh sách này từ một tập tin tài sản.
Bạn có thể có cơ sở dữ liệu lưu trữ tài liệu (như CouchDB ) có mục nhập enums
(và sau đó viết hàm xác thực bằng JavaScript ):
{
"_id": "c18b0756c3c08d8fceb5bcddd60006f4",
"_rev": "1-c89f76e36b740e9b899a4bffab44e1c2",
"priorities": [ "critical", "high", "medium", "low" ],
"severities": [ "blocker", "bad", "annoying", "cosmetic" ]
}
Bạn có thể có một tệp XML với một chút lược đồ:
<xs:element name="priority" type="priorityType"/>
<xs:simpleType name="priorityType">
<xs:restriction base="xs:string">
<xs:enumeration value="critical"/>
<xs:enumeration value="high"/>
<xs:enumeration value="medium"/>
<xs:enumeration value="low"/>
</xs:restriction>
</xs:simpleType>
Ý tưởng cốt lõi là như nhau. Kho lưu trữ dữ liệu chính là nơi danh sách các giá trị hợp lệ cần được lưu trữ và thi hành. Bằng cách đặt nó ở đây, sẽ dễ dàng hơn để suy luận về mã và dữ liệu. Bạn không phải lo lắng về việc kiểm tra phòng thủ những gì bạn có mỗi lần (đó là chữ hoa? Hoặc thấp hơn? Tại sao lại có một chritical
loại trong cột này? V.v ...) bởi vì bạn biết những gì bạn đang nhận được từ kho dữ liệu là chính xác những gì kho dữ liệu đang mong đợi bạn gửi khác - và bạn có thể truy vấn kho dữ liệu để biết danh sách các giá trị hợp lệ.
Mang đi
Tập hợp các giá trị hợp lệ là dữ liệu , không phải mã. Bạn làm cần phải phấn đấu cho DRY mã - nhưng vấn đề của sự trùng lặp là bạn đang sao chép các dữ liệu trong các mã, chứ không phải tôn trọng vị trí của nó như là dữ liệu và lưu trữ nó trong một cơ sở dữ liệu.
Nó giúp việc viết nhiều ứng dụng vào kho dữ liệu dễ dàng hơn và tránh có các trường hợp mà bạn sẽ cần triển khai mọi thứ được kết hợp chặt chẽ với chính dữ liệu - vì bạn chưa ghép mã của mình với dữ liệu.
Nó làm cho các ứng dụng thử nghiệm dễ dàng hơn vì bạn không phải kiểm tra lại toàn bộ ứng dụng khi CEO
mức độ ưu tiên được thêm vào - bởi vì bạn không có bất kỳ mã nào quan tâm đến giá trị thực sự của mức độ ưu tiên.
Có thể suy luận về mã và dữ liệu độc lập với nhau giúp tìm và sửa lỗi dễ dàng hơn khi thực hiện bảo trì.