首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Constructor和Constructor违反中的验证

Constructor和Constructor违反中的验证
EN

Stack Overflow用户
提问于 2017-11-13 00:26:05
回答 2查看 196关注 0票数 1

我在这里读了一些东西(12),我想知道是否确保初始化过程中提供的参数是正确的,这违反了构造函数不应该工作的准则。

例如(Python):

代码语言:javascript
复制
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"))

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

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-11-13 09:34:59

提供满足某些条件的参数的要求是按合同设计的一部分,即它对应于先决条件。客户端(在您的情况下是构造函数的客户端)应该保证参数是预期的。如果不是这种情况,则供应商(在您的案例中是构造函数)无法确保在构造函数返回后,结果对象处于有效状态。在本机支持Design契约的语言中,可以关联一个类不变式,说明名称不是空的,电子邮件地址遵循命名约定。这只能在传递给构造函数的参数有效时才能实现。

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

概括地说:

  • 示例中的“附加代码”是先决条件。
  • 先决条件是软件合同的一部分。
  • 根据采用的策略,可以启用或禁用对合同的检查,只要所有客户端保证前提条件不被违反,就可以安全地禁用它们,从而从构造函数(或任何其他软件组件)中删除任何“附加工作”。
票数 0
EN

Stack Overflow用户

发布于 2017-11-13 00:29:28

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47255548

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档