敏捷开发松结对编程系列:L型代码结构案例StatusFiltersDropdownList(中)
这是松结对编程的第22篇(专栏目录)。
接前文
业务代码
public static MvcHtmlString StatusFiltersDropdownList(WebViewPage page)
{
var allStatuses = Status.AllStatuses().ToList();
const string key = "statusIds";
var currentStatusIds = page.ParameterOf(key); //Status groups filters on the top.
var linksLeft = new Dictionary<string, IEnumerable<Status>>
{
{"所有状态", allStatuses},
{"所有正常", allStatuses.Where(i => i.IsNormal)},
{"所有开放", allStatuses.Where(i => !i.IsClosed)},
{"所有故事板", allStatuses.Where(i => i.IsDisplayedOnKanban)},
};
var linksListLeft = AddToList(page, key, currentStatusIds, linksLeft); var linksRight1 = new Dictionary<string, IEnumerable<Status>>
{
{"0", null},
{"所有已放弃或推迟", allStatuses.Where(i => !i.IsNormal)},
{"所有关闭", allStatuses.Where(i => i.IsClosed)},
{"所有非故事板", allStatuses.Where(i => !i.IsDisplayedOnKanban)}
};
var linksListRight1 = AddToList(page, key, currentStatusIds, linksRight1); //Single status filters on the bottom.
linksListLeft.Add(new MvcHtmlString("<hr/>"));
linksListLeft.AddRange(allStatuses.Where(i => i.Value >= 0)
.Select(status => status.Link(outerLink: page.MergeParameter(key, "_" + status.ID + "_"), title: status.Value.ToString(),
displayAsBoldText: "_" + status.ID + "_" == currentStatusIds)));
linksListLeft.Add(new MvcHtmlString("<hr/>"));
linksListLeft.AddRange(allStatuses.Where(i => i.Value < 0)
.Select(status => status.Link(outerLink: page.MergeParameter(key, "_" + status.ID + "_"), title: status.Value.ToString(),
displayAsBoldText: "_" + status.ID + "_" == currentStatusIds))); //Current value text
var currentValueText = "";
MvcHtmlString currentValue = null;
currentValueText = linksLeft.SingleOrDefault(i => i.Value != null && currentStatusIds == i.Value.Aggregate<Status, string>(null, (current, status) => current + "_" + status.ID + "_"))
.Key ?? currentValueText;
currentValueText = linksRight1.SingleOrDefault(i => i.Value != null && currentStatusIds == i.Value.Aggregate<Status, string>(null, (current, status) => current + "_" + status.ID + "_"))
.Key ?? currentValueText;
if (!string.IsNullOrEmpty(currentValueText))
{
currentValue = new MvcHtmlString("<b>" + currentValueText + "</b>");
}
else
{
var status = allStatuses.SingleOrDefault(i => currentStatusIds == "_" + i.ID + "_");
currentValue = status != null
? MFCUI.Image(status.Title, "/MFC/Items/STAT/STAT16.png", showText: true, cssClassOfText: "bold", textColor: status.Color)
: new MvcHtmlString("<b style=\"color: #169; \">请选择</b>");
} var ddl = MFCUI.DropdownListHtml(page, currentValue, linksListLeft, linksListRight1, null, "200px");
return new MvcHtmlString("状态:" + ddl);
}
有一个被调用的函数在这里:
private static List<MvcHtmlString> AddToList(WebViewPage page, string key, string currentStatusIds, Dictionary<string, IEnumerable<Status>> linkList)
{
var linksList = new List<MvcHtmlString>();
foreach (var link in linkList)
{
var statusIds = link.Value == null ? "" : link.Value.Aggregate<Status, string>(null, (current, status) => current + "_" + status.ID + "_");
linksList.Add(link.Value == null
? null
: MFCUI.Link(link.Key, page.MergeParameter(key, statusIds), displayAsBoldText: statusIds == currentStatusIds));
}
return linksList;
}
这样封装的代码没有复用价值,但可以减少维护时的阅读量。
关于注释
业务逻辑代码
subItems = statusIds == null
? ItemsUnder(repository, rootID, includeHidden: includeHidden)
: ItemsUnder(repository, rootID, includeHidden: includeHidden).Where(i => i.Status != null && statusIds.Contains("_" + i.Status.ID + "_"));
这是它唯一被真正使用的地方。尽管我们会对很多东西进行筛选,但都不需要写任何一行代码了,因为这行代码位于“很多东西”的底层。日后如果技术上有什么变动,就修改它就可以了。
实现业务变更
敏捷开发松结对编程系列:L型代码结构案例StatusFiltersDropdownList(中)的更多相关文章
- L型代码结构案例:Link访问权限(上)
这是松结对编程的第20篇(专栏目录). 本文探讨Link访问权限的最佳实现方法,力求外观干净且封装良好. 这些代码将位于L型代码结构(参见松结对编程系列中的定义)的下层,调用者无需理解其原理. 顺便说 ...
- shell编程系列26--大型脚本工具开发实战
shell编程系列26--大型脚本工具开发实战 大型脚本工具开发实战 拆分脚本功能,抽象函数 .function get_all_group 返回进程组列表字符串 .function get_all_ ...
- shell编程系列21--文本处理三剑客之awk中数组的用法及模拟生产环境数据统计
shell编程系列21--文本处理三剑客之awk中数组的用法及模拟生产环境数据统计 shell中的数组的用法: shell数组中的下标是从0开始的 array=("Allen" & ...
- shell编程系列19--文本处理三剑客之awk中的字符串函数
shell编程系列19--文本处理三剑客之awk中的字符串函数 字符串函数对照表(上) 函数名 解释 函数返回值 length(str) 计算字符串长度 整数长度值 index(str1,str2) ...
- 《Windows核心编程系列》十三谈谈在应用程序中使用虚拟内存
在应用程序中使用虚拟内存 Windows提供了以下三种机制对内存进行操控: 一:虚拟内存.最适合来管理大型对象数据或大型结构数组. 二:内存映射文件.最适合用来管理大型数据流,以及在同一机 器上运行的 ...
- 安卓APP开发简单实例 结对编程心得
开始说起搞APP开发,自己和小伙伴的编程水平真的很低,无从下手,只有在网上找点案列,学习着怎样开发,结对编程还是面临着许多问题的,大家的水平有所差异和编程风格不同,我们用eclipse做了一个仿微信登 ...
- 敏捷开发与XP实践
北京电子科技学院(BESTI) 实 验 报 告 课程: Java 班级:1352 姓名:黄伟业 学号:20135215 成绩: ...
- 实验三 敏捷开发与XP实践
实验内容 1. XP基础 2. XP核心实践 3. 相关工具 实验要求 1.没有Linux基础的同学建议先学习<Linux基础入门(新版)><Vim编辑器> 课程 2.完成实验 ...
- 20145215实验三 敏捷开发与XP实践
20145215实验三 敏捷开发与XP实践 实验内容 XP基础 XP核心实践 相关工具 实验步骤 (一)敏捷开发与XP 软件工程是把系统的.有序的.可量化的方法应用到软件的开发.运营和维护上的过程.软 ...
随机推荐
- ios&h5混合开发项目仿app页面跳转优化
前言:本人原本是ios开发工程师,但由于现今H5的兴起,行内刮起了一阵混合开发的风气,趁着这股劲,我也学了前端开发,不说研究的多深,但也能胜任日常的开发工作.长话短说,现今的混合开发应该还处于摸索阶段 ...
- Fibonacci 数列递归 重复计算
public class Fibonacci{ public static long F(long n){ System.out.println("call F" + n); ) ...
- ThinkPHP 中使用 PHPMailer 发送邮件 支持163和QQ邮箱等
[摘要]ThinkPHP是一个开源的PHP框架, 是为了简化企业级应用开发和敏捷WEB应用开发而诞生的.本文介绍ThinkPHP 中使用 PHPMailer 发送邮件. PHP是自带可以发送邮件的Ma ...
- php 连接mysql数据库并显示数据 实例 转载
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/ ...
- ecshop安装程序源码阅读-安装脚本(2)
检查环境变量: 程序目录:图片目录,数据目录,临时目录 模板目录下模板文件 数据库连接函数 数据库配置: 读取数据库列表 创建配置文件(数据库,语言,session有效期等) 创建数据表 创建初始化数 ...
- ubuntu14.04下 Android虚拟机 genymotion 的下载和安装
官网:https://www.genymotion.com/ Install Guide https://www.genymotion.com/#!/developers/user-guide#ins ...
- JAVA抽象类和接口的深入探讨
Java 语言中,抽象类(abstract class) 和接口(interface) 是抽象思想的两种体现形式.初学者很容易把这两者搞混,所以Java面试中考抽象类和接口的区别的面试题也常有出现的. ...
- Hibernate中的多对多关系详解(3)
前面两节我们讲到了一对一的关系,一对多,多对一的关系,相对来说,是比较简单的,但有时,我们也会遇到多对多的关系,比如说:角色与权限的关系,就是典型的多对多的关系,因此,我有必要对这种关系详解,以便大家 ...
- bootcamp
为了鄙社自主研发的html5studio和mist,我给Air划了32G装windows囧 第一要注意的是,必须使用bootcamp划分将要安装windows的分区,不要在windows安装过程中删除 ...
- 注意android裁图的Intent action
现在很多开发者在裁图的时候还是使用com.android.camera.action.CROP 来调用 startActivity(). 这不是个好主意. 任何不是依android开头的Action ...