这是松结对编程的第21篇(专栏目录)。

本文以一个完整案例展示代码分层及在松结对编程组中师傅与徒弟的分工。

松结对编程(以及结对编程、代码审查……等)是最末级的管理实践,其实施过程必须与工程实践相结合。比如代码怎么分层,函数怎么写,都是这种管理实践的一部分。

阅读本文整体上不需要了解“L型代码结构”。但如果中途对“L型代码结构”一词感到困惑,请参考:http://blog.csdn.net/cheny_com/article/details/7889796

要解决的问题

需要一个通用的控件对火星人中的各种工作项的状态进行筛选,外观大致如下(这是完成后的截图,完成前可以吃在纸上画画)。
它是所有树状结构页面上的一个标准控件,显示在快捷工具栏上:
上面截图时内部筛选功能还没有实现,下面这个图则是筛选后的结果:
只有符合状态条件的工作项(及其直系长辈)被显示出来。直系长辈的目的是为了形成树状结构。
下拉框的悬浮拉开效果:
“待开发”以黑色黑体字显示。若更换成“所有故事板(状态)”,则为:
当然URL也因此而发生变化。

代码逐层结构分析

筛选条件表达

是利用URL传递的(为了方便测试),里边有个参数statusIds:
http://localhost:54364/ProductManagement/StoryTrees/OperateTree?rootID=3&whats=STRY&whattypes=STRY-SUBS_..._&statusIds=_509_

509就是当前的筛选Status的ID(可以是多个,用来处理“所有故事板上的状态”这类情况,比如:)

http://localhost:54364/ProductManagement/StoryTrees/OperateTree?rootID=3&whats=STRY&whattypes=STRY-SUBS..._&statusIds=_509__510_

控件引用

控件引用其实决定了控件的接口,是第一个要想好的东西。接口中如果有冗余信息,则表明里边的代码也一定不干净。

其实一行(下面代码中的第四行):

        <div class="link-span">视图:@Product.AllLinks(this)</div><div class="link-span">根节点:@Item.AncestorsDropdownList(this, "rootID", "id", ItemWhattype.ProductProduct, true, true)</div><div class="link-span">@Item.TypeFiltersDropdownList(this, SystemItemWhat.Story)</div><div class="link-span spliter">@Item.StatusFiltersDropdownList(this)</div>

因为需要动用URL,所以传递this(WebViewPage,当前页面)进去。

业务代码设计原则

“业务代码”就是执行某个业务时被调用的第一个函数(以及包含它的类)。
绝对地说,能被URL直接调用的代码(如MVC中的Action及其对应的View)称为业务代码;相对地地说,层层挖掘代码时,越往上的代码越叫做“业务代码”,对应下层的则称为“技术代码”。

业务代码设计应该遵循以下原则:
1. 业务代码中只包含“做什么”的内容。
2. 业务代码中不包含“怎么做”的内容。
3. 业务代码中不包含重复代码(即两个以上地方相同的代码,其实这是所有代码的设计规则)。
4. 维护业务变更时,只需要修改业务代码;此时应该维护者(往往不是最初开发者)应该容易定位要维护的代码,也易于改动。
这里没太提到“易读性”,实际上易读主要发生在维护时,因此可以先简单地把易读理解为易维护,即虽然不能彻底“读懂”,但已经足以对其进行业务维护了。
技术维护时,维护者所需的水平要与开发者相近才行,否则还是很难实现。
换言之,业务维护性是绝对的,新手/新人都应该能维护;技术维护性是相对的,不应该让新手/新人维护他们能力之外的代码。
这在松结对编程和L型代码结构中是个关键原则,若失去前者,徒弟将很难使用师傅编写的代码;若失去后者,则师傅为了迎合徒弟们的水平将不能充分发挥能力。

待续

