我在这里做了一些阅读(1,2),我想知道确保初始化期间提供的参数是否正确,违反了构造函数不应该工作的指导原则。
例如(Python):
class Employee:
def __init__(self, empFirstname, empLastname, empEmail):
self._validate_employee(empFirstname, "First Name")
self._validate_employee(empLastname, "Last name")
self._validate_employee(empEmail, "Email")
self._validate_email(empEmail, "Email")
self.empFirstname = empFirstname
self.empLastname = empLastname
self.empEmail = empEmail
@property
def email(self):
return self.empEmail
def _validate_employee(self, parameter, error_message):
if not parameter:
raise TypeError("{0} {1}" .format(error_message, "is missing"))
def _validate_email(self, email, parameter):
if "@" not in email or "." not in email:
raise TypeError("{0} {1}" .format(parameter, " is invalid"))
在我的示例中,我检查以确保名字和姓氏不是空白且电子邮件有效。我违反了指南吗?
更新 我不是在问它是否应该抛出,我问我是否违反了指南,即构造函数在验证我的参数时不应该工作。
答案 0 :(得分:0)
不,验证参数和输入对于包括构造函数在内的所有函数都至关重要。盲目地设置参数而不检查/错误处理可能会导致严重的问题,从意外的性能到恶意行为者以非预期的方式操纵程序的能力。
答案 1 :(得分:0)
提供满足某些条件的参数的要求是Design by Contract的一部分,即它对应于前提条件。客户端(在您的情况下为构造函数)应该保证参数符合预期。如果不是这种情况,供应商(在您的情况下为构造函数)无法确保在构造函数返回后生成的对象处于有效状态。在本地支持Design by Contract的语言中,可以将类不变量关联起来,表明名称不为空,电子邮件地址遵循命名约定。只有当传递给构造函数的参数有效时,才能实现这一点。
您提到的条件将被视为先决条件,并且可以根据软件开发过程中建立的策略打开或关闭。启用后,在执行实体之前,会在输入构造函数时检查它们。从这个角度来看,您的代码没有做任何额外的工作,但确保参数是正确的。在确保前提条件始终得到满足的程序验证之后,或者进行广泛的测试以使客户感觉不违反前提条件,可以禁用它们,从而删除任何额外的工作"。
总结: