TL; DR:ブール引数を使用しないでください。
それらが悪い理由と、それらを交換する方法を以下に示します(太字)。
ブール引数は非常に読みにくいため、保守が困難です。主な問題は、引数に名前が付けられているメソッドシグネチャを読み取ると、目的が一般に明確になることです。ただし、ほとんどの言語では、通常、パラメーターに名前を付ける必要はありません。したがってRSACryptoServiceProvider#encrypt(Byte[], Boolean)
、ブール型パラメーターが関数で使用される暗号化の種類を決定するようなアンチパターンがあります。
したがって、次のような呼び出しが行われます。
rsaProvider.encrypt(data, true);
読者は、単に地獄true
が実際に何を意味するかを判断するために、メソッドの署名を検索する必要があります。整数を渡すのはもちろん悪いことです。
rsaProvider.encrypt(data, 1);
同じくらい-またはむしろ:少しだけ教えてくれます。整数に使用する定数を定義した場合でも、関数のユーザーはそれらを単に無視してリテラル値を使用し続けることができます。
これを解決する最良の方法は、列挙を使用することです。RSAPadding
2つの値を持つ列挙型を渡す必要がある場合:OAEP
またはPKCS1_V1_5
、すぐにコードを読み取ることができます:
rsaProvider.encrypt(data, RSAPadding.OAEP);
ブール値には2つの値しか指定できません。つまり、3番目のオプションがある場合は、署名をリファクタリングする必要があります。一般に、後方互換性が問題になる場合、これは簡単に実行できないため、パブリッククラスを別のパブリックメソッドで拡張する必要があります。これはRSACryptoServiceProvider#encrypt(Byte[], RSAEncryptionPadding)
、ブールの代わりに列挙(または、少なくとも列挙を模倣するクラス)を使用する場所を導入したときにMicrosoftが最終的に行ったことです。
パラメーター自体をパラメーター化する必要がある場合、パラメーターとして完全なオブジェクトまたはインターフェイスを使用する方が簡単な場合もあります。上記の例では、OAEPパディング自体をハッシュ値でパラメーター化して、内部で使用できます。現在、6つのSHA-2ハッシュアルゴリズムと4つのSHA-3ハッシュアルゴリズムがあるため、パラメーターではなく単一の列挙のみを使用すると、列挙値の数が爆発する可能性があることに注意してください)。
ブールパラメータは、メソッドまたはクラスが適切に設計されていないことを示す場合もあります。上記の例と同様に、.NET以外の暗号化ライブラリは、メソッドシグネチャでパディングフラグをまったく使用しません。
私が好きなほとんどすべてのソフトウェアの達人は、ブール引数に対して警告します。たとえば、Joshua Blochは高く評価されている「Effective Java」の本で彼らに警告しています。一般に、それらは単に使用されるべきではありません。理解しやすいパラメータが1つある場合に使用できると主張できます。しかし、その後も:Bit.set(boolean)
おそらくより良い使用して実装された2つのメソッドを: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);
代わりに。