代码之丑(二)(续)

sinojelly在《代码之丑(二) 》的评论里问了个问题,“把这个type列表变成声明式”,什么样的声明式?

好吧!我承认,我偷懒了,为了省事,一笔带过了。简单理解声明式的风格,就是把描述做什么,而不是怎么做。一个声明式编程的例子是Rails里面的数据关联,为人熟知的has_many和belongs_to。通过声明,模型类就会具备一些数据关联的能力。

具体到实际开发里,声明式编程需要有两个部分:一方面是一些基础的框架性代码,另一方面是应用层面如何使用。框架代码通常来说,都不像应用层面代码那么好理解,但有了这个基础,应用代码就会变得简单许多。

针对之前的那段代码,按照声明性编程风格,我改造了代码,下面是框架部分的代码:

#define BEGIN_STR_PREDICATE(predicate_name) bool predicate_name(const char* field) {   static const char* predicate_true_fields[] = {     #define STR_PREDICATE_ITEM(item) #item ,

#define END_STR_PREDICATE   };     int size = ARRAY_SIZE(predicate_true_fields);   for (int i = 0; i < size; i++) {     if (strcmp(field, predicate_true_fields[i]) == 0) {         return […]

代码之丑(二)

这是一个长长的判断条件:   if ( strcmp(rec.type, "PreDropGroupSubs") == 0     || strcmp(rec.type, "StopUserGroupSubsCancel") == 0     || strcmp(rec.type, "QFStopUserGroupSubs") == 0     || strcmp(rec.type, "QFStopUserGroupSubsCancel") == 0     || strcmp(rec.type, "QZStopUserGroupSubs") == 0     || strcmp(rec.type, "QZStopUserGroupSubsCancel") == 0     || strcmp(rec.type, "SQStopUserGroupSubs") == 0     || strcmp(rec.type, "SQStopUserGroupSubsCancel") == 0     || strcmp(rec.type, "StopUseGroupSubs") == […]

《未来是湿的》中文PDF扫描版下载

《未来是湿的》简介:

变革未来的力量

湿,是协同合作的态度。 湿,是社会资本的累积。 湿,是思维范式由一维而万维。 湿,是政治文化从一元到多元。 湿,是交流空间打破鸦雀无声,走向众声喧哗。

这是一种力量,这更是一场革命!能否察觉和利用这种象征着力量、关系和环境的“湿度”改变,也许决定了我们能否在未来活下来……

《未来是湿的》目录:

第1章 从一场“人肉搜索”说开去 “人肉搜索”不是有中国特色的专利。在大洋彼岸的美国,一部丢失的手机,一个捡到别人手机不还的举动,造就了一场轰轰烈烈的全民网络大搜索运动,甚至惊动了《纽约时报》、CNN和纽约警察局。多媒体手机、电子邮件、博客、论坛……拥有了新技术和新工具,群体行动的力量如此之大,我们能做的远不止找回一部丢失的手机。 关键词:原本的受众 群体行动 机构困境

第2章 分享是机构困境的解药 “美人鱼游行”、“伦敦爆炸案”、“印度洋海啸”、“泰国军事政变”……Flickr网站上由用户分享的照片永远比传统机构和媒体的照片更快、更多、更全。没有事先组织,没有报酬支付,没有管理成本,Flickr网站所做的,不过是提供了聚合和分享的平台。随着交易成本的降低,非机构性群体已经对传统组织造成了深刻的挑战。 关键词:科斯理论 交易成本 共享 合作 集体行动

第3章 这是“人人皆记”的时代 职业记者?职业编辑?职业摄影师?请别再使用这落伍的称谓!当出版不再是一种稀缺资源,当媒体不再掌控机构特权,当大规模业余化的旗帜被高高举起,当社会性工具清除了公众表达旧的障碍,当任何人在任意时间都可以发布任何事情,这就是一个“人人皆记”的时代。 关键词:专业人士 资源稀缺 大规模业余化

第4章 先出版,后过滤的游戏规则 在未来,到底是每个人都能出名15分钟?还是每个人都会变成15个人眼中的名人?不管怎样,在阿猫阿狗都能写博客、拍视频的网络时代,名人还是会诞生,只不过游戏规则变了。诸如博客、论坛类的社会性媒体已经铲平了出版的门槛,却也伴生着残忍的经济逻辑:有价值的不是信息,而是注意力。 关键词:用户产生的内容 通信媒体 广播媒体 实践社区

第5章 当个性化动机遇上协同生产 维基百科的运营可不是招呼邻里的牌桌,其庞大的规模堪比拉斯维加斯的大型赌场。为什么不采用商业模式,维基百科还能成长得如此之快?为什么没有管理分工,维基百科也不会被胡言乱语充斥?为什么没有报酬,人们仍愿意为维基百科做事情?在新的社会性工具的帮助下,人们能为了爱做出大事情。 关键词:协同生产 维基百科 幂律分布

第6章 集体行动给机构带来的挑战 1992年,《波士顿环球报》爆出天主教牧师波特对儿童实施性侵害的丑闻,最终主教劳把波特从一个教区调到另一个教区便草草收场。2002年,类似的丑闻再次由《波士顿环球报》引爆,同样的情节,同样的媒体,甚至是同一位主教,事件的结局却大不相同:罪犯盖根被绳之以法,试图包庇的主教迫于公众压力也引咎辞职。正是社会性工具消除了集体行动的障碍,实现了信息共享,方便了人们改变世界。 关键词:集体行动 端到端的通信 群体形成

第7章 越来越快的行动能力 快闪族、恐怖分子、闪电战、愤怒旅客和学生的维权行动、中东的激进分子……由于分享和协调的成本已经瓦解,这些原本互不协调的弱势群体开始以更快的速度和更有效的方式共同工作,对抗强势对手。现在实时的协调也将越多地取代事先的安排,群体行为的组织过程可以是隐形的,而结果立即可见。 关键词:共享的认识 实时协调 消费者军团

[…]

代码之丑(一)

诸位看官,上代码:

  if (0 == iRetCode) {

    this->SendPeerMsg("000", "Process Success", outRSet);

  } else {

    this->SendPeerMsg("000", "Process Failure", outRSet);

  }

乍一看,这段代码还算比较简短。那下面这段呢?

  if(!strcmp(pRec->GetRecType(), PUB_RECTYPE::G_INSTALL)) {

    CommDM.jkjtVPDNResOperChangGroupInfo(

      const_cast(CommDM.GetProdAttrVal("vpdnIPAddress",

      &(pGroupSubs->m_ProdAttr))),

      true);

  } else {

    CommDM.jkjtVPDNResOperChangGroupInfo(

      const_cast(CommDM.GetProdAttrVal("vpdnIPAddress",

      &(pGroupSubs->m_ProdAttr))),

      false);

  }

看出来问题了吗?经过仔细的对比,我们发现,对于如此华丽的代码,if/else的执行语句真正的差异只在于一个参数。第一段代码,二者的差异只是发送的消息,第二段代码,差异在于最后那个参数。

[…]

代码之丑(零)

看到下面这段代码,你会做何感想?

  if(db.Next()) {

    return true;   

  } else {

    return false;

  }

有的人会想,怎么写得这么笨啊!但是,请放心,绝对会有人这么想,挺好的,实现功能了。这并非我臆造出的代码,而是从一个真实的codebase上找到。

成为一个咨询师之后,我有机会在不同的项目中穿梭。同客户合作的过程中,我经常干的一件事是:code diff。也就是用源码管理工具的diff功能把当天全部修改拿出来,从编码的角度来分析代码写得怎么样。

因为这个工作,我看到了许多不同人编写的代码,我的编码底线不断受到挑战。许多东西,我以为是常识,但实际上不为许多人所知,比如上面那段代码。

我把在看到的问题总结成一个session,与客户的程序员分享。结束之后,有人建议,为什么不能把这些问题写下来,与更多人分享。于是,我产生了写下《代码之丑》念头,以此向《代码之美

》致敬。

最后要说的是,开始那段代码可以写成这样:

  return db.Next();

本文已经首发于InfoQ中文站

,版权所有,原文为《专栏:代码之丑——开篇

》,如需转载,请务必附带本声明,谢谢。

InfoQ中文站

是一个面向中高端技术人员的在线独立社区,为Java、.NET、Ruby、SOA、敏捷、架构等领域提供及时而有深度的资讯、高端技术大会如QCon

、免费迷你书下载如《架构师

》等。

[…]

优化选择——Programmers(18)

载于《程序员》杂志2010年第10期。

这个系列的漫画讲述程序员——这种神秘人类的囧事,故事多来源于我身边的程序员朋友,且以互联网开发背景为主。

如果你有什么可乐的关于程序员的故事、对话、代码,愿意通过漫画的形式分享,请给我发邮件。arthur369@gmail.com。

著名的科幻电影海报

这些后现代主义的科幻电影海报需要惊人想象力、巧妙构思与高超的图像处理拼接技术。文中最后也给出了一些爱好者的教程。

Paranormal Movie Posters That Will Give You Goosebumps

http://psd.tutsplus.com/articles/inspiration/paranormal-movie-posters-that-will-give-you-goosebumps

 

Related posts:

Frank Frazetta的幻想插画 不同寻常的白色背景的电影海报 风格迥异的《爱丽丝漫游仙境》插画 《绿野仙踪》题材插画 […]

学习腾讯网站隐私权声明

想学习网站隐私权怎么写?大家一起来学习把。

腾讯注重对保护您的个人隐私的保护。有时候我们需要某些信息才能为您提供您请求的服务,本隐私权声明解释了这些情况下的数据收集和使用情况。本隐私权声明适用于腾讯网站的所有相关服务。

您个人信息的搜集

当我们需要能识别您身份的信息(个人信息)或者可以与您联系的信息时,我们会征求您的同意。通常,在您注册QQ或其他腾讯在线服务时,我们会请求您提供这些信息。腾讯搜集的信息通常仅限于您的姓名、性别、年龄、出生日期、身份证号、家庭住址、教育程度、公司情况、所属行业、兴趣爱好等。

控制您的个人信息

腾讯会在法律要求或符合腾讯网站的相关服务条款、软件许可使用协议约定的情况下透露您的个人信息,或者有充分理由相信必须这样做才能:(a) 满足法律的明文规定,或者符合腾讯或本站点适用的法律程序;(b)符合腾讯网站相关服务条款、软件许可使用协议的约定;(c) 保护腾讯及其系列 Web 站点的权利或财产,以及 (d) 在紧急情况下保护腾讯员工、腾讯产品或服务的用户或大众的个人安全。

腾讯不会未经允许将这些信息与第三方共享,本声明已经列出的情况除外。

您个人信息的安全

严格保护您的个人信息的安全。我们使用各种安全技术和程序来保护您的个人信息不被未经授权的访问、使用或泄漏。如果您对我们的隐私保护有任何置疑,请email至law@tencent.com。

Cookie 的使用

腾讯使用 Cookie 来帮助您实现您的联机体验的个性化。Cookie 是由网页服务器存放在您的硬盘中的文本文件。Cookie 不能用来运行程序或将病毒递送到您的计算机中。指定给您的 Cookie 是唯一的,它只能由将 Cookie 发布给您的域中的 Web 服务器读取。

Cookie 的主要用途之一是提供一种节约时间的实用功能。例如,如果您将腾讯的网页个性化,或在腾讯网站或服务上注册,Cookie 会帮助腾讯在您后续访问时调用您的特定信息。这样可以简化记录您的个人信息(例如帐单寄送地址、首选电子邮件地址等)的流程。当您返回到腾讯时,腾讯可以调出您以前所提供的信息,使您能够容易地使用您自定义的腾讯功能。腾讯允许那些在我们网页上发布广告的公司到用户电脑上设定或取用Cookie。其他公司将按其自订的隐私权政策而非本政策使用 Cookie。

腾讯在进行与其产品及服务相关的工作时,会使用网络beacons进入我们的网站提取 Cookie。

您可以接受或拒绝 Cookie。大多数 Web 浏览器会自动接受 Cookie,但您通常可根据自己的需要来修改浏览器的设置以拒绝 Cookie。如果选择拒绝 Cookie,那么您可能无法完全体验所访问的腾讯服务或网站的互动功能。

Web Beacon 的使用

腾讯网页上常会包含一些电子图象(称为”单像素” GIF 文件或 “网络 beacon”),它们可以帮助网站计算浏览网页的用户或访问某些 cookie。腾讯使用网络 beacons 的方法包括:

在腾讯网站中使用 腾讯通过在其网站上使用网络 beacons,计算用户访问数量,并通过访问 […]

70个最新的logo设计精选

来点像样的说法吧

这就是……

70 Latest and Creative Logo Designs for Design Inspiration

70 Latest and Creative Logo Designs for Design Inspiration

Related posts:

LOGO设计中“心型”的运用 LOGO设计中的餐具 logo中无衬线字体的运用 和猫有关的Logo设计, 非常可爱。 与面孔有关的logo设计 […]

Category

Archives