如何在后端DTO中存储用户选择的「过期日期/永不过期」选项?
优化CertificateAssignmentDto布尔字段的替代方案
针对你遇到的否定式布尔字段命名尴尬、反转逻辑不优雅的问题,这里提供几种更合理的替代方案:
方案一:使用密封类表达有效期状态
用Kotlin的密封类直接封装两种有效期场景,完全消除布尔字段的歧义,语义最清晰:
// 定义密封类表示两种有效期类型 sealed class Expiry { // 有过期日期的情况 data class ExpiresOn(val date: LocalDate) : Expiry() // 永不过期的情况 object NeverExpires : Expiry() } // 更新后的DTO data class CertificateAssignmentDto( val uuid: UUID?, val certificate: CertificateDto, val employeeId: UUID?, val issueDate: LocalDate, val expiry: Expiry // 替换原来的两个字段 )
处理逻辑时,用when语句分支判断,代码可读性极强,不会出现布尔值反转的混乱:
when (dto.expiry) { is Expiry.ExpiresOn -> handleExpiring(dto.expiry.date) Expiry.NeverExpires -> handleNeverExpiring() }
方案二:用null表示永不过期
去掉冗余的布尔字段,直接利用expirationDate的null值来代表“无过期日期”,符合Kotlin中null表示缺失值的设计习惯:
data class CertificateAssignmentDto( val uuid: UUID?, val certificate: CertificateDto, val employeeId: UUID?, val issueDate: LocalDate, val expirationDate: LocalDate? // null = 永不过期 )
前端交互上,用户勾选“无过期日期”时,清空日期选择器并禁用,提交时传null;选择具体日期则传对应LocalDate值。只需在DTO的注释或文档中明确说明expirationDate为null的含义即可,字段数量更少,逻辑更简洁。
方案三:使用枚举类定义有效期状态
用枚举替代布尔字段,语义明确且避免否定式命名:
enum class ExpiryStatus { EXPIRES, // 有过期日期 NEVER_EXPIRES // 无过期日期 } data class CertificateAssignmentDto( val uuid: UUID?, val certificate: CertificateDto, val employeeId: UUID?, val issueDate: LocalDate, val expirationDate: LocalDate?, val expiryStatus: ExpiryStatus )
注意需要添加校验逻辑,确保expiryStatus与expirationDate的一致性:比如expiryStatus为NEVER_EXPIRES时,expirationDate必须为null;expiryStatus为EXPIRES时,expirationDate不能为空。
内容的提问来源于stack exchange,提问作者ATW
相关产品推荐
相关产品推荐

