Stiamo implementando molti algoritmi che in genere hanno molti parametri condivisi, noti pubblicamente e rilevanti per la sicurezza.
Attualmente, usiamo semplicemente una classe che contiene tutti i parametri e due oggetti globali predefiniti:
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)
Gli algoritmi prendono quindi un oggetto PublicParams
come argomento che assume come valore predefinito publicParams_secure
produttivo
def AlgoOne(n, publicParams = publicParams_secure):
# do stuff with publicParams.p
# ...
AlgoTwo(x, publicParams)
e
def AlgoTwo(x, publicParams= publicParams_secure):
# do stuff with publicParams.q
In questo modo possiamo ancora iniettare diversi parametri pubblici per semplificare i test unitari:
class AlgoOneTest(unittest.TestCase):
def test(self):
# compare with manually computed result
self.assertTrue(AlgoOne(1, publicParams_test) == 10)
Ciò che non mi piace di questo approccio:
- Assegnare il
publicParams
a un valore predefinito lo rende facoltativo quando si chiama un algoritmo. Tuttavia, diventa facile dimenticare di passarlo quando si chiamaAlgoTwo
daAlgoOne
, il che comporterebbe l'utilizzo di due oggetti diversi se l'oggetto test è stato passato aAlgoOne
C'è un modo migliore che è meno incline ma offre comunque flessibilità per il test delle unità? È davvero una buona pratica?