我在这里读了一些东西(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"))在我的例子中,我检查以确保名字和姓氏不是空白的,并且电子邮件是有效的。我违反了规定吗?
更新:我不是问它是否应该抛出,而是问我是否违反了构造函数在验证参数时不应该工作的准则。
发布于 2017-11-13 09:34:59
提供满足某些条件的参数的要求是按合同设计的一部分,即它对应于先决条件。客户端(在您的情况下是构造函数的客户端)应该保证参数是预期的。如果不是这种情况,则供应商(在您的案例中是构造函数)无法确保在构造函数返回后,结果对象处于有效状态。在本机支持Design契约的语言中,可以关联一个类不变式,说明名称不是空的,电子邮件地址遵循命名约定。这只能在传递给构造函数的参数有效时才能实现。
您提到的条件将作为先决条件编写,并且可以根据软件开发过程中建立的策略打开或关闭。当启用时,在构造函数的条目上检查它们,然后再执行它的实际主体。从这个角度来看,您的代码没有做任何额外的工作,但是要确保参数是正确的。经过确保始终满足先决条件的程序验证,或者经过广泛的测试,使人感觉到前提条件没有被客户违反,它们可以被禁用,从而删除任何“额外的工作”。
概括地说:
发布于 2017-11-13 00:29:28
否,验证参数和输入对于所有函数(包括构造函数)都是至关重要的。盲目设置参数而不检查/错误处理会导致严重问题,从意外的性能到恶意参与者以非预期的方式操作程序的能力。
https://stackoverflow.com/questions/47255548
复制相似问题