TODO模板与已创建Todo:复用单一类型还是新建独立类型?
关于TODO模板与待办事项的类型设计最优方案
嘿,这个问题在做待办系统的时候真的挺常见的,咱们先拆解下你给出的两个方案,再聊聊更合适的思路~
先说说现有两个方案的问题
方案一:复用单一TODO类型
这种方式看似节省了代码,但实际上有不少隐患:
- 字段冗余:模板本身不需要
completed(模板没有完成状态)和templateId(模板自己就是模板源),这些字段对于模板来说是无效的,会增加数据存储和处理的复杂度。 - 语义模糊:靠
type字段区分“模板”和“普通待办”,后期如果要扩展多种模板类型或者普通待办的细分类型,这个type的含义会越来越混乱,维护起来容易出错。
方案二:独立定义模板与待办类型
这个方案比方案一靠谱很多,职责划分清晰,模板和待办的字段各归其位,但还有可以优化的地方:比如TODOTemplate里的templateType和templateText有点冗余,既然类型名称已经是TODOTemplate,直接叫type和text就足够清晰了,没必要加前缀。
更优的方案:接口/继承式设计
如果你的技术栈支持接口或类型继承(比如GraphQL的接口、TypeScript的接口/类继承),这才是更优雅的选择——既复用公共字段,又保持各自的职责独立性。
举个GraphQL的例子:
# 定义公共接口,包含模板和待办共有的字段 interface TODOItem { id: ID! text: String! type: String! } # 模板类型,实现公共接口,加上专属字段 type TODOTemplate implements TODOItem { id: ID! text: String! type: String! # 比如模板专属的属性:是否允许用户修改模板内容 isUserEditable: Boolean! } # 普通待办类型,实现公共接口,加上专属字段 type Todo implements TODOItem { id: ID! text: String! type: String! templateId: ID # 关联对应的模板ID completed: Boolean! } # 待办列表,分别管理普通待办和模板 type TODOList { id: ID! todos: [Todo!]! templates: [TODOTemplate!]! owner: String! }
这个方案的优势很明显:
- 职责清晰:模板和待办各自的字段只服务于自身,没有冗余数据。
- 扩展性强:以后要给模板加“默认提醒时间”,或者给待办加“截止日期”,直接在对应类型里加字段就行,完全不影响对方。
- 语义明确:从类型名称就能直接区分是模板还是普通待办,不用靠字段去猜,降低团队协作的沟通成本。
- 代码复用:公共字段在接口里定义一次,所有实现类型都能复用,避免重复代码。
如果你的技术栈不支持接口/继承,那优化后的方案二就是最优选择了:把TODOTemplate的字段改得简洁些,保持类型独立即可。
内容的提问来源于stack exchange,提问作者AlpacaGoesCrazy
相关产品推荐
相关产品推荐

