构造函数和构造函数违例中的验证

时间:2017-11-13 00:26:05

标签: oop constructor language-agnostic

我在这里做了一些阅读(12),我想知道确保初始化期间提供的参数是否正确,违反了构造函数不应该工作的指导原则。

例如(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"))

在我的示例中,我检查以确保名字和姓氏不是空白且电子邮件有效。我违反了指南吗?

更新 我不是在问它是否应该抛出,我问我是否违反了指南,即构造函数在验证我的参数时不应该工作。

2 个答案:

答案 0 :(得分:0)

不,验证参数和输入对于包括构造函数在内的所有函数都至关重要。盲目地设置参数而不检查/错误处理可能会导致严重的问题,从意外的性能到恶意行为者以非预期的方式操纵程序的能力。

答案 1 :(得分:0)

提供满足某些条件的参数的要求是Design by Contract的一部分,即它对应于前提条件。客户端(在您的情况下为构造函数)应该保证参数符合预期。如果不是这种情况,供应商(在您的情况下为构造函数)无法确保在构造函数返回后生成的对象处于有效状态。在本地支持Design by Contract的语言中,可以将类不变量关联起来,表明名称不为空,电子邮件地址遵循命名约定。只有当传递给构造函数的参数有效时,才能实现这一点。

您提到的条件将被视为先决条件,并且可以根据软件开发过程中建立的策略打开或关闭。启用后,在执行实体之前,会在输入构造函数时检查它们。从这个角度来看,您的代码没有做任何额外的工作,但确保参数是正确的。在确保前提条件始终得到满足的程序验证之后,或者进行广泛的测试以使客户感觉不违反前提条件,可以禁用它们,从而删除任何额外的工作"。

总结:

  • "附加代码"在你的例子中是先决条件
  • 先决条件是软件合同的一部分
  • 根据所采用的政策,可以启用或禁用合同检查,一旦所有客户保证永远不会违反前提条件,就可以安全地禁用它们,从而删除任何额外的工作"来自构造函数(或任何其他软件组件)