你好,我是郑晔。
我在开篇词中提到,缺乏识别代码坏味道的感觉,这才让很多问题代码堂而皇之地留在了自己的眼皮底下。识别坏味道,单纯学理论是不够的,你得结合具体问题进行分析,所以我才在课程中加入了大量真实的代码案例,帮助你理解坏味道。当然,除此之外,你还要有足够多的练习。
为了让你能够深度地参与到这个专栏的学习中,代码能力得到有效提升,我准备了一个课前热身的环节:大家一起来写代码。
我们要编写一个待办事项管理的软件,你可以看我下面给出的需求,它是以命令行应用的方式存在的。
第一阶段:基本功能
- 添加 Todo 项。
todo add <item>
1. <item>
Item <itemIndex> added
- 完成 Todo 项。
todo done <itemIndex>
Item <itemIndex> done.
- 查看 Todo 列表,缺省情况下,只列出未完成的 Todo 项。
todo list
1. <item1>
2. <item2>
Total: 2 items
- 使用 all 参数,查看所有的 Todo 项。
todo list --all
1. <item1>
2. <item2>
3. [Done] <item3>
Total: 3 items, 1 item done
要求:
- Todo 项存储在本地文件中;
- Todo 项索引逐一递增。
第二阶段:支持多用户
- 用户登录。
todo login -u user
Password:
Login success!
- 用户退出。
todo logout
Logout success!
要求:
- 只能看到当前用户的 Todo 列表;
- 同一个用户的Todo 项索引逐一递增;
- 当前用户信息存储在配置文件中 ~/.todo-config。
第三阶段:支持 Todo 列表导入和导出
- Todo 列表导出。
todo export > todolist
- Todo 列表导入。
todo import -f todolist
第四阶段:支持数据库持久化
在配置文件中,配置数据库连接信息。
- 初始化数据库。
todo init
要求:
- 没有数据库的情况下,使用本地文件;
- 在有数据库的情况下,使用数据库;
- 在本地文件已经存在的情况,将本地信息导入到数据库中。
以上我给出的是最基本的需求,你可以根据自己的实际编码情况,适当补充一些细节,比如,相应的错误提示。
你可以用自己最熟悉的程序设计语言、按照自己最习惯的方式编写代码,并在 Github 上以公开仓库的方式提交自己的代码,将仓库链接贴在这节课的留言区下,我会顺着链接找到你的仓库,去查看你写的代码。
为了方便代码的阅读,请你按如下要求编写你的代码:
- 在项目的 README 文件中,写出如何构建和执行你的应用;
- 需求分成四个阶段,请你按顺序依次完成每个阶段的需求;
- 每完成一个阶段的代码,创建一个 tag,tag 名称分别为 todo-phase-1、todo-phase-2、todo-phase-3、todo-phase-4。
之所以要把需求分阶段,主要是方便大家参与,即便你时间有限,只写第一个阶段的代码,依然是一个完整的需求。学过《10x 程序员工作法》的同学都知道,任务分解是一个重要的工作原则,分阶段需求其实就是一种需求层面上的任务分解。
在专栏结束之前,我会专门制作一期加餐,点评大家的代码;同时,我也会选出代码写的最整洁的3位同学,送出价值149元的华为智能体脂电子称。

欢迎加入这次编码的训练中,期待你在留言区分享你的代码。
精选留言
2021-01-13 14:32:16
github地址:https://github.com/caitlingao/task_demo
交付内容包括:四个阶段的代码和每个阶段简单的开发分析设计文档
最近在学习Rust,所以尝试用Rust完成这次作业,断断续续用了一周多终于完成第一版,在第一版的基础上又重构了一版,这是重构后的第二版。
2021-01-12 17:27:25
https://github.com/front-end-captain/todo
2021-01-02 23:57:15
https://github.com/Jxin-Cai/ugly-code-work-jxin
2022-04-25 09:01:54
实现了老师说的四个阶段需求,我是按迭代的方式逐一开展的,四个阶段分别对应loop01-loop04 四个分支,采用了面向对象的风格,且由于每次迭代是在前一步的基础上,尽量遵守开闭原则去做,所以单看master分支,会有“历史包袱”的影子
项目的doc文件夹下,有每个阶段的需求和基本的设计,我在老师要求的基础上,对需求略有加码,如持久化,支持存储到mysql或redis,通过配置文件控制
2021-01-07 16:31:22
2022-05-25 20:53:17
2022-03-26 17:41:54
2021-08-20 17:47:08
第一版一个文件里写完了,重构了一版,真正理解了很多设计上带来的好处。
2021-04-01 18:32:26
2021-02-21 19:47:09
2021-02-08 09:17:55
目前完成了第一阶段。
2021-02-07 22:01:17
https://github.com/TaXueWWL/todo-board
2021-01-24 14:42:11
2021-01-14 11:41:52
https://github.com/kamjin1996/todo-manager
2021-01-13 15:14:08
2021-01-10 11:37:30
刚刚写完第一阶段
2021-01-05 20:48:45
第一阶段功能完成,Java实现
2021-01-04 12:00:57
第一阶段完成,以后一边听课 一边改。
2021-01-03 14:37:22
2020-12-30 17:46:31
https://github.com/liudaming/todo