Kiểm tra số giấy tờ là bài toán không có một đáp án chung, vì mỗi nước tự quyết định số định danh của mình dài bao nhiêu, gồm những ký tự nào, và có công bố thuật toán chữ số kiểm tra hay không. Có nước công bố đầy đủ, có nước chỉ quy định định dạng, và có nước không công bố đủ để bất kỳ ai ngoài cơ quan cấp số có thể kết luận. Đọc hết bài này, bạn sẽ biết vì sao một công cụ kiểm tra trung thực phải trả lời khác nhau cho từng nhóm, và vì sao việc tự gán một quốc gia cho chuỗi đầu vào là sai về nguyên tắc.
Vì sao mỗi nước công bố một mức thông tin khác nhau?
Số định danh là công cụ hành chính, và mức độ công khai của nó phụ thuộc vào lựa chọn chính sách của từng nước chứ không phụ thuộc vào kỹ thuật. Một số nước xem quy tắc cấu tạo số là thông tin công khai và in nó trong tài liệu hướng dẫn cho lập trình viên. Một số nước khác chỉ công bố hình thức bên ngoài, ví dụ số gồm mấy nhóm và ngăn cách bằng ký tự gì, mà không nói cách tính chữ số kiểm tra. Một số nước thậm chí không công bố gì ngoài ví dụ trên mẫu giấy tờ.
Vì mức công khai khác nhau, cùng một câu hỏi chuỗi này có đúng không sẽ có ba loại câu trả lời khác nhau tùy theo nước. Với nước thuộc nhóm thứ nhất, ta có thể tính và đối chiếu. Với nước thuộc nhóm thứ hai, ta chỉ xác nhận được định dạng. Với nước thuộc nhóm thứ ba, câu trả lời đúng nhất là nói rằng chưa có quy tắc nào để đối chiếu.
Đây cũng là lý do vì sao một công cụ kiểm tra không nên che giấu việc nó thiếu quy tắc. Nếu công cụ trả về một chữ không đạt cho một chuỗi thuộc nhóm thứ ba, người dùng sẽ tưởng số của mình sai và đi sửa một thứ vốn không sai. Sai sót đó do công cụ gây ra, không do dữ liệu.
Ba nhóm nước: có thuật toán, chỉ định dạng, và không đủ dữ liệu
| Nhóm | Điều công cụ biết | Kết luận khả dĩ | Cách trả lời đúng |
|---|---|---|---|
| Công bố thuật toán chữ số kiểm tra | Tập ký tự, độ dài, thuật toán | Hợp lệ hoặc không hợp lệ | Tính chữ số kiểm tra và so sánh |
| Chỉ quy định định dạng | Tập ký tự và độ dài | Chỉ định dạng | Nói rõ định dạng khớp, chưa xác nhận được gì thêm |
| Không đủ dữ liệu công khai | Gần như không có gì chắc chắn | Không có quy tắc | Nói thẳng là không có quy tắc để đối chiếu |
Ba nhóm này không cố định theo thời gian. Khi một nước công bố thêm tài liệu, một hệ thống có thể chuyển từ nhóm thứ ba lên nhóm thứ nhất, và các kết luận cũ cần được xem lại. Vì vậy bộ quy tắc nên được lưu như dữ liệu có phiên bản, chứ không nên viết cứng trong mã nguồn rồi để đó vài năm.
Một điểm nữa cần nhớ: ngay cả ở nhóm thứ nhất, kết luận chỉ nói về cấu trúc chuỗi. Việc số đó có được cấp thật hay không, và hiện có còn hiệu lực hay không, vẫn nằm ngoài phạm vi của mọi phép tính.
Một chuỗi có thể khớp quy tắc của nhiều nước
Các nước thiết kế hệ thống đánh số độc lập với nhau, nên việc các quy tắc chồng lên nhau là chuyện bình thường. Một chuỗi có độ dài và tập ký tự hợp với quy định của nước này hoàn toàn có thể hợp với quy định của nước khác. Nếu cả hai nước đều công bố thuật toán chữ số kiểm tra, chuỗi đó có thể đạt cả hai phép tính cùng lúc.
Trong tình huống đó, kết quả đúng là một danh sách các khả năng, kèm lý do vì sao mỗi khả năng khớp. Việc chọn sẵn một quốc gia và chỉ trả về kết quả của quốc gia đó là một phán đoán không có cơ sở trong dữ liệu đầu vào. Người dùng biết mình đang ở nước nào; hệ thống thì không biết, trừ khi người dùng nói ra.
Cách xử lý này cũng có lợi ích kỹ thuật. Khi mọi khả năng được kiểm tra độc lập, mỗi khả năng có trạng thái riêng, và trạng thái chỉ định dạng không bị trộn lẫn với trạng thái không hợp lệ. Còn khi gộp lại thành một kết quả duy nhất, bạn sẽ phải chọn một khả năng để đại diện, và mọi khả năng khác biến mất khỏi báo cáo.
Điều gì quyết định độ dài và tập ký tự?
Độ dài và tập ký tự của số định danh do từng nước quy định, và chúng phản ánh lịch sử hành chính của nước đó chứ không phản ánh một chuẩn quốc tế nào. Có hệ thống chỉ dùng chữ số. Có hệ thống dùng thêm chữ cái. Có hệ thống phân nhóm bằng ký tự ngăn cách khi in nhưng lưu trữ ở dạng liền mạch.
Vì vậy mọi bảng tra phải được tổ chức theo nước trước, rồi mới tới quy tắc. Nếu bạn tổ chức theo độ dài trước, bạn sẽ gặp những ô chứa nhiều nước khác nhau và không biết dùng quy tắc nào cho chúng. Cách tổ chức theo nước cũng giúp việc bổ sung một quốc gia mới trở thành một thao tác thêm dữ liệu, không phải một thao tác sửa logic.
Cần phân biệt rõ ba khái niệm thường bị gộp: tập ký tự cho phép, độ dài hợp lệ, và sự tồn tại của chữ số kiểm tra. Một chuỗi có thể đúng hai tiêu chí đầu mà không có tiêu chí thứ ba. Bài những số không có chữ số kiểm tra nói riêng về trường hợp này.
Vì sao không nên gắn quốc gia theo mặc định?
Vì mặc định là một giả định, và giả định đó có thể biến một kết quả đúng thành một kết luận sai. Một hệ thống đặt mặc định là nước của máy chủ sẽ trả lời sai cho mọi người dùng ở nơi khác. Một hệ thống đặt mặc định theo ngôn ngữ giao diện cũng vậy, vì ngôn ngữ và quốc gia cấp giấy tờ là hai chuyện khác nhau.
Cách làm an toàn hơn là để quốc gia trở thành một trường riêng, do người dùng chọn hoặc do hệ thống nguồn cung cấp, và khi thiếu trường đó thì liệt kê mọi khả năng thay vì đoán. Nếu buộc phải có một giá trị mặc định để giao diện gọn, hãy để mặc định đó ảnh hưởng tới thứ tự hiển thị chứ không ảnh hưởng tới kết luận.
Bạn có thể quan sát cách trình bày nhiều khả năng song song trên công cụ kiểm tra số của trang này, nơi mỗi hệ thống khớp được hiển thị thành một dòng riêng kèm lý do.
Phần dành cho nhà phát triển: lưu bộ quy tắc như dữ liệu
Bài học lớn nhất khi làm việc với số định danh đa quốc gia là đừng mã hóa tri thức pháp lý vào mã nguồn. Hãy coi bộ quy tắc là dữ liệu có phiên bản, có nguồn tham chiếu và có ngày hiệu lực.
- Mỗi quốc gia là một bản ghi riêng, gồm tập ký tự, độ dài hợp lệ và tên thuật toán chữ số kiểm tra nếu có. Trường tên thuật toán để trống chính là cách biểu diễn nhóm chỉ định dạng.
- Kiểm tra độ dài trên chuỗi đã chuẩn hóa, sau khi bỏ mọi ký tự ngăn cách. Đếm trước khi bỏ sẽ cho ra kết quả sai một cách có hệ thống.
- Cho phép một bản ghi có nhiều phương án độ dài, vì nhiều hệ thống chấp nhận nhiều dạng viết khác nhau cho cùng một loại số.
- Ghi lại nguồn và ngày cập nhật cho từng bản ghi. Khi có tranh chấp, đây là thứ duy nhất giúp bạn giải thích vì sao hệ thống kết luận như vậy vào thời điểm đó.
- Viết kiểm thử theo từng quốc gia, mỗi quốc gia có ca đúng, ca sai định dạng và ca không có quy tắc. Ba ca này phủ hết các nhánh logic quan trọng.
- Không suy ra quốc gia từ một trường khác trong biểu mẫu nếu người dùng chưa xác nhận. Một địa chỉ giao hàng không phải là bằng chứng về nơi cấp giấy tờ.
Nếu bộ quy tắc được lưu đúng cách, việc thêm một quốc gia mới sẽ không cần chạm vào bất kỳ dòng logic nào.
Việc nên làm sau bài này
Hãy lấy ba chuỗi thử, một cho mỗi nhóm nước nói trên, rồi kiểm tra xem hệ thống của bạn có trả về ba loại kết luận khác nhau hay không. Nếu cả ba đều trả về cùng một câu, thiết kế của bạn đang thiếu ít nhất một trạng thái. Để đi sâu vào một trường hợp cụ thể có hai chữ số kiểm tra, bài kiểm tra CPF CNPJ: hai loại số thuế Brazil trình bày chi tiết cho hai loại số thuế của một quốc gia. Nếu bạn cần xử lý các chuỗi không có thuật toán nào để chạy, bài những số không có chữ số kiểm tra là phần tiếp theo phù hợp. Và nếu dữ liệu của bạn gắn với địa chỉ, số điện thoại ở nhiều nước, bài kiểm thử địa chỉ và số điện thoại quốc tế có thêm ví dụ cùng chủ đề.
Mọi chuỗi số trong bài đều là giá trị được dựng riêng cho việc giải thích cách phân nhóm quy tắc; chúng không phải giấy tờ của bất kỳ người nào có thật, không thuộc bất kỳ cơ quan cấp nào, và không được dùng để mạo danh hay để khẳng định một con số là dùng được.