TL; DR : 부울 인수를 사용하지 마십시오.
아래 참조 왜 그들이 나쁜, 그리고 방법을 대체 할 (굵게).
부울 인수는 읽기 어려우므로 유지하기가 어렵습니다. 주요 문제점은 인수의 이름이 지정된 메소드 서명을 읽을 때 일반적으로 목적이 명확하다는 것입니다. 그러나 대부분의 언어에서는 매개 변수 이름을 지정할 필요가 없습니다. 따라서 RSACryptoServiceProvider#encrypt(Byte[], Boolean)
부울 매개 변수가 함수에 사용될 암호화 종류를 결정하는 위치 와 같은 안티 패턴 이 있습니다.
따라서 다음과 같은 전화를받습니다.
rsaProvider.encrypt(data, true);
여기서 독자는 단순히 지옥의 true
실제 의미 를 결정하기 위해 메소드의 서명을 찾아야합니다 . 정수를 전달하는 것은 물론 나쁘다 :
rsaProvider.encrypt(data, 1);
당신에게 많은 것을 말해 줄 것입니다. 정수에 사용될 상수를 정의하더라도 함수 사용자는 단순히이를 무시하고 리터럴 값을 계속 사용할 수 있습니다.
이를 해결하는 가장 좋은 방법은 열거 형 을 사용하는 것 입니다. 당신이 열거를 전달해야하는 경우 RSAPadding
이 개 값 : OAEP
또는 PKCS1_V1_5
당신은 즉시 코드를 읽을 수있을 것입니다 :
rsaProvider.encrypt(data, RSAPadding.OAEP);
부울은 두 개의 값만 가질 수 있습니다. 즉, 세 번째 옵션이있는 경우 서명을 리팩터링해야합니다. 이전 버전과의 호환성이 문제인 경우 일반적으로이 작업을 쉽게 수행 할 수 없으므로 다른 공용 메서드를 사용하여 모든 공용 클래스를 확장해야합니다. Microsoft RSACryptoServiceProvider#encrypt(Byte[], RSAEncryptionPadding)
가 부울 대신 열거 형 (또는 열거 형을 모방하는 클래스)을 사용하는 위치 를 소개했을 때 Microsoft가 마침내 한 일입니다.
매개 변수 자체를 매개 변수화해야하는 경우 전체 오브젝트 또는 인터페이스 를 매개 변수 로 사용하는 것이 더 쉬울 수도 있습니다 . 위의 예에서 OAEP 패딩 자체는 내부적으로 사용하기 위해 해시 값으로 매개 변수화 될 수 있습니다. 이제 6 개의 SHA-2 해시 알고리즘과 4 개의 SHA-3 해시 알고리즘이 있으므로 매개 변수 대신 단일 열거 만 사용하면 열거 값의 수가 폭발 할 수 있습니다 (이것은 Microsoft가 다음에 알아낼 것입니다) ).
부울 매개 변수는 메소드 또는 클래스가 제대로 설계되지 않았 음을 나타낼 수도 있습니다. 위의 예와 같이 .NET 이외의 암호화 라이브러리는 메소드 서명에 패딩 플래그를 전혀 사용하지 않습니다.
내가 좋아하는 거의 모든 소프트웨어 전문가는 부울 인수에 대해 경고합니다. 예를 들어 Joshua Bloch는 "Effective Java"라는 저명한 저서에서 이에 대해 경고합니다. 일반적으로 단순히 사용해서는 안됩니다. 이해하기 쉬운 하나의 매개 변수가있는 경우 사용할 수 있다고 주장 할 수 있습니다. 그러나 그렇다하더라도 : Bit.set(boolean)
아마 더 나은 사용하여 구현 하는 두 가지 방법을 : Bit.set()
와 Bit.unset()
.
코드를 직접 리팩토링 할 수없는 경우 상수 를 정의 하여 최소한 더 읽기 쉽게 만들 수 있습니다.
const boolean ENCRYPT = true;
const boolean DECRYPT = false;
...
cipher.init(key, ENCRYPT);
다음보다 훨씬 더 읽기 쉽습니다.
cipher.init(key, true);
오히려 원하는 경우에도 :
cipher.initForEncryption(key);
cipher.initForDecryption(key);
대신에.