เรากำลังใช้อัลกอริทึมมากมายซึ่งโดยทั่วไปจะมีพารามิเตอร์ที่แชร์สาธารณะรู้จักและความปลอดภัย
ปัจจุบันเราใช้คลาสที่เก็บพารามิเตอร์ทั้งหมดและวัตถุโกลบอลที่กำหนดไว้ล่วงหน้าสองรายการ:
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)
จากนั้นอัลกอริธึมนำPublicParams
วัตถุเป็นอาร์กิวเมนต์ที่เป็นค่าเริ่มต้นไปยังการผลิตpublicParams_secure
def AlgoOne(n, publicParams = publicParams_secure):
# do stuff with publicParams.p
# ...
AlgoTwo(x, publicParams)
และ
def AlgoTwo(x, publicParams= publicParams_secure):
# do stuff with publicParams.q
วิธีนี้เรายังสามารถฉีดพารามิเตอร์สาธารณะที่แตกต่างกันเพื่อการทดสอบหน่วยที่ง่ายขึ้น:
class AlgoOneTest(unittest.TestCase):
def test(self):
# compare with manually computed result
self.assertTrue(AlgoOne(1, publicParams_test) == 10)
สิ่งที่ฉันไม่ชอบเกี่ยวกับวิธีการนี้:
- การให้
publicParams
ค่าเริ่มต้นทำให้เป็นตัวเลือกเมื่อเรียกอัลกอริทึม อย่างไรก็ตามมันจะกลายเป็นเรื่องง่ายที่จะลืมผ่านมันเมื่อโทรAlgoTwo
จากภายในAlgoOne
ซึ่งจะส่งผลให้วัตถุที่แตกต่างกันสองถูกนำมาใช้ถ้าวัตถุทดสอบถูกส่งผ่านไปยังAlgoOne
มีวิธีที่ดีกว่าซึ่งมีแนวโน้มน้อยกว่า แต่ยังมีความยืดหยุ่นสำหรับการทดสอบหน่วย? นี่เป็นวิธีปฏิบัติที่ดีที่สุดจริง ๆ หรือ