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

来源:互联网 发布:centos root密码忘记了 编辑:程序博客网 时间:2024/06/05 20:11

这是松结对编程的第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型代码结构中是个关键原则,若失去前者,徒弟将很难使用师傅编写的代码;若失去后者,则师傅为了迎合徒弟们的水平将不能充分发挥能力。

待续
原创粉丝点击