作者归档:admin

数据源架构模式之表数据入口

数据源架构模式之表数据入口

【表数据入口的意图】
充当到数据库表的入口的对象。一个实例处理表中的所有行。
表数据入口包含了用于访问单个表或视图的所有SQL,如CRUD等。其它的代码调用它的方法来实现所有与数据库的交互。

【表数据入口的适用场景】
1、表数据入口可以同表模块一起使用。
2、适用于事务脚本处理

【表数据入口的运行机制】
表数据入口的实现非常简单,一般会包括几个从数据库中获取数据的查找方法以及更新,插入和删除方法。
每个方法都将输入参数映射为一个SQL调用并在数据库连接上执行该语句。

【表数据入口的优点和缺点】
1、简单。表数据入口可能是使用起来最简单的数据库接口模式。
2、为数据源的精确访问逻辑提供了一种自然的方法。
3、相同的接口即可以用于SQL操作操作数据库,又可以用于存储过程。

【表数据入口的PHP示例】

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
<?php
/**
 * 企业应用架构 数据源架构模式之表数据入口 2010-09-18 sz
 * @author phppan.p#gmail.com  http://www.phppan.com
 * 哥学社成员(http://www.blog-brother.com/)
 * @package architecture
 */
 
class PersonGateway {
 
    /**
     * 查询所有人员数据
     * @return <type>
     */
    public function findAll() {
        $sql = "SELECT * FROM person";
        return DB::query($sql);
    }
 
    /**
     * 根据名字查找人员数据
     * @param <type> $name
     * @return <type>
     */
    public function findByName($name) {
        $sql = "SELECT * FROM person WHERE `name` = '" . $name . "'";
        return DB::query($sql);
    }
 
    /**
     * 更新人员数据
     * @param <type> $key   关键字
     * @param <type> $data  需要更新的数据, 例如:$data = array('id' => 1, 'name' => 'Martin', 'birthday' => '');
     */
    public function update($id, $data) {
        if (empty($id) || !is_array($data)) {
            return FALSE;
        }
 
        $sql = "UPDATE person SET ";
        foreach ($data as $field => $value) {
            $sql .= "`" . $field . "` = '" . $value . "',";
        }
        $sql = substr($sql, 0, -1);
 
        $sql .= " WHERE id = " . $id;
 
        return DB::query($sql);
    }
 
    /**
     * 插入人员的数据
     * @param <type> $data 需要写入的数据, 例如:$data = array('name' => 'Martin', 'birthday' => '');
     */
    public function insert($data) {
        if (!is_array($data)) {
            return FALSE;
        }
 
        $sql = "INSERT INTO person ";
        $sql .= "(`" . implode("`,`", array_keys($data)) . "`)";
        $sql .= " VALUES('" . implode("','", array_values($data)) . "')";
 
        return DB::query($sql);
    }
 
}
 
class DB {
 
    /**
     * 这只是一个执行SQL的演示方法
     * @param string $sql   需要执行的SQL
     */
    public static function query($sql) {
        echo "执行SQL: ", $sql, " <br />";
    }
}
 
/**
 * 客户端调用
 */
class Client {
 
     /**
     * Main program.
     */
    public static function main() {
        $person = new PersonGateway();
 
        header("Content-type:text/html; charset=utf-8");
        $data = array('name' => 'Martin', 'birthday' => '2010-09-15');
        $person->insert($data);
 
        $id = 1;
        $data['id'] = $id;
        $person->update($id, $data);
 
        $person->findAll();
 
        $person->findByName('Martin');
    }
}
 
Client::main();
 
?>

如上所示代码仅为一个演示版本
然而这个演示版本有一些可以优化的地方,如:将更新和插入的SQL拼装过程可以提取出来等。

数据表接口是一个很简单的数据源模式,这在我们平常的工作中也有用到,有可能看起来与上面的例子相差较大,但是可能只是将某些方法进行了优化而已,究其本质是一样的。

一道经典的智商测试题 十只兔子

一道经典的智商测试题(十只兔子)
题目是一个童谣:
大兔子病了,
二兔子瞧,
三兔子买药,
四兔子熬,
五兔子死了,
六兔子抬,
七兔子挖坑,
八兔子埋,
九兔子坐在地上哭起来,
十兔子问它为什么哭?
九兔子说:
五兔子一去不回来!

