"简单设计"的一点思考

简单设计是Xp技术实践中开发实践的核心实践,“简单也是价值观中智力色彩最强烈的”,然而,提到简单设计,大家更觉得像原则或者价值观,感觉上还是比较泛,我们不妨从下面的几个角度看一下
 
1. 为什么要简单设计
<1>. 简单的代码更容易读懂。
<2>. 好的设计更能应对变化。
 
这两点是基于成本和收益考虑的,这里的价值是时间及金钱。更快的满足需求,减少复杂带来的故障排查、修复成本,代码大量修改或者重写成本。
 
2. 什么是简单设计
对一个团队来讲,简单设计就是团队中每个人都能轻松的读懂代码,并且代码层次清晰,文件、类、函数都比较独立,面对不断增加的需求,容易扩展。
简单意味着优雅。真正的做到简单,往往是比较困难的。因为本质往往隐藏在复杂表象的后面,需要深入的思考,才能找到。记得一位大牛解释时,借用了“念念不忘,必有回响”。一个漂亮模型的抽象,往往是深入思考后的产物。
设计更多的是在进行演进式设计。面对一个复杂的,需求不断变化的系统,首先,我们承认我们是不完美的(这点很重要,我们把重心转移到寻找更好的设计上,而不是比较某个人有多牛),我们不相信一步可以设计出一个完美无缺的模型。我们只要求设计在当前的需求下是简单的,我们遵循一些原则(后面会提到),当需求不断增加时,不断重构自己的设计,保持设计简单性,直到满足所有需求。
 
3. 简单设计的原则
Kent beck的简单设计四原则
<1>. Runs all the tests
<2>. No duplication
<3>. Expresses developer intent
<4>. Minimizes the number of classes and methods
 
Kent beck认为以上四点的可验证性及重要程度都是依次降低,我们逐个分析一下:
1>. 通过所有测试:至少有两个意思,系统必须有完备的自动化测试(不自动化你如何“Runs”);所有的测试都验证通过,保证系统正确。
正确性永远是所有设计的基础。假如我们都是技艺超群的雕刻师,客户需要一匹狼,我们雕刻出一只狗,无论多么惟妙惟肖,对于客户可能都一文不值。
自动化测试在不同时期发挥不同作用。首先,自动化测试在产品研发的不同时期,价值是不相同的。在编码初期,测试用例可以帮我们发现大量低级故障,可以大大缩短真实环境调试的时间。其次,在代码维护阶段,完备的测试可以为你的大胆重构提供保护,持续的重构才能真正的保持设计的持续的简单。
 
2>. 没有重复: 重复是万恶之源,相信大家都有比较深刻的认识。客观来讲,这一点却是非常难以达到的。因为重复除了显而易见、赤裸裸的躺在哪儿的外,还有很多变体,比如:算法重复、功能重复、结构重复等。做到没有重复,至少需要两方面的功力:识别出;消除它。识别需要有比较好的嗅觉,能够嗅到代码中的坏味道;消除的方法较多,可以使用继承、多态、模板、宏等手段消除,需要根据具体的场景平衡使用,这点也考验开发人员背上的工具箱里,到底有多少工具。另外,《CleanCode》中推荐大家写小的函数,小类,其实我们完全没有必要刻意而为之,消除重复,函数与类自然变小。
 
3>. 表达作者的意图:是从代码的可理解性上着手的。有一些统计数据说代码写的时间与读的时间的比例大概为1:10。代码更多的是写给人看的,代码写的越容易理解,就越能节省读代码花费的时间,从而减少缺陷和沟通成本,缩减维护成本。好的意图可以通过好的命名、清晰的代码风格、良好的测试用例(用例即文档)等手段达到,然而关键的却是在乎:对自己手艺的在乎,对别人读代码时的关心。
 
4>. 尽量少的类和方法:这一点促使四原则构成一个完整的辩证体系,前三点主要讲设计要正确、易修改、易理解,这点却是防止大家做过。简单就是不多,也不少,目前为止刚刚好。它要求我们不能教条主义,死板硬套各种技巧,而是灵活使用,保持简单、精干。
 
原则处于Xp价值观和实践的中间位置,基于这些原则衍生出很多实践模式和设计模式,供大家选用。

"简单设计"的一点思考

时间: 2024-10-06 00:10:35

"简单设计"的一点思考的相关文章

关于模板方法和策略模式的一点思考

该随笔的思想原点,应该算是在两三年前了.当时和一前同事聊天.不知怎得就聊到了Http访问. 一.我记得他和我说过的第一句话,大概是:有没有已经封装好的.比较强大的HttpUtil.也可能是受业务的影响(接口对内).我当时接触到的Http访问,大多比较“规范”,至少有一个接口约束在约定着某些东西,不至于一会传递json,返回json, 一会又要传递xml,返回xml,甚至更奇葩的是,上传个文件.返回0或者1.如果真出现这样的状态,HttpUtil依然能够方便.灵活的适应着各种情况.我想这个Util

基于http协议通信的APP安全策略的一点思考

