Bạn sẽ phá vỡ nguyên tắc DRY khi đưa logic xác thực đó vào mọi nơi sử dụng mã zip.
Mặt khác, khi giao dịch với nhiều quốc gia khác nhau và các hệ thống mã zip khác nhau của họ, điều đó có nghĩa là bạn không thể xác thực mã zip trừ khi bạn biết quốc gia đó. Vậy bạnZipCode
lớp học cũng cần phải lưu trữ đất nước.
Nhưng sau đó, bạn có lưu trữ riêng quốc gia như là một phần của Address
(mà mã zip cũng là một phần của) và một phần của mã zip (để xác thực) không?
- Nếu bạn làm thế, bạn cũng đang vi phạm DRY. Ngay cả khi bạn không gọi đó là vi phạm DRY (vì mỗi trường hợp phục vụ một mục đích khác nhau), thì vẫn không cần chiếm thêm bộ nhớ, trên cùng là mở cửa cho các lỗi khi hai giá trị quốc gia khác nhau (mà chúng không bao giờ hợp lý được).
- Hoặc, thay vào đó, điều đó dẫn đến việc bạn cần đồng bộ hóa hai điểm dữ liệu để đảm bảo rằng chúng luôn giống nhau, điều này cho thấy rằng bạn thực sự nên lưu trữ dữ liệu này trong một điểm duy nhất, do đó đánh bại mục đích.
- Nếu bạn không, thì đó không phải là một
ZipCode
lớp mà là một Address
lớp, một lần nữa sẽ chứa một string ZipCode
điều đó có nghĩa là chúng ta đã đến vòng tròn đầy đủ.
Ví dụ: tôi có thể nói chuyện với một nhà phân tích kinh doanh về Mã bưu điện thay vì một chuỗi chứa mã bưu điện.
Lợi ích là bạn có thể nói về họ khi mô tả mô hình miền.
Tôi không hiểu khẳng định cơ bản của bạn rằng khi một phần thông tin có một loại biến nhất định, thì bằng cách nào đó bạn bắt buộc phải đề cập đến loại đó bất cứ khi nào bạn nói chuyện với một nhà phân tích kinh doanh.
Tại sao? Tại sao bạn không thể chỉ đơn giản nói về "mã zip" và bỏ hoàn toàn loại cụ thể? Bạn đang có loại thảo luận nào với nhà phân tích doanh nghiệp (không phải kỹ thuật!) Trong đó loại tài sản là tinh túy cho cuộc trò chuyện?
Tôi đến từ đâu, mã bưu điện luôn là số. Vì vậy, chúng tôi có một sự lựa chọn, chúng tôi có thể lưu trữ nó như một int
hoặc như một string
. Chúng tôi có xu hướng sử dụng một chuỗi vì không có kỳ vọng về các phép toán trên dữ liệu, nhưng không bao giờ có một nhà phân tích kinh doanh nói với tôi rằng nó cần phải là một chuỗi. Quyết định đó thuộc về nhà phát triển (hoặc được cho là nhà phân tích kỹ thuật, mặc dù theo kinh nghiệm của tôi, họ không trực tiếp đối phó với sự cặn bã của nitty).
Một nhà phân tích kinh doanh không quan tâm đến loại dữ liệu, miễn là ứng dụng làm những gì nó dự kiến sẽ làm.
Xác nhận là một con thú khó khăn để giải quyết, bởi vì nó dựa vào những gì con người mong đợi.
Đối với một người, tôi không đồng ý với lập luận xác thực là một cách để cho thấy tại sao nên tránh sự ám ảnh nguyên thủy, bởi vì tôi không đồng ý rằng dữ liệu (như một sự thật phổ quát) luôn luôn cần được xác thực.
Ví dụ, nếu đây là một tra cứu phức tạp hơn thì sao? Thay vì kiểm tra định dạng đơn giản, điều gì xảy ra nếu xác thực của bạn đòi hỏi phải liên hệ với API bên ngoài và chờ phản hồi? Bạn có thực sự muốn buộc ứng dụng của mình gọi API bên ngoài này cho mọi ZipCode
đối tượng bạn khởi tạo không?
Có lẽ đó là một yêu cầu kinh doanh nghiêm ngặt, và sau đó tất nhiên là hợp lý. Nhưng đây không phải là một sự thật phổ quát. Sẽ có rất nhiều trường hợp sử dụng trong đó đây là một gánh nặng nhiều hơn là một giải pháp.
Ví dụ thứ hai, khi nhập địa chỉ của bạn dưới dạng, việc nhập mã bưu điện trước quốc gia của bạn là điều phổ biến. Mặc dù thật tuyệt khi có phản hồi xác thực ngay lập tức trong giao diện người dùng, nhưng thực sự nó sẽ gây trở ngại cho tôi (với tư cách là người dùng) nếu ứng dụng cảnh báo tôi về định dạng mã zip "sai", vì nguồn gốc thực sự của vấn đề là (ví dụ) Quốc gia của tôi không phải là quốc gia được chọn theo mặc định và do đó, xác thực đã xảy ra cho quốc gia sai.
Đó là thông báo lỗi sai, làm mất tập trung người dùng và gây nhầm lẫn không cần thiết.
Giống như cách xác nhận vĩnh viễn không phải là một sự thật phổ quát, cũng không phải là ví dụ của tôi. Đó là bối cảnh . Một số miền ứng dụng yêu cầu xác thực dữ liệu trên hết. Các tên miền khác không đặt xác thực cao trong danh sách ưu tiên vì rắc rối mà nó mang lại mâu thuẫn với các ưu tiên thực tế của chúng (ví dụ: trải nghiệm người dùng hoặc khả năng lưu trữ dữ liệu ban đầu bị lỗi để có thể sửa chữa thay vì không bao giờ cho phép được lưu trữ)
Ngày sinh: Kiểm tra xem lớn hơn ngày và ít hơn ngày hôm nay.
Mức lương: Kiểm tra xem lớn hơn hoặc bằng không.
Vấn đề với các xác nhận này là chúng không đầy đủ, dư thừa hoặc chỉ ra một vấn đề lớn hơn nhiều .
Kiểm tra rằng một ngày lớn hơn tâm trí là dư thừa. Tâm trí theo nghĩa đen có nghĩa là nó là ngày nhỏ nhất có thể. Bên cạnh đó, bạn vẽ đường liên quan ở đâu? Điểm nào trong việc ngăn chặn DateTime.MinDate
nhưng cho phép DateTime.MinDate.AddSeconds(1)
? Bạn đang chọn một giá trị cụ thể không đặc biệt sai so với nhiều giá trị khác.
Sinh nhật của tôi là ngày 2 tháng 1 năm 1978 (không phải vậy, nhưng giả sử là vậy). Nhưng hãy nói rằng dữ liệu trong ứng dụng của bạn là sai và thay vào đó nó nói ngày sinh nhật của tôi là:
- Ngày 1 tháng 1 năm 1978
- Ngày 1 tháng 1 năm 1722
- Ngày 1 tháng 1 năm 2355
Tất cả những ngày này là sai. Không ai trong số họ là "đúng" hơn người khác. Nhưng quy tắc xác nhận của bạn sẽ chỉ bắt được một trong ba ví dụ này.
Bạn cũng đã hoàn toàn bỏ qua bối cảnh về cách bạn đang sử dụng dữ liệu này. Nếu điều này được sử dụng trong ví dụ bot nhắc nhở sinh nhật, tôi sẽ nói việc xác nhận là vô nghĩa vì không có hậu quả xấu đặc biệt nào trong việc điền sai ngày.
Mặt khác, nếu đây là dữ liệu của chính phủ và bạn cần ngày sinh để xác thực danh tính của ai đó (và không làm như vậy dẫn đến hậu quả xấu, ví dụ như từ chối an ninh xã hội của ai đó), thì tính chính xác của dữ liệu là tối quan trọng và bạn cần phải hoàn toàn xác thực dữ liệu. Xác nhận đề xuất mà bạn có bây giờ là không đầy đủ.
Đối với một mức lương, có một số ý nghĩa phổ biến ở chỗ nó không thể âm. Nhưng nếu bạn thực sự mong đợi rằng dữ liệu vô nghĩa đang được nhập vào, tôi sẽ đề nghị bạn điều tra nguồn gốc của dữ liệu vô nghĩa này. Bởi vì nếu họ không thể tin tưởng để nhập dữ liệu nhạy cảm, bạn cũng không thể tin tưởng họ nhập dữ liệu chính xác .
Nếu thay vào đó, tiền lương được tính theo ứng dụng của bạn và bằng cách nào đó có thể kết thúc bằng số âm (và chính xác)), thì cách tiếp cận tốt hơn là làm gì Math.Max(myValue, 0)
để biến số âm thành 0, thay vì không xác thực. Bởi vì nếu logic của bạn quyết định rằng kết quả là một số âm, việc không xác thực có nghĩa là nó sẽ phải làm lại phép tính và không có lý do gì để nghĩ rằng nó sẽ đưa ra một số khác vào lần thứ hai.
Và nếu nó xuất hiện với một số khác, điều đó một lần nữa khiến bạn nghi ngờ rằng phép tính không nhất quán và do đó không thể tin cậy được.
Điều này không có nghĩa là xác nhận không hữu ích. Nhưng xác nhận vô nghĩa là xấu, cả hai vì nó cần nỗ lực trong khi không thực sự giải quyết vấn đề và mang lại cho mọi người cảm giác an toàn sai lầm.