本文是“松结对编程”系列的第十五篇。(松结对编程栏目目录)
之前的L型代码结构的前三篇提到过,L型代码结构的微观计划和估算过程会与一般的编程方法不同,今天正好要编写一些新代码,边写边记录整个过程。如果中间卡壳了,我也会尽量记录下来。
业务需求
L型代码结构的做法
步骤1:找到相似的业务
![](https://img-my.csdn.net/uploads/201301/27/1359265133_3841.png)
步骤2:找到业务代码
public ActionResult LinkTeam2Product(int focusedDepartmentID = 0)
{
ViewBag.ItemTreeViewModel = new ItemTreeViewModel("团队-产品映射", ProductLine.ProductRootID, SystemItemWhat.Product, whattypes: ItemWhattype.ProductProductline + "_" + ItemWhattype.ProductProduct + "_" + ItemWhattype.ProductEdition);
focusedDepartmentID = focusedDepartmentID == 0 ? Department.DepartmentRootID : focusedDepartmentID;
ViewBag.LinkItem2ItemsViewModel = new LinkItem2ItemsViewModel(ProductLine.ProductRootID, SystemItemWhat.Product, Department.DepartmentRootID, SystemItemWhat.Deaprtment, focusedDepartmentID, whatTypes: ItemWhattype.ProductProductline + "_" + ItemWhattype.ProductProduct + "_" + ItemWhattype.ProductEdition, leftPadWhatTypes: ItemWhattype.DeprtmentProgram + "_" + ItemWhattype.DeprtmentTeam);
return View(ItemTree.ViewPath);
}
public ActionResult LinkProduct2Team(int focusedProductID = 0)
{
ViewBag.ItemTreeViewModel = new ItemTreeViewModel(
"产品-团队映射", Department.DepartmentRootID, SystemItemWhat.Deaprtment, ItemWhattype.DeprtmentProgram + "_" + ItemWhattype.DeprtmentTeam);
focusedProductID = focusedProductID == 0? ProductLine.ProductRootID : focusedProductID;
ViewBag.LinkItem2ItemsViewModel = new LinkItem2ItemsViewModel(
Department.DepartmentRootID, SystemItemWhat.Deaprtment, ProductLine.ProductRootID,
SystemItemWhat.Product, focusedProductID, whatTypes: ItemWhattype.DeprtmentProgram + "_" + ItemWhattype.DeprtmentTeam,
leftPadWhatTypes: ItemWhattype.ProductProductline + "_" + ItemWhattype.ProductProduct + "_" + ItemWhattype.ProductEdition);
return View(ItemTree.ViewPath);
}
步骤3:修改出新的业务代码
public ActionResult LinkProduct2Story(int productID, int? focusedItemID)
{
ViewBag.ItemTreeViewModel = new ItemTreeViewModel(
"产品-故事映射", productID, SystemItemWhat.Story);
ViewBag.LinkItem2ItemsViewModel = new LinkItem2ItemsViewModel(
productID, SystemItemWhat.Story, null,
ProductLine.ProductRootID, SystemItemWhat.Product, null, focusedItemID);
return View(ItemTree.ViewPath);
}
步骤4:必要时,修改底层代码
focusedProductID = focusedProductID == 0? ProductLine.ProductRootID : focusedProductID;
被写在Action里边了,所以每次都要写一遍。
改为直接传入new ViewModel,让里边处理。
步骤5:调试
![](https://img-my.csdn.net/uploads/201301/27/1359272320_3854.png)
return View(ItemTree.ViewPath);
通向一个可复用的View,它的结构就是左边一个Pad,右边一个首级目录横置的树(也可以不是),它会在当前目录下寻找一个叫做"_[Action]LeftPad.cshtml"的View来显示左边的Pad和"_[Action]TreeNode.cshtml"的文件来显示右边的每一个节点,这是刚才拷贝粘贴和重命名View的原因。
总结
一些没讲到的地方
残留问题
L型代码的好处
1. 代码减少
这些功能大约有20~30个功能点(取决于建几个数据库表),按QTM上的国际数据,C#每个功能点需要59行,所以59×(20~30)=1200~1500行,但如果有L型代码结构,就只需要20多行代码。
刚才的工作从13:30开始,到现在16:12,扣除写博客实际花费了大约1小时不到,再加上残留问题修修补补的时间也就1天。所以1天能干10~15天的活。
这个甚至不需要个人能力,即使是新手,熟悉了这个架构,速度也差不多。
3. 质量上升
每次底层都被多次调用,只要一次失败就会被发现;而每次底层改动都会帮助多个功能优化,修改Bug也是如此。
4. 新手上手快
一般“代码减少”“代码优化”常常面临的问题就是:新手能看懂和维护吗?
其实,别看这个体系好像挺复杂的,但新手看这20行代码的速度,还是比摆弄1200~1500行快多了。
例子中的所有代码,除了步骤3里边的新函数,其他的比如被我重构的LInkItem2ItemViewModel和几个Action,外加拷贝粘贴重命名的LeftPad/TreeNode等代码,其实都是另外一个人编写的。他在编写这些代码的时候编程经验只有半年(之前作为技术支持工作过4年,大学学过C++,之后从来没动过代码),实际编写的代码行数估计只有1000行(我们一共只有11000行代码)。当然,他编写这些代码的时候,又是参考了我之前的另外一个“迭代计划”页面的设计。