领导力大挑战
在实施Scrum项目的过程中,Scrum Master的角色是相当关键的,因为他是团队的推动者。本文围绕什么是仆人式领导、仆人式领导的起源、如何将领导力传达给团队、Scrum Master作为仆人式领导者的角色展开叙述,同时重点阐述仆人式领导者应有的基本内外特征。
该内容已经被标记书签!
标记书签错误,请重试!
作者 郑晔 发布于 2010年12月25日
这是一个让我纠结了很久的话题:缩进。
for (int j = 0; j < attributes.size(); j++) {
Attr *attr = attributes.get(j);
if (attr == NULL ) {
continue;
}
int IsCallFunc = -1;
if(attr->status() == STATUS_NEW || attr->status() == STATUS_MODIFIED) {
if(strcmp(attr->attrID(), "CallFunc") == 0) {
if(0 == strcmp(attr->attrValue(), "1")) {
IsCallFunc = 1;
} else if(0 == strcmp(attr->attrValue(), "0")) {
IsCallFunc = 0;
}
}
} else if (attr->status() == STATUS_DELETED) {
IsCallFunc = 0;
}
...
}
不是因为它不够“丑”,而是表现它不那么容易。找出一段能表现它特点的代码轻而易举,但放到一篇文章里,大片的代码还是容易让人怀疑我在偷懒。
咬咬牙,我还是拿出了一段。就是这样一段已经缩进很多层的代码,实际上,也只不过是一个更大缩进中的一小段。而且,省略号告诉我们,后面还有。
回到这段代码上,能出现多层缩进,for循环功不可没。出现这种循环,很多情况下,都是对一个集合进行处理,而循环里的内容,就是对集合里的每一个元素进行处理。这里也不例外。所以,我们先做一次提取:
for (int j = 0; j < attributes.size(); j++) {
processAttr(attributes.get(j));
}
void processAttr(Attr *attr) {
if (attr == NULL ) {
return;
}
int IsCallFunc = -1;
if(attr->status() == STATUS_NEW || attr->status() == STATUS_MODIFIED) {
if(strcmp(attr->attrID(), "CallFunc") == 0) {
if(0 == strcmp(attr->attrValue(), "1")) {
IsCallFunc = 1;
} else if(0 == strcmp(attr->attrValue(), "0")) {
IsCallFunc = 0;
}
}
} else if (attr->status() == STATUS_DELETED) {
IsCallFunc = 0;
}
...
}
至此,我们去掉了一层缩进,而且因为这个提取,语义也变得很清晰:这个新函数只是处理集合里的一个元素。
接下来,这个函数里面长长的代码是对IsCallFunc进行设值,后面省略的部分会根据这里求出的结果进行处理。所以,这里把processAttr进一步分拆:
void processAttr(Attr *attr) {
if (attr == NULL ) {
return;
}
int IsCallFunc = isCallFunc(attr);
......
}
int isCallFunc(Attr *attr) {
if(attr->status() == STATUS_NEW
|| attr->status() == STATUS_MODIFIED) {
if(strcmp(attr->attrID(), "CallFunc") == 0) {
if(0 == strcmp(attr->attrValue(), "1")) {
return 1;
} else if(0 == strcmp(attr->attrValue(), "0")) {
return 0;
}
}
} else if (attr->status() == STATUS_DELETED) {
return 0;
}
return -1;
}
缩进还有,如果有兴趣,还可以继续分解。这里就到此为止吧!
多层缩进是那种放在代码海一眼就可以认出来的代码,用一条简单的规则就可以限制它:
按照我的喜好,3就意味着“多”了。对于switch,我会给予特别的关照,因为switch一旦出场,条件少了,你都不好意思和人打招呼,再缩进就找不到北了。于是,对switch而言,我以为2就是多了,也就是说,switch里面就别再缩进了。
写代码,千万别退让太多。
作者简介:
郑晔,ThoughtWorks公司咨询师,拥有多年企业级软件开发经验,热衷于探索各种程序设计语言在真实软件开发中所能发挥的威力,致力于探寻合理的软件开发方式,加入ThoughtWorks公司后,投入到敏捷开发方法的实践之中,为其他公司提供敏捷开发方法方面的咨询服务。他的blog是梦想风暴。
查看原文:代码之丑(九)
在实施Scrum项目的过程中,Scrum Master的角色是相当关键的,因为他是团队的推动者。本文围绕什么是仆人式领导、仆人式领导的起源、如何将领导力传达给团队、Scrum Master作为仆人式领导者的角色展开叙述,同时重点阐述仆人式领导者应有的基本内外特征。
论道WP第三篇专栏,以应用程序栏的使用为中心,包括了软键盘带来的问题、应用程序栏介绍、如何绑定应用程序栏的属性等几个方面的具体话题,为开发者顺利使用应用程序栏开发提供了具体指导。
在多线程并发编程中Synchronized一直是元老级角色,很多人都会称呼它为重量级锁,但是随着Java SE1.6对Synchronized进行了各种优化之后,有些情况下它并不那么重了,本文详细介绍了Java SE1.6中对于锁的性能优化,以及锁的存储结构及升级过程。
本次分享将首先介绍现代富文本编辑器的组成和实现,然后结合UEditor的开发过程,与参会者分享UEditor在设计和实现的过程中,所涉及到的核心功能的细节实现。
本次演讲视频录制于百度技术沙龙。
我们所开发的应用程序大多都需要提供一个图形用户界面(GUI)。关于GUI应用的架构设计,已经有了Form & Control、MVC,、MVP、 Passive View等多种模式。模式可以帮助我们建立优雅的架构,但前提是弄清楚模式的应用场景。弄清楚GUI应用面临的设计上的问题,有助于我们正确的挑选设计方案。
MongoDB是一种非常易用的NoSQL方案,Brian C. Dilley在这篇文章里介绍了MongoDB的优劣势,并介绍了MJORM项目。MJORM用于MongoDB,是一个没有注解的Java ORM库。
随着网络基础设施的逐步成熟,从RPC进化到Web Service,并在业界开始普遍推行SOA,再到后来的RESTful平台以及云计算中的PaaS与SaaS概念的推广,分布式架构在企业应用中开始呈现出不同的风貌,然而殊途同归,这些分布式架构的目标仍然是希望回到建造巴别塔的时代,系统之间的交流不再为不同语言与平台的隔阂而产生障碍。
9 条回复
关注此讨论 回复