【问题标题】:Handling Errors best pratices in TypescriptTypescript 中处理错误的最佳实践
【发布时间】:2021-10-15 21:53:49
【问题描述】:

自从我阅读了几篇有关错误处理的文章后,我仍然想知道在值对象中的验证逻辑上抛出异常是否是不好的方法。例如,我在下面有这个类,它是值对象:

export class UserName {
  private readonly value: string;

  constructor(value: string) {
    this.value = this.evaluateName(value);
  }

  private evaluateName(value: string): string {
    value = value.trim();
    if (value === "") {
      throw new UserNameError("username is required!");
    }
    return value;
  }

  static userNameOf(name: string): UserName {
    return new UserName(name);
  }

  public isValidName(): boolean {
    if (!/^[a-zA-Z]+$/.test(this.value)) {
      throw new UserNameError("user name should contain only letter");
    }
    return true;
  }

}

那么,如果有最好的方法来处理错误而不是像我一样抛出错误。 谢谢:)

【问题讨论】:

    标签: typescript error-handling domain-driven-design value-objects


    【解决方案1】:

    使用值对象的好处之一是它们可以强制执行自己的不变量。遵循“始终有效”原则是个好主意,这意味着实体、聚合根和值对象永远不会处于违反其不变量的状态。

    因此,从值对象抛出异常是没有问题的。实际上,在您的示例中,它应该更严格。您目前可以创建一个无法通过 isValidName() 测试的用户名值对象,因为它在构建完成之前没有经过检查。

    我会重构这个:

    export class UserName {
      private readonly value: string;
    
      constructor(value: string) {
        trimmed: string;
        trimmed = value.trim();
        
        if (trimmed === "") {
           throw new UserNameError("Username is required!.");
        }
    
        if (!/^[a-zA-Z]+$/.test(trimmed)) {
          throw new UserNameError("user name should contain only letter");
        }    
    
        this.value = trimmed;
      }
    
      static userNameOf(name: string): UserName {
        return new UserName(name);
      }
    }
    

    【讨论】:

    • 太棒了!这似乎与你有关。但是我认为在向对象构造添加逻辑时这并不是一个真正的最佳实践(除非我错了)。我建议删除验证逻辑并使用类似这样的内容 ` static userNameOf(name:string):UserName { if(name === "") { throw new UserInputError("username is required!"); } 返回新的用户名(名称); }`。
    • 直接在构造函数中验证逻辑没有任何问题......如果所有验证始终适用。如果可能有两种不同的请求用户名的方式并且它们有不同的验证,那么在每个静态工厂方法中实现这些各自的验证然后调用单个构造函数(不验证)一次是有意义的所有参数都由静态工厂验证。但如果没有特殊情况,我就把它全部放在构造函数中。没有什么不好的做法。
    猜你喜欢
    • 1970-01-01
    • 2018-09-12
    • 2017-11-26
    • 1970-01-01
    • 1970-01-01
    • 2016-06-06
    • 1970-01-01
    • 1970-01-01
    • 2013-12-21
    相关资源
    最近更新 更多