五兔子是被杀的,这是一个有预谋的凶杀案,大家能推出哪只兔子是这个案件的主谋吗?

答案:?
我在百度百科答案基础上的另一种猜想:

这是一个有预谋的弑兄夺嫂情杀案。

http://zhidao.baidu.com/question/182305887.html?pn=0

1.首先,兔子也是有阶级的,大兔子病了,要治它的病,就必须不惜一切代价,甚至牺牲一只兔子做药引。
2.病的是大兔子,五兔子却突然死了,显然是被做成了药引。
3.”买药”其实是黑话,因为实际上只需要一些简单的草药,主要是药引,所以这个”买药”指的是去杀掉做药引的兔子,三兔子是一个杀手。
4.做药引的为什么是五兔?因为哪只兔子适合做药引是由医生决定的,二兔子就是医生。
5.可以推出,二兔子借刀杀兔搞死了五兔子,他们之间有什么过解呢?可能是情杀,因为一只母兔。
6.谁是母兔呢?想一下,女人爱哭的天性,所以九兔是母兔,九兔也知道了真相,所以才哭,因为她爱的是五兔。
7.”六兔子抬”,这明显是病句,一只兔子怎么抬?他显然是被抬,因为他死了,所以才会被抬。抬他的两只兔子随后一个挖坑,一个埋尸。没错,抬他来的就是七八两只兔子!
8.六兔子是被七八两只兔子杀的吗?不是,他是被杀手三兔子杀死的。三兔子本来不想杀他,五兔子和六兔子关系非常好,当时他们正好在一起,并联手抵抗,所以三兔子才把他们一起杀了。
大家会发现,每相临的两只兔子关系都是微妙的。1-2 大兔子像皇上,二兔子就是他身边进谗言的小人。3-4 三兔子是杀手,四兔子药师,他俩都是助纣为虐型的,四兔经常给皇帝做一些壮阳药什么的,把皇上搞生病了,又亲自熬兔子药引。5-6 一对好朋友,经常在一起吟诗作对,不惧怕恶势力,五兔很有才华,怪不得被九兔所爱又被二兔嫉妒呢,物以类聚,六兔也很有才,可惜都属于文人,两个人的武工加一起也没打过三兔。 7-8也是一对好朋友,但属于随风倒型的,为了保住命,什么事都肯做,本质不算坏,但经常被坏人指始做坏事。9-10在女人哭的时候,身边一定会有爱她的男人,而她的哭泣一定是为了她爱的男人。可惜,爱她的兔子和她爱的兔子不是一只兔子。很明显了吧,十兔暗恋九兔,关心她,看到她哭,他当然要去问原因。
9.最后一点分析了,也许是多余。事情是这样的,三兔和五六两兔打斗过程中,引来了七八两兔。当五六被杀死后,三兔已没有力气,况且七八平时都很听话,不会告密的。所以三兔就放过了七八两兔,并让他们把六兔抬走,埋了。七八一看,命保住了,反正事情也发生了,无法挽回,只好照办理。
后记1:回看第5条,情杀不是随便猜出来的,观全局,二兔位高权重,但即便这样,也有他得不到的东西,那就是真爱。所以他杀五兔的原因很可能是这个,而且五兔正直,应该平时就经常与他作对,所以才起了杀心。
后记2:其实五兔死得非常惨,因为二兔疯狂妒忌他,所以不想让他成为一个正常的男人。再说皇上吃了药师的药,荒淫无度,哪里最虚弱大家应该都知道吧,所谓吃什么补什么,其实五兔被做成药引的部位应该是……
推理的补充
(1)作为一个完整的故事,必然要有因果关系,这个故事有了果(即情杀,下面再谈),但没有因,所以显得不完整,就是大兔子为什么病了?无缘无故的病了便引发了以下的血案么?显然不是。
(2)从一个严密的逻辑上来看,这个故事中所有人物的出现(兔子)都是有联系的,且每一个按序列排下来的兔子之间都存在因果关系(动机),比如:大兔和二兔,二兔和三兔.三兔和四兔(这个上文已经大致说明了,我就不进一步讲了),但大家有没有觉得,10兔子的出现好象在这个逻辑中显得微不足道,即没有 10兔子这个故事也能顺理成章的结束,因此10兔子在这个逻辑中的动机显得苍白。
结论:
根据以上的推断,我们都忽视了这个故事的重点,就是10兔子,他为什么出现在这个故事中?难道仅仅为了引出9兔子的一句话么?错了,这是一个有预谋的凶杀案,而且,10兔子就是这个案件的主谋(不是2兔子),其他所有的兔子都是在他全盘计划中的一枚棋子,案发过程大致如下(补充上文):
(1)10兔子喜欢9兔子,9兔子不喜欢他
(2)5兔子和9兔子互相喜欢
(3)10兔子妒忌
(4)10兔子是大兔子身边最亲信的人,并且对其他兔子之间的关系了如指掌(也就是说,他很清楚大兔子如果病了接下来会发生些什么事)
(5)5兔子也是朝中权贵,10兔子没办法随便处置他。
(6)所以10兔子就让大兔子病了,接下来的一切就像上文说的那样发生了……
到这里是百度百科上的答案,可是还没分析完:

