类设计抉择:Connection类应关联VerificationCode还是直接嵌入其字段?
面向对象设计:保留
VerificationCode类还是合并字段到Connection类? 先明确两种实现方案的代码结构:
选项1:保留VerificationCode类
class VerificationCode { code: string; expiresAt: number; } class Connection { a: string; verificationCode: VerificationCode; }
选项2:合并字段到Connection类
class Connection { a: string; code: string; expiresAt: number; }
选项1(保留独立类)的优缺点
优点
- 语义清晰:
code和expiresAt被封装在同一个类里,明确体现二者属于「验证码」这一业务概念,代码可读性更强,其他开发者一眼就能理解这两个字段的关联。 - 复用性高:如果后续系统里其他模块(比如用户登录、邮箱验证)需要用到验证码结构,可以直接复用
VerificationCode类,不用重复定义字段,减少代码冗余。 - 扩展性好:后续要给验证码加新属性(比如发送渠道
sendChannel)或方法(比如判断是否过期的isExpired()),直接在VerificationCode类里修改即可,不会污染Connection类的职责,符合单一职责原则。 - 维护便捷:所有和验证码相关的逻辑都集中在一个类里,修改时不用在多个地方查找相关代码,降低维护成本。
缺点
- 轻微冗余:对于极简单的业务场景(比如
Connection是唯一用到验证码的地方),单独定义类会增加类的数量,显得有点过度设计。 - 嵌套访问:获取验证码属性时需要多一层调用(比如
connection.verificationCode.code),比直接访问字段稍显繁琐。
选项2(合并字段)的优缺点
优点
- 结构简洁:类的数量更少,没有额外的嵌套层级,代码看起来更清爽,适合非常简单的业务场景。
- 访问直接:可以直接通过
connection.code、connection.expiresAt访问属性,减少调用层级。
缺点
- 语义模糊:单独的
code和expiresAt字段无法直观体现它们的业务关联,当Connection类字段增多时,很容易混淆这些字段的用途,降低代码可读性。 - 无法复用:如果其他模块需要验证码结构,只能重复定义相同的字段,造成代码冗余。
- 扩展性差:后续要给验证码加属性或方法时,只能在
Connection类里添加,会让Connection类承担过多不属于它的职责,违背单一职责原则,久而久之会变成臃肿的“大杂烩类”。 - 维护困难:验证码相关逻辑分散在
Connection类中,后续修改时需要在Connection里查找相关代码;如果多个类都重复定义了这些字段,修改成本会成倍增加。
内容的提问来源于stack exchange,提问作者Maor agai
相关产品推荐
相关产品推荐

