我对DAO的理解

Posted on Wed 09 January 2013 in 我用(IT) • Tagged with Design Patterns, Program Language

Context

上午review一个新项目的代码,这个项目预估今年用户规模在500万以上。程序架构我已经搭建完成了,主要就是review一个同事写的业务代码。 我对他使用DAO的方式有很大的疑虑,虽然用了很长的时间讨论,但我无法说服他改变。 如鲠在喉,于是动笔写出我的意见,与大家交流。欢迎站在我同事的角度来说服我或再多给我一些能说服我同事的理由。

先描述一下同事写的代码,他把DAO当成一个工具类来用,没写实体类,而是讨巧的用Map做容器,用列名做key来存储实体,然后写了一个通用的方法支持增删改查。

我的理解

首先DAO是一种设计模式,用来分离低级别的数据访问逻辑与高级别的业务逻辑; 在实现上,数据访问对象(Data Access Object)是一个对象,它为某类数据库或持久存储系统提供一个抽象接口。应用程序对数据的操作都映射到持久层,DAO提供具体的数据操作而不暴露数据库的详细信息,从而实现底层数据操作逻辑与业务逻辑的分割。 一个典型的DAO实现有以下组件:

  1. 一个获取DAO对象的工厂类
  2. 一个定义DAO如何操作数据的接口
  3. 一个实现了DAO接口的具体类
  4. 数据传输对象(DTO)或称域对象(Domain)/实体类(Entity)

把DAO层变成一个工具类让我们失去了什么?

  1. Map替代DTO的副作用:
  2. 看不到清晰的业务域对象,不知道哪些域对象具有可用的持久存储;无法利用IDE的自动完成特性;这无疑会降低程序的可读性;
  3. 失去了类型安全性:
  4. 损失了编译时发现某些问题的可能性,可能降低程序的可靠性 ...


Continue reading

不能小瞧的Go语言

Posted on Thu 17 May 2012 in 我记 • Tagged with Program Language, QCon

学习了《Go,互联网时代的C语言》的片子。现场没选这个session,是因为看内容介绍,并不是很看好又一个雄心勃勃要取代Java的语言。为什么说又呢,因为去年的qCon上也有一个类似的topic,介绍的是由redhat创建的号称下一代java语言的Ceylon项目。一年过去了,Ceylon今何在?

许式伟真的很看好Go,自己的公司90%的代码都用Go,已经超过10万行了。可介绍号称是互联网时代的C语言满足的功能读起来也让人感觉平平;直到......

看到介绍Go语言的作者们,我震惊了: Ken Thompson,C语言和Unix系统的创建者 Rob Pike,也来自Bell Lab的Unix小组,也开发过其它操作系统,例如分布式的Plan 9,还是UTF-8的作者 Robert Griesemer,制作了Java的Hotspot编译器和Chrome的V8引擎。

看吧,有这些系统大佬在后面,我也对Go语言的前景充满信心了。

主站上列出了作者和贡献者名单,上面提到的三位都只在贡献者名单中。看名单前面的注释,列作者是为了版权原因,而贡献者都是经常贡献代码的。 主站上的作者名单,212人,相当彪悍 贡献者名单,303人 ...


Continue reading

用Python实现应用Last-Modified和ETag避免下载重复内容

Posted on Wed 09 November 2011 in it • Tagged with HTTP, Program Language, Python

Http 1.1中避免重复下载的标记

使用Http1.1中定义好的头信息来避免重复下载,参考HTTP/1.1 Section 14 Header Field Definitions中的14.19 ETag/14.24 If-Match/14.29 Last-Modified/14.25 If-Modified-Since

开发者把Last-Modified 和ETags请求的http报头一起使用,能够有效利用本地缓存,降低无谓的重复下载。

示例代码逻辑

  1. 客户端下载一个链接(Sample);
  2. 服务器返回Sample,Sample中记录Last-Modified/ETag标记;
  3. 客户端再次下载这个链接,并将上次请求时服务器返回的Last-Modified/ETag一起传递给服务器;
  4. 服务器检查该Last-Modified或ETag,并判断出该页面自上次客户端请求之后还未被修改,直接返回响应304和一个空的响应体。 其实在《Dive Into Python》中就有相当详细的实例代码,强烈建议没看过这本书的python程序员们认真学习一下,会提升面向对象编程和网络编程能力的。

示例代码 ...


Continue reading

[感想]看编程语言流行趋势

Posted on Wed 12 October 2011 in 我记 • Tagged with Program Language

TIOBE的流行语言排行榜

看TIOBE公布的10月编程语言流行排行榜,标题是“Java正在失去它的位置,尽管它发布了新的第7版”。看来Oracle在技术领域的人缘儿赶不上Sun啊,应该找点儿托儿为Java 7摇旗呐喊。

TIOBE 编程语言社区排行榜是编程语言流行趋势的一个指标,每月更新。这份排行榜排名基于互联网上有经验的程序员、课程和第三方厂商的数量。排名使用著名的搜索引擎(诸如Google、 MSN 、雅虎、百度)以及Wikipedia和YouTube进行计算,反映了某个编程语言的热门程度,但不能说明一门编程语言好不好,或者一门语言所编写的代码数量多少。   这个排行榜可以用来考查你的编程技能是否与时俱进,也可以在开发新系统时为选择语言做决策参考。

感想