9兔子说的最后一句话:一去不回来,为什么是一去呢?因为他们是住在一起的,所以9兔子和5兔子是夫妻,而10兔子为什么会出现呢?因为5兔子是10兔子的哥哥,他们兄弟俩住一起,根据古代女子的再婚:哥哥死后嫂子嫁给小叔子,可见当5兔子死后,10兔子就可以娶9兔子了。

所以,贯穿整个这个故事的主线就是10兔子,他是这个故事的结尾也是这个故事的主因,这样这个逻辑才显得天衣无缝,故事的名字就是:弑兄夺嫂,借刀杀人!

以上纯属虚构,如有雷同,与我无关

从Facebook与Google Adwords代码想到的

从Facebook与Google Adwords代码之间的差距想到的
缘起:
最近缠绵于Facebook与Google之间。需要写Facebook插件,需要写adwords相关程序,对比之下,就有了如下的文字。

话说如何创建Facebook应用,可以参照Facebook App开发或官方文档。

下面就如下几个方面对比下两边的代码:

文件结构

Facebook是三个文件和一堆在线的文档。在这三个文件有包含测试驱动的文件,一个很简单的示例,一个我们可以调用的简单sdk。给人的感觉,很随意。
Google是一个压缩包,包括N个文件夹和N层的结构,其中包括针对每个实体每个服务的详细示例,包括测试数据等等。给人的感觉,很专业。

代码规范

我们可以看到google的代码有严格按照代码规范来写,对每个文件有详细的注释(在头部可能有超过30行的注释),空格等都比较注意,根据其注释是可以生成相关的说明文档的。
Facebook的核心代码只有一个文件,针对每个函数都有注释,但是在空格,访问控制说明方面有所欠缺(换句话说,它的规范与我理解中的规范不一样)。也许是其不需要这样,因为仅仅有一个文件。

程序示例

facebook的示例是一个很简单的登录示例。在其官网上有很多在线的帮助文档,只是也仅仅只有程序员会去看一个产品的帮助文档,相对于一个好的示例,或者一些完整一点的示例,我相信大多数人都会选择看示例,而不是文档。
Google对于每个实体都会有相对应的实例,开发人员可以在这个基础上直接修改代码,从而达到自己的目的。另外在其站点上也有详细的说明文档,包括各个参数的说明等等。

可能此时会有人说了,adwords是要付钱的,facebook是不要钱

是的,事实是这样的,可以在某些时候,我们需要看到细节决定成败

另外:在示例或者帮助说明这块,omniture做得很好,不仅有帮助文档还有omniture大学,omniture视频等等

在这里,我们假设Facebook的代码是一个新手写的,Adwords的代码是一个老手写的,此时就引出了另一个问题—经验值多少钱,就国内的形势,程序员到一定的年龄就考虑转型,对比其它行业,一个人在一个领域专注至少10年,20年,最后才是专家,而在程序这块,5年,8年,不得了,算得上写了很长时间了。

此后,何去何从?

年轻无极限,成长是要付出代价的。
最近浮躁了,也该淡定下

以上只是一个写完程序的程序员在休息时候的胡思乱想,仅此而已!

附:最近看财经郎眼,看郎教授暴粗口,很爽!