TL; DR: không sử dụng đối số boolean.
Xem bên dưới tại sao chúng xấu, và làm thế nào để thay thế chúng (trong khuôn mặt đậm).
Đối số Boolean rất khó đọc, và do đó khó duy trì. Vấn đề chính là mục đích nói chung là rõ ràng khi bạn đọc chữ ký phương thức trong đó đối số được đặt tên. Tuy nhiên, việc đặt tên cho một tham số thường không bắt buộc trong hầu hết các ngôn ngữ. Vì vậy, bạn sẽ có các kiểu chống giống như RSACryptoServiceProvider#encrypt(Byte[], Boolean)
nơi tham số boolean xác định loại mã hóa nào sẽ được sử dụng trong hàm.
Vì vậy, bạn sẽ nhận được một cuộc gọi như:
rsaProvider.encrypt(data, true);
trong đó người đọc phải tra cứu chữ ký của phương thức chỉ để xác định true
ý nghĩa thực sự của địa ngục . Truyền một số nguyên tất nhiên cũng tệ như vậy:
rsaProvider.encrypt(data, 1);
sẽ nói với bạn nhiều như vậy - hay đúng hơn: chỉ là ít thôi. Ngay cả khi bạn xác định các hằng số được sử dụng cho số nguyên thì người dùng của hàm có thể chỉ cần bỏ qua chúng và tiếp tục sử dụng các giá trị bằng chữ.
Cách tốt nhất để giải quyết điều này là sử dụng bảng liệt kê . Nếu bạn phải vượt qua một enum RSAPadding
với hai giá trị: OAEP
hoặc PKCS1_V1_5
ngay lập tức bạn sẽ có thể đọc mã:
rsaProvider.encrypt(data, RSAPadding.OAEP);
Booleans chỉ có thể có hai giá trị. Điều này có nghĩa là nếu bạn có tùy chọn thứ ba, thì bạn phải cấu trúc lại chữ ký của mình. Nói chung, điều này không thể được thực hiện dễ dàng nếu khả năng tương thích ngược là một vấn đề, vì vậy bạn phải mở rộng bất kỳ lớp công khai nào bằng một phương thức công khai khác. Đây là những gì Microsoft cuối cùng đã làm khi họ giới thiệu RSACryptoServiceProvider#encrypt(Byte[], RSAEncryptionPadding)
nơi họ đã sử dụng một bảng liệt kê (hoặc ít nhất là một lớp bắt chước một bảng liệt kê) thay vì boolean.
Thậm chí có thể dễ dàng hơn để sử dụng một đối tượng hoặc giao diện đầy đủ làm tham số, trong trường hợp chính tham số đó cần được tham số hóa. Trong ví dụ trên, phần đệm OAEP có thể được tham số hóa với giá trị băm để sử dụng nội bộ. Lưu ý rằng hiện có 6 thuật toán băm SHA-2 và 4 thuật toán băm SHA-3, vì vậy số lượng giá trị liệt kê có thể phát nổ nếu bạn chỉ sử dụng một phép liệt kê duy nhất thay vì tham số (đây có thể là điều tiếp theo Microsoft sẽ tìm ra ).
Các tham số Boolean cũng có thể chỉ ra rằng phương thức hoặc lớp không được thiết kế tốt. Như với ví dụ ở trên: bất kỳ thư viện mã hóa nào khác ngoài .NET không sử dụng cờ đệm trong chữ ký phương thức.
Hầu như tất cả các bậc thầy về phần mềm mà tôi thích đều cảnh báo chống lại các lập luận boolean. Chẳng hạn, Joshua Bloch cảnh báo chống lại họ trong cuốn sách được đánh giá cao "Java hiệu quả". Nói chung, chúng không nên được sử dụng. Bạn có thể lập luận rằng chúng có thể được sử dụng nếu trường hợp có một tham số dễ hiểu. Nhưng ngay cả sau đó: Bit.set(boolean)
có lẽ được thực hiện tốt hơn bằng cách sử dụng hai phương pháp : Bit.set()
và Bit.unset()
.
Nếu bạn không thể trực tiếp cấu trúc lại mã, bạn có thể xác định các hằng số để ít nhất làm cho chúng dễ đọc hơn:
const boolean ENCRYPT = true;
const boolean DECRYPT = false;
...
cipher.init(key, ENCRYPT);
dễ đọc hơn nhiều so với:
cipher.init(key, true);
ngay cả khi bạn muốn có:
cipher.initForEncryption(key);
cipher.initForDecryption(key);
thay thế.