当前的几个团队主要用Java/Python/C/C++/PL SQL,还有一些PHP/JavaScript/Shell,除了Shell排名28位,其它都是Top20的语言。从流行度上来看,还真挺与时俱进的。   但团队里面有这么多种语言,其实很容易产生技术债务的,人员复用也很难做到。由于PHP的使用范围比较小,团队已经开始在去PHP化了。   想了一个比喻,选语言就像中医开方子:前提条件是懂医理能搞懂要治什么(需求)、知药性(这些语言都适合做什么 ...


Continue reading

编程语言的入门书籍

Posted on Tue 07 September 2010 in 我读 • Tagged with Program Language, Reading, 入门

编程语言的入门书籍

前些日子和apple的同事一块儿吃饭,其中有个小伙子特别好学,报班学习视频编辑和设计。按照他们老师的说法,他还最好再学习一下C/C++/C#/.net/Java。套用他们老师的一句话,这个老师要么是把学生们都当作天才,要么就是在逗学生们玩了。 拉回正题,今天写这篇文字的目的是整理和总结一些语言的入门书籍,下次再有人问我学某某语言该看什么书,我也好对答如流(C++的学习信息来自网络,不是我亲身实践,声明一下)。

C

由Kernighan和Ritchie编写的《C程序设计语言》是公认的入门经典。

这是一本可以当作枕边书的学习教材,200来页,简单而优雅。忘掉谭老师吧。

C++

C++是一个多泛型的语言,属于难学难精的语言。如果你够聪明且有足够的精力,那么可以这样学习:

入门

  • 《C++ Primer》: 有中文版了,1000多页的书。
  • Stroustrup的《C++程序设计语言》: 900多页,貌似更经典的说。
由此可见C++比C要复杂得多。

高效使用

《More Effective ...


Continue reading

QCon第一天见闻

Posted on Fri 23 April 2010 in it • Tagged with Architecture, Program Language, QCon

今天是非常充实的一天:早上7点起床,8点出发,9点进场,上午2场下午4场主题演讲听得非常过瘾,到家后头脑还非常兴奋,开始准备整理一下思维,记录一下今天听讲的感想。

一开场,主持人就告诉大家一个消息,Erich Gamma因为冰岛的火山灰原因,无法出席本次QCon了,他自己深表歉意,并承诺,下次他来北京演讲,本次参加的人都可以去免费听,作为补偿。

Michael Nygard - 《失败来临的征兆》-四星

这是第一个演讲,当时坐得有点儿远看不清楚ppt,听得有些云山雾罩。这里有人做了笔记,回来仔细看了看,觉得很不错。

首先给了两个假设: 1. 用户关注功能而不是你使用什么软件硬件; 2. 失败和错误总会发生。然后引出了工程化失败模型。

工程化失败模式(Engineering Failure Modes)

  1. 容忍:将震荡吸收,而不是传递它
  2. 服务能力:功能缩水而不是整个损坏
  3. 恢复能力:允许组件重启,而不是让整个世界“重新启动”
  4. 弹性:能够从瞬时性 ...


Continue reading

【转载】快速掌握一个语言最常用的50%

Posted on Tue 06 October 2009 in 转载 • Tagged with Program Language

来源: 孟岩的blog

现在的开发工作要求我们能够快速掌握一门语言。一般来说应对这种挑战有两种态度:其一,粗粗看看语法,就撸起袖子开干,边查Google边学习;其二是花很多时间完整地把整个语言学习一遍,做到胸有成竹,然后再开始做实际工作。然而这两种方法都有弊病。第二种方法的问题当然很明显,不仅浪费了时间,偏离了目标,而且学习效率不高。因为没有实际问题驱动的语言学习通常是不牢固不深入的。有的人学着学着成了语言专家,反而忘了自己原本是要解决问题来的。第一种路子也有问题,在对于这种语言的脾气秉性还没有了解的情况下大刀阔斧地拼凑代码,写出来的东西肯定不入流。说穿新鞋走老路,新瓶装旧酒,那都是小问题,真正严重的是这样的程序员可以在短时间内堆积大量充满缺陷的垃圾代码。由于通常开发阶段的测试完备程度有限,这些垃圾代码往往能通过这个阶段,从而潜伏下来,在后期成为整个项目的毒瘤,反反复复让后来的维护者陷入西西弗斯困境。

实际上语言学习有一定规律可循,对于已经掌握一门语言的开发者来说,对于一般的语言,完全可以以最快的速度,在几天至一周之内掌握其最常用的50%,而且保证路子基本正宗,没有出偏的弊病。其实真正写程序不怕完全不会,最怕一知半解的去攒解决方案。因为你完全不会,就自然会去认真查书学习,如果学习能力好的话,写出来的代码质量不会差。而一知半解,自己动手土法炼钢,那搞出来的基本上都是废铜烂铁。比如错误处理和序列化,很多人不去了解“正路子 ...


Continue reading

我感兴趣的编程语言和199种语言写的HelloWorld

Posted on Fri 27 March 2009 in 我用(IT) • Tagged with Program Language

  • 我感兴趣的一些语言 (按照语言诞生顺序)
    1. Smalltalk
    2. Smalltalk是诞生于1960年左右的第二个面向对象的程序设计语言(第一个是Simula,见Wiki

      Smalltalk很牛,对Java、Python、C++等语言的产生起到了推动作用;对设计模式、XP、重构等开发思想也产生了深远影响。

    3. LISP
    4. LISP(全名LISt Processor,即列表处理语言),由约翰·麦卡锡在1960年左右创造的一种基于λ演算的函数式编程语言。

      LISP 是第一个函数型编程语言,主要应用在人工智能(AI)上,包含语多字符撷取函数,供作自然语言的分析之用。

       详见Wiki

    5. AWK
    6. AWK诞生在1970s的贝尔实验室,是一种文本处理工具和语言(文件或数据流)。

      AWK 提供了极其强大的功能:可以进行正则表达式的匹配,样式装入、流控制、数学运算符、进程控制语句甚至于内置的变量和函数。

      详见Wiki

    7. Erlang
    8. Erlang诞生于1987年,是运行于虚拟机的解释性语言 ...


Continue reading