2000行代码 出自Michael Chen's Blog

看到一篇关于代码简洁性的文章,感觉作者在追求代码优质完美上有很深功力,我工作中会遇到很多精简代码,主要是利用一些c#新特性和一些重构思想,作者能如此清晰地写清楚代码简洁的效果来,让小弟很佩服。以下是其文章内容,博客出处是http://michael.nona.name/archives/2000-lines-of-code/

 

早在写《架构腐化之谜》的时候,我就意识到,造成架构腐化的根本原因是系统复杂度变大的必然趋势以及人类遗忘的天性。延缓项目腐化最好的方法,是根本不给腐化的机会。生活中,自然通风、阳光透亮、家具摆放合理的、不留死角的房间出现虫子的可能性很低;代码也一样,一份简单、符合直觉的代码,放在复杂度完全可控的代码库中,能够极大的降低学习的门槛以及避免腐化的可能。

包括自己在内,很多人当然以为这只是美好的想法。绝大多数开发者仅仅能尝到项目早期的甜头,在后期则进入了愈发沉重的深渊。对于文中所说的似乎只是一个遥不可及的想法。为了证明这个是否真的可行,从去年10月开始,我在自己的产品中进行了一个尝试:在保持功能正常增长的前提下,项目总体功能代码不超过2000行。

现在是什么情况呢?从去年10月到现在,git统计数据如下

414 files changed, 42824 insertions(+), 698 deletions(-)
430次总共提交
Code LOC: 1568     Test LOC: 799     Code to Test Ratio: 1:0.5

功能代码总共不超过1600行代码(当然未包含大量的CoffeeScript以及HTML/Sass代码),完成了大部分的核心业务逻辑。未来可见的功能也应该能够在400多行的空间里完成。系统中也存在不少能够提取为独立Gem的地方,可以继续进行隔离简化。

应该说得益于Ruby简洁的语法,以及在rubygems社区提供的各种高质量的gem,让以前不可想象的麻烦变得几行代码就能搞定。

我们得到了什么好处?今天新加入了一名程序员,花了点时间介绍产品背景之后,在不到2个小时的时间里,就完成了一个典型的功能。并且还顺带修正了一些代码上的Bug。

Rails固然是特例。但推广到其他的语言,只要遵循以下原则,应该是毫无问题的:

  • Don't Repeat Yourself - 绝对不要重新发明轮子。github上fork数量多的项目基本上已经相当成熟了。即便有问题,fork, fix, pull request的响应时间比以往任何一种方式都要迅速,还能回馈社区。
  • 遵循约定,遵循约定。在某个时候总忍不住自己写了类似于get 'cities/edit'在routes.rb中,但随着类似的代码越加越多,最终索性就变成了resources :cities. Rails是经过许多工程实践的框架,其中的最佳实践很多时候是经过验证的。对于其他技术框架也应该一样。有时候发现了异常情况,不要为这种异常情况特殊处理,约定化也许是更好的方案。
  • 隔离,隔离。凡是与核心业务无关的功能代码,在找不到开源替代的时候,想办法将其通用化。比如我们用到了解析openflights的机场数据。这部分与核心业务毫无关系,将其隔离为Gem,再引用,能够减少无关代码干扰,形成知识分界,对于专注了解系统有莫大好处。
  • 警惕未经使用的功能、代码、注释、甚至数据库字段。保持代码库总在最精简的状态下。

这个产品已经上线。在可见的未来,2000行的界限还是够用的。等到超过的那一天,我再写写看看。也许那一天可能永远都不会到来。

 

这个C++管理系统基本涵盖了“学生成绩管理系统”的所有功能,你可以从中借鉴到C++链表、类、封装、继承、文件操作、排序等等很多知识,极具借鉴意义,以下为本项目的功能介绍: 1. 建立文件 (1)可以使用默认文件名或指定文件名将记录存储到 (2)设置适当的标志位,作为对记录进操作的 (3)写同名文件将覆盖原来文件的 2.增加学生记录 (1) 可在已有记录后面追加新的记录 (2) 可以随时增加新的记录,它们仅保存在向量数组中 (3) 可以将一个文件读入,追加在已有记录之后 (4) 采取文件追加方式时,在没有保存到文件之前,将继续保持文件追加状态,以便实现连续追加操作方式 3. 新建学生信息文件 (1) 用来新建学生信息记录 (2) 如果已经有记录存在,可以覆盖原记录或者在原记录后面追加,也可以将原有记录信息保存 到一个指定文件,然后重新建立记录 (3) 给出相应的提示信息 4. 显示记录 (1) 如果没有记录可供显示,给出提示信息 (2) 可以随时显示内存中的记录 (3) 显示表头 5. 文件存储 (1) 可以按默认名字或指定名字存储记录文件 6. 读取文件 (1) 可以按默认名字或指定名字将记录文件读入内存 (2) 可以将指定或默认文件追加到现有记录的尾部 (3) 可以将文件连续追加到现有记录并更新记录中的“名次” 7. 删除记录 (1) 可以按“学号”、“姓名”或“名次”方式删除记录 (2) 标志将被删除的记录, 可以再次取消标志, 经确认后删除已经标志的记录(3) 如果记录是空表, 删除时应给出提示信息并返回主菜单 (4) 如果没有要删除的信息, 输出“没有找到”的信息 (5) 更新其他记录的名次 (6) 删除操作仅限于内存, 只有执存储操作时, 才能覆盖原记录 8. 修改记录 (1) 可以按“学号”、“姓名”或“名次”方式查找要修改的记录内容 (2) 给出将被修改记录的信息, 经确认后进修改 (3) 如果记录已经是空表,应给出提示信息并返回主菜单 (4) 如果没有找到需要修改的信息, 输出“没有找到”的信息 (5) 更新其他记录的名次 (6) 修改操作仅限于内存, 只有执存储操作时, 才能覆盖原记录 9. 查询记录 (1) 可以按“学号”、“姓名”或“名次”方式查询记录 (2) 能给出查询记录的信息 (3) 如果查询的信息不存在, 输出提示信息 10. 对记录进排序 (1) 可以按”学号”进升序和降序排列 (2) 可以按”姓名”进升序和降序排列 (3) 可以按”名次”进升序和降序排列 (4) 如果属于选择错误, 可以立即退出程序
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值