敏捷开发松结对编程系列:L型代码结构案例StatusFiltersDropdownList(上)相关推荐

  1. 敏捷开发“松结对编程”系列之十一:L型代码结构(团队篇之一)

    本文是"松结对编程"系列的第十一篇.(松结对编程栏目目录) 上一篇中提到的技术方法都不太难,但问题是为什么很多团队做不到呢?问题在于: 高手可以每次都写出可复用的代码,从而大大地降 ...

  2. 敏捷开发“松结对编程”系列之十二:L型代码结构(质量篇之一)

    本文是"松结对编程"系列的第十二篇.(松结对编程栏目目录) 有没有一种管理方法,无需额外的测试活动,就能大幅度提高产品质量?L型代码结构就是其中一种候选方案. 缺陷的来源 要减少缺 ...

  3. 敏捷开发“松结对编程”系列之十五:L型代码结构(编程篇之一)

    本文是"松结对编程"系列的第十五篇.(松结对编程栏目目录) 之前的L型代码结构的前三篇提到过,L型代码结构的微观计划和估算过程会与一般的编程方法不同,今天正好要编写一些新代码,边写 ...

  4. 敏捷开发松结对编程系列:L型代码结构案例StatusFiltersDropdownList(下)

    这是松结对编程的第23篇(专栏目录). 接上文,45分钟后-- 新的筛选效果 现在需要在下拉框上加上两排新的筛选项(更早和更晚): 师傅本人可以在45分钟完成(实测),但如果直接交给徒弟维护(或师傅离 ...

  5. 敏捷开发“松结对编程”系列之七:问题集之一

    本文是"松结对编程"系列的第七篇.(之一,之二,之三,之四,之五,之六,之七,之八) 刚刚参加完MPD 2011深圳站,在演讲中间及后来媒体采访,被问到了一些问题,也给出了答案,这 ...

  6. 敏捷开发“松结对编程”实践之五:代码检查篇(大型研发团队,学习型团队,139团队,师徒制度,代码审查)...

    本文是"松结对编程"系列的第五篇.(之一,之二,之三,之四,之五,之六,之七,之八) 松结对和紧结对不一样,两个人不是总坐在一起随时发现问题解决问题,而是很短时间地坐在一起.其中在 ...

  7. 敏捷开发“松结对编程”系列之八:微软 Tech ed2011 自组织团队与松结对编程讲稿(敏捷开发)...

    本文是"松结对编程"系列的第八篇.(之一,之二,之三,之四,之五,之六,之七,之八) 好像微软自己也有一个无纸下载处,但是手册不在身边没搜到,这里补充一个下载链接. 无需积分,但需 ...

  8. 敏捷开发“松结对编程”系列之八:微软 Tech ed2011 自组织团队与松结对编程讲稿(敏捷开发)

    本文是"松结对编程"系列的第八篇.(之一,之二,之三,之四,之五,之六,之七,之八,此系列之九及之后文章请见栏目总目录.) 好像微软自己也有一个无纸下载处,但是手册不在身边没搜到, ...

  9. 敏捷开发“松结对编程”实践之六:大型团队篇|后记(大型研发团队,学习型团队,139团队,师徒制度,人员招聘,职业生涯规划)...

    本文是"松结对编程"系列的第六篇.(之一,之二,之三,之四,之五,之六,之七,之八) 松结对编程是小型团队的实践,大约运行在1个师傅+1-3个徒弟的尺度上,当面临更大尺度的时候,就 ...

最新文章

  1. OPPO A59s手机系统时间停止运行
  2. Windows2000下Api函数的拦截分析
  3. JAVA设计模式初探之组合模式
  4. java char i=2+#039;2#039;;_图说String(三)String中#039;+#039;和StringBuilder的区别
  5. 建行计算机招聘考试考什么,银行招聘考试考什么
  6. Gram-Schmidt正交化
  7. gan网络损失函数_生成对抗网络的最新研究进展
  8. Scala(第五节)actor并发编程、文件操作和网络请求、隐式转换和隐式参数、Akka并发编程、Akka模拟简易Spark通信
  9. socket通信显示连接被拒绝问题总结
  10. vue中computer和watch的区别和使用
  11. python中函数的定义通常会从关键字_4.7. 深入 Python 函数定义
  12. 2021 春季新品发布会上,苹果推出了全新配件 AirTag
  13. foxmail发邮件时总提示接收密码错误是怎么回事
  14. 修复损坏的gz或tar.gz压缩文件之方法篇
  15. “币圈贾跃亭”天价碰瓷巴菲特,王小川隔空回应:骗子!
  16. 作业盒子生端AndrOid,作业盒子小学学生端
  17. 车间数字孪生解决方案(二)
  18. emmc芯片读写,读不出来数据?
  19. LeGO-LOAM LoopClosure
  20. 删除windows回收站右键菜单中的“找回清空文件”

热门文章

  1. 深度学习·理论篇(2023版)·第001篇快速了解人工智能与Pytorch:机器/表示/深度学习定义+端到端的学习+神经网络在计算机视觉应用+深度学习的技术蓝图
  2. python兔子生兔子
  3. 巫师编程语言“咒语” 设想
  4. Can't create pdf file with font calibri bold 错误解决方案
  5. ES6数据部分(字符串,数组,对象,symbol,set,map)
  6. Unity学习笔记 球形全景图平面像素坐标与三维坐标系上的坐标之间的转换
  7. 筱筱看博客(函数柯里化、节流防抖)
  8. 线性代数笔记——第一章行列式
  9. 学python历程中
  10. Elasticsearch牛逼了! 这份携程、滴滴、今日头条、饿了么、360、小米、Vivo 应用实践合集都在这儿了...