声明一点,我没做过过任何商业APP,以下想法仅仅是个人业余时间的一点思考,若你是专业人员,不吝赐教. 概述 微信开发过程中,会使用到微信服务器提供的API,这些API都是基于HTTP协议调用的,为什么我们自己的APP服务器不采用这种方式呢? 这种方式最直观的好处就是,API设计得足够好时,服务器只需要开发一次,无论前端是 WEB,APP ,APK...都通过http调用API请求数据并响应. 这种方式类似于传统C/S模型的开发,服务端/客户端定义相同序列的数据结构(称之为通信协议),差别在于现在

周志华:关于机器学习的一点思考

https://mp.weixin.qq.com/s/sEZM_o5D6AhyMgvocbsFhw 演讲:周志华 整理:肖琴.闻菲 [新智元导读]机器学习如今大获成功的原因有哪些?如何才能取得进一步的突破?南京大学周志华教授在AI WORLD 2018大会上分享他关于机器学习的一点思考:我们需要设计新的.神经网络以外的深度模型:让智能体在弱监督条件下也能够学习,以及考虑开放动态任务环境下的学习. 播放 震撼!AI WORLD 2018世界人工智能峰会开场视频 南京大学计算机系主任.人工智能学院院

关于后台系统自动生成的一点思考

大量实践发现后台管理程序,其实90%的代码都是相同的,当然是在抛弃复杂逻辑业务的情况下,那么如何能高效的节约这些时间呢,那就是接下来我要说的,对于后台系统自动生成的一些思考. 适用情景: 1.表编号id为自增(基于现在大部分表编号都是自增的情况): 2.没有太复杂业务关联关系,比如表的某一个字段,存储了一个json对象,为了平衡后台用户使用,需要友好的分段展示给用户的定制ui界面:还比如表中存储了外键的多个id,但为了方便用户使用,只能已标签name的方式,给用户展示,等等这些超强业务黏合逻辑的

关于前端的一点思考

关于前端的一点思考 Author:tkorays 最近写前端代码,写着写着就突然开始惆怅.忧伤.愤怒.发狂,我TMD到底在干什么啊! 很多东西写了n遍了,但是还是在不停地写着.自己写过的代码也不想再修改完善.重新利用,只是觉得,可能重新写一遍可能要好点.面对这很多库以及框架,虽然喜爱,但是也是有所顾忌,我只要使用其中的一个功能,根本不需要引入这么大的整个库. 事实上,我们可能在动手写任何代码之前,先要思考下,我们到底要的是什么! 0x00 界面真的需要这么炫酷么 在使用某个界面库之前,我们可能先

Kinect 开发 &mdash;&mdash; 用户交互设计的若干思考

Metro 风格 windows 8 Kinect Hub 手势原型设计 悬停选择     翻页控制 关节点重叠的处理方法 将箭靶设置在画面的边缘,这样玩家持弓的角度与屏幕保持一个大约45度的锐角,这样Kinect可以很精确的检测到拉弓射箭的动作 手势天生具有一定随意性,而且具有一定的文化背景差异性   手与设备的非接触性 虚拟触摸的界面 Kinect 使交互"柔软化"   确认操作保持简单一致 悬停选择 -- 将手停在想要选择的项目方块或按钮上,等待进度圆圈的填充,这个过程会在T时间

【转】缓存设计的一些思考

***{转自:缓存设计的一些思考}*** 互联网架构中缓存无处不在,某厂牛人曾经说过:”缓存就像清凉油,哪里不舒服,抹一下就好了”.高品质的存储容量小,价格高:低品质存储容量大,价格低,缓存的目的就在于”扩充”高品质存储的容量.本文探讨缓存相关的一些问题. LRU替换算法 缓存的技术点包括内存管理和替换算法.LRU是使用最多的替换算法,每次淘汰最久没有使用的元素.LRU缓存实现分为两个部分:Hash表和LRU链表,Hash表用于查找缓存中的元素,LRU链表用于淘汰.内存常以Slab的方式管理.

关于工作习惯的一点思考

最近项目发布新的版本,一个月要求四个人完工上线.我负责实现接口和相应的数据处理,从整体的任务比重上看能站到20%左右.我平时做事情比较赶,也就是属于拿的活差不多有个大体了解,就开始干,到功能实现为止.所谓的功能实现,就是能拿到相应的数据,至于数据整不正确,我一点兴趣都不感.所以整个项目下来,当别人在忙着写前端实现的时候,我就开始闲了,能到别人去调我的方法的时候,才发现我的方法,这里少个判断,那里数据错位... 昨天客户要求在下班前发布新版本,并且把老版本的用户数据同步到新版本上,由于数据结构做了

移动web动画设计的一点心得——css3实现跑步

[原]移动web动画设计的一点心得——css3实现跑步 今年3月份,由于公司业务需要,我转岗到微信产品部,离开了TID团队,人都是有感情的动物,更何况在一个团队呆了快 3 年,心中十分舍不得,鬼哥说了“天下没有不散的宴席...”,在我的世界里又多了一次离别的伤感(虽然还在隔壁工作).加入了微信产品中心后,开始新的团队生活,工作比以前忙多了,有时周六也要上班,需要更快更高效的完成任务,除了重构页面,需要主动参与边缘外的工作,承担更多.最近比较忙,给自己敲个响钟:注意身体. 说完题外话,开始近期的主