TL; DR: boolean argümanlarını kullanmayın.
Neden kötü olduklarını ve nasıl değiştirileceğini (koyu renkte) aşağıya bakın .
Boolean argümanlarının okunması çok zor ve bu nedenle de sürdürülmesi zor. Asıl sorun, argümanın isimlendirildiği yöntem imzasını okuduğunuzda, amaç genellikle açıktır. Bununla birlikte, çoğu dilde bir parametrenin adlandırılması genellikle gerekli değildir. Böylece RSACryptoServiceProvider#encrypt(Byte[], Boolean)
, boolean parametresinin, fonksiyonda ne tür şifreleme kullanılacağını belirlediği gibi anti-paternlere sahip olacaksınız .
Böylece şöyle bir çağrı alacaksınız:
rsaProvider.encrypt(data, true);
Okuyucunun, sadece cehennemin ne true
anlama gelebileceğini belirlemek için yöntemin imzasını araması gerekir . Bir tamsayı geçmek elbette ki kötü:
rsaProvider.encrypt(data, 1);
size söyleyeceğim kadar çok - daha doğrusu: çok az. Tamsayı için kullanılacak sabitleri tanımlasanız bile, işlevin kullanıcıları basitçe bunları görmezden gelebilir ve değişmez değerleri kullanmaya devam edebilir.
Bunu çözmenin en iyi yolu bir numaralandırma kullanmaktır . RSAPadding
İki değeri olan bir enum geçmek zorunda kalırsanız : OAEP
veya PKCS1_V1_5
hemen kodu okuyabilirsiniz:
rsaProvider.encrypt(data, RSAPadding.OAEP);
Booleanların yalnızca iki değeri olabilir. Bu, üçüncü bir seçeneğiniz varsa, imzanızı yeniden düzenlemek zorunda kalacağınız anlamına gelir. Genel olarak, geriye dönük uyumluluk bir sorunsa, bu kolayca gerçekleştirilemez, bu nedenle herhangi bir genel sınıfı başka bir genel yöntemle genişletmeniz gerekir. Microsoft RSACryptoServiceProvider#encrypt(Byte[], RSAEncryptionPadding)
, bir boole yerine bir numaralandırma (veya en azından bir numaralandırmayı taklit eden bir sınıf) kullandıkları yeri tanıttıklarında nihayet yaptıkları buydu .
Parametrenin kendisinin parametrelenmesi gerektiğinde parametre olarak tam bir nesne veya arayüz kullanmak daha kolay olabilir . Yukarıdaki örnekte OAEP dolgusunun kendisi dahili olarak kullanılacak karma değerle parametrelendirilebilir. Şimdi 6 SHA-2 karma algoritması ve 4 SHA-3 karma algoritması olduğunu unutmayın; bu nedenle, parametreler yerine yalnızca tek bir sayma kullanırsanız sayma değerlerinin sayısı artabilir (bu, Microsoft'un öğreneceği bir sonraki şeydir. ).
Boolean parametreleri ayrıca yöntemin veya sınıfın iyi tasarlanmadığını gösterebilir. Yukarıdaki örnekte olduğu gibi: .NET dışındaki herhangi bir şifreleme kitaplığı, yöntem imzasında bir doldurma bayrağı kullanmaz.
Neredeyse tüm sevdiğim yazılım guruları boolean argümanlara karşı uyarıyorlar. Mesela Joshua Bloch, çok beğenilen kitabı "Effective Java" ile onlara karşı uyardı. Genelde onlar kullanılmamalıdır. Anlaşılması kolay bir parametre olması durumunda kullanılabileceğini iddia edebilirsiniz. Ancak o zaman bile: Bit.set(boolean)
Muhtemelen iki yöntem kullanılarak daha iyi uygulanır : Bit.set()
ve Bit.unset()
.
Doğrudan kodu yeniden aktive edemiyorsanız , en azından daha okunaklı hale getirmek için sabitleri tanımlayabilirsiniz :
const boolean ENCRYPT = true;
const boolean DECRYPT = false;
...
cipher.init(key, ENCRYPT);
şundan çok daha okunur:
cipher.init(key, true);
sahip olsanız bile:
cipher.initForEncryption(key);
cipher.initForDecryption(key);
yerine.