Genellikle çok sayıda paylaşılan, halka açık ve güvenlikle ilgili parametreye sahip birçok algoritma uyguluyoruz.
Şu anda, tüm parametreleri ve önceden tanımlanmış iki global nesneyi içeren bir sınıf kullanıyoruz:
class PublicParams(object):
p = q = 0
def __init__(self, p, q):
self.p = p
self.q = q
# used for tests
publicParams_test = PublicParams(15,7)
# Some 2048 bit numbers for example
publicParams_secure = PublicParams(128378947298374928374,128378947298374928374)
Algoritmalar daha sonra PublicParams
nesneyi varsayılan olarak üretken olanpublicParams_secure
def AlgoOne(n, publicParams = publicParams_secure):
# do stuff with publicParams.p
# ...
AlgoTwo(x, publicParams)
ve
def AlgoTwo(x, publicParams= publicParams_secure):
# do stuff with publicParams.q
Bu şekilde, daha kolay birim testi için farklı genel parametreleri enjekte edebiliriz:
class AlgoOneTest(unittest.TestCase):
def test(self):
# compare with manually computed result
self.assertTrue(AlgoOne(1, publicParams_test) == 10)
Bu yaklaşımla ilgili sevmediğim şeyler:
publicParams
Varsayılan bir değer vermek, bazı algoritmaları çağırırken bu değeri isteğe bağlı hale getirir. Bununla birlikte,AlgoTwo
içeriden çağırırken geçmeyi unutmak kolaylaşırAlgoOne
, bu da test nesnesi geçilirse iki farklı nesnenin kullanılmasına neden olurAlgoOne
Daha az eğilimli ancak yine de birim testi için esneklik sunan daha iyi bir yol var mı? Bu gerçekten en iyi uygulama mı?