MST
星途 面试题库

面试题:TypeScript 封装性实现中的注意事项

在TypeScript开发中,封装性是重要特性。当你设计一个具有复杂业务逻辑的类时,为了确保封装性,在使用访问修饰符、属性和方法的设计上需要注意哪些方面?请结合实际项目场景进行说明,并指出可能出现的违反封装原则的常见错误。
15.8万 热度难度
前端开发TypeScript

知识考点

AI 面试

面试题答案

一键面试

使用访问修饰符

  1. private
    • 注意点:将类中不希望外部直接访问的属性和方法声明为 private。例如在一个电商系统的 User 类中,用户的密码属性 password 应设为 private,防止外部直接获取或修改密码。
    • 实际场景:在登录逻辑中,User 类可能有一个 authenticate 方法,该方法内部可以访问 privatepassword 属性进行密码验证,而外部代码无法直接访问 password
    • 错误示例:如果将 password 设为 public,任何外部代码都能获取和修改密码,严重违反封装原则,增加安全风险。
  2. protected
    • 注意点:用于类内部及子类访问。例如在一个游戏开发项目中,有一个 Character 基类,其中一些与角色基础状态相关的属性和方法(如生命值计算的内部逻辑方法)设为 protected,这样子类(如 WarriorMage 等角色子类)可以继承并根据自身需求扩展这些属性和方法,而外部代码无法直接访问。
    • 实际场景Warrior 子类可能需要基于 Character 类的 protected 方法来调整自身生命值恢复逻辑。
    • 错误示例:若错误地将这些本应在继承体系内使用的属性和方法设为 public,外部代码可能随意调用或修改,破坏类的内部逻辑一致性。
  3. public
    • 注意点:仅将需要暴露给外部使用的属性和方法设为 public。在一个文件管理系统的 File 类中,getName 方法用于获取文件名,可设为 public,方便外部代码获取文件名称信息。
    • 实际场景:当其他模块需要展示文件相关信息时,可通过调用 publicgetName 方法获取文件名。
    • 错误示例:如果将一些内部用于文件处理的临时状态变量设为 public,外部代码可能误操作改变其状态,导致文件处理逻辑出错。

属性和方法设计

  1. 属性
    • 注意点:属性应尽量保持简单和原子性,避免属性直接暴露复杂的内部状态。例如在一个图形绘制系统的 Shape 类中,Shape 类有一个表示位置的属性 position,应设计为一个简单的对象(如 {x: number, y: number}),而不是将 xy 的计算逻辑直接暴露在属性层面。
    • 实际场景:当需要移动 Shape 时,可以通过修改 position 属性,而不是直接操作复杂的位置计算逻辑。
    • 错误示例:若将复杂的位置计算逻辑(如涉及多个图形之间相对位置计算)直接放在属性的 getset 方法中,外部代码调用时难以理解和维护,违反封装原则。
  2. 方法
    • 注意点:方法应职责单一,一个方法只做一件事。例如在一个订单处理系统的 Order 类中,有 calculateTotalPrice 方法专门用于计算订单总价,validateOrder 方法专门用于验证订单的合法性。
    • 实际场景:在订单提交流程中,先调用 validateOrder 验证订单,再调用 calculateTotalPrice 计算总价。
    • 错误示例:如果将验证订单和计算总价的逻辑放在一个方法中,当需要单独验证订单或计算总价时,就会出现耦合问题,且违反了单一职责原则,破坏封装性。

常见违反封装原则错误总结

  1. 过度暴露内部状态:将本应是 privateprotected 的属性设为 public,导致外部代码可以随意访问和修改类的内部状态,破坏类的封装性和数据一致性。
  2. 方法职责不清晰:一个方法承担过多职责,方法内部逻辑复杂,导致难以理解、维护和复用,同时也使得外部调用者难以正确使用该方法,破坏了封装性。
  3. 属性设计不合理:属性过于复杂,将复杂计算逻辑或过多内部状态暴露在属性层面,外部代码在操作属性时容易引发不可预见的问题,破坏封装性。