月度归档:2010年06月

PHP5.2.0之前版本使用JSON函数的方法

PHP5.2.0之前版本使用JSON函数的方法
我们知道PHP在其版本5.2.0之后才支持 JSON相关函数,在此版本之前如果我们要使用JSON函数则需要自己实现
JSON的算法已经有人实现了,其下载地址为:http://pear.php.net/pepr/pepr-proposal-show.php?id=198

但是它是一个类这与我们的使用习惯不同,于是我们需要将它包装下,其代码如下:

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
/**
* 对象转换成数组 递归函数
* @param <type> $value 需要转换的值                                
* @return <type>
*/
function object2array($value) {
   if (!(is_array($value) || is_object($value))) {
       return $value;
   }
 
   $array = array();
   foreach ($value as $key => $row) {
       $array[$key] = object2array($row);
   }
 
   return $array;
}
 
/**
* 替换JSON方法
*/
if (!function_exists("json_encode")) {
   include_once("JSON.php");
 
   function json_encode($array) {
       $json = new Services_JSON();
       $json_array = $json->encode($array);
       return $json_array;
   }
 
   /**
    * 解析JSON数据
    * @param string $json_data 需要解析的JSON数据                                                      
    * @param bool $toarray 是否需要解析成数组                                      
    * @return array 返回解析后的数组
    */
   function json_decode($json_data, $toarray = TRUE) {
       $json = new Services_JSON();
       $array = $json->decode($json_data);
 
       if ($toarray) { //  需要转换成数组
           $array = object2array($array);
       }
       return $array;
   }
 
}

不过以上的递归实现在效率上有一些慢,它需要遍历这个数组的所有元素,
如果只限于实现二维数组,可以考虑直接使用循环+类型强制转化来做
【EOF】

PHP设计模式笔记:使用PHP实现门面模式

PHP设计模式笔记:使用PHP实现门面模式

【意图】
为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层次的接口,使得子系统更加容易使用【GOF95】
外部与子系统的通信是通过一个门面(Facade)对象进行。

【门面模式结构图】

门面模式

门面模式

【门面模式中主要角色】
门面(Facade)角色:
此角色将被客户端调用
知道哪些子系统负责处理请求
将用户的请求指派给适当的子系统

子系统(subsystem)角色:
实现子系统的功能
处理由Facade对象指派的任务
没有Facade的相关信息,可以被客户端直接调用
可以同时有一个或多个子系统,每个子系统都不是一个单独的类,而一个类的集合。每个子系统都可以被客户端直接调用,或者被门面角色调用。子系统并知道门面模式的存在,对于子系统而言,门面仅仅是另一个客户端。

【门面模式的优点】
1、它对客户屏蔽了子系统组件,因而减少了客户处理的对象的数目并使得子系统使用起来更加方便
2、实现了子系统与客户之间的松耦合关系
3、如果应用需要,它并不限制它们使用子系统类。因此可以在系统易用性与能用性之间加以选择

【门面模式适用场景】
1、为一些复杂的子系统提供一组接口
2、提高子系统的独立性
3、在层次化结构中,可以使用门面模式定义系统的每一层的接口

【门面模式与其它模式】
抽象工厂模式(abstract factory模式):Abstract Factory模式可以与Facade模式一起使用以提供一个接口,这一接口可用来以一种子系统独立的方式创建子系统对象。Abstract Factory模式也可以代替Facade模式隐藏那些与平台相关的类
调停者模式:Mediator模式与Facade模式的相似之处是,它抽象了一些已有类的功能。然而,Mediator目的是对同事之间的任意通讯进行抽象,通常集中不属于任何单个对象的功能。Mediator的同事对象知道中介者并与它通信,而不是直接与其他同类对象通信。相对而言,Facade模式仅对子系统对象的接口进行抽象,从而使它们更容易使用;它并定义不功能,子系统也不知道facade的存在
单例模式(singleton模式):一般来说,仅需要一个Facade对象,因此Facade对象通常属于Singleton对象。

【门面模式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
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
 
<?php
/**
 * 门面模式 2010-06-12 sz
 * 《Java与模式》上门面模式示例的PHP版本
 * @author phppan.p#gmail.com  http://www.phppan.com
 * 哥学社成员(http://www.blog-brother.com/)
 * @package design pattern
 */
 
class Camera {
 
    /**
     * 打开录像机
     */
    public function turnOn() {
        echo 'Turning on the camera.<br />';
    }
 
    /**
     * 关闭录像机
     */
    public function turnOff() {
        echo 'Turning off the camera.<br />';
    }
 
    /**
     * 转到录像机
     * @param <type> $degrees
     */
    public function rotate($degrees) {
        echo 'rotating the camera by ', $degrees, ' degrees.<br />';
    }
}
 
class Light {
 
    /**
     * 开灯
     */
    public function turnOn() {
        echo 'Turning on the light.<br />';
    }
 
    /**
     * 关灯
     */
    public function turnOff() {
        echo 'Turning off the light.<br />';
    }
 
    /**
     * 换灯泡
     */
    public function changeBulb() {
        echo 'changing the light-bulb.<br />';
    }
}
 
class Sensor {
 
    /**
     * 启动感应器
     */
    public function activate() {
        echo 'Activating the sensor.<br />';
    }
 
    /**
     * 关闭感应器
     */
    public function deactivate() {
        echo 'Deactivating the sensor.<br />';
    }
 
    /**
     * 触发感应器
     */
    public function trigger() {
        echo 'The sensor has been trigged.<br />';
    }
}
 
class Alarm {
 
    /**
     * 启动警报器
     */
    public function activate() {
        echo 'Activating the alarm.<br />';
    }
 
    /**
     * 关闭警报器
     */
    public function deactivate() {
        echo 'Deactivating the alarm.<br />';
    }
 
    /**
     * 拉响警报器
     */
    public function ring() {
        echo 'Ring the alarm.<br />';
    }
 
    /**
     * 停掉警报器
     */
    public function stopRing() {
        echo 'Stop the alarm.<br />';
    }
}
 
/**
 * 门面类
 */
class SecurityFacade {
 
    /* 录像机 */
    private $_camera1, $_camera2;
 
    /* 灯 */
    private $_light1, $_light2, $_light3;
 
    /* 感应器 */
    private $_sensor;
 
    /* 警报器 */
    private $_alarm;
 
    public function __construct() {
        $this->_camera1 = new Camera();
        $this->_camera2 = new Camera();
 
        $this->_light1 = new Light();
        $this->_light2 = new Light();
        $this->_light3 = new Light();
 
        $this->_sensor = new Sensor();
        $this->_alarm = new Alarm();
    }
 
    public function activate() {
        $this->_camera1->turnOn();
        $this->_camera2->turnOn();
 
        $this->_light1->turnOn();
        $this->_light2->turnOn();
        $this->_light3->turnOn();
 
        $this->_sensor->activate();
        $this->_alarm->activate();
    }
 
    public  function deactivate() {
        $this->_camera1->turnOff();
        $this->_camera2->turnOff();
 
        $this->_light1->turnOff();
        $this->_light2->turnOff();
        $this->_light3->turnOff();
 
        $this->_sensor->deactivate();
        $this->_alarm->deactivate();
    }
}
 
 
/**
 * 客户端
 */
class Client {
 
    private static $_security;
     /**
     * Main program.
     */
    public static function main() {
        self::$_security = new SecurityFacade();
        self::$_security->activate();
    }
}
 
Client::main();
?>

Scrum敏捷项目管理读书笔记

Scrum敏捷项目管理读书笔记
由于最近的工作从开发转到了项目管理,所以需要了解一些项目管理的知识。
然后去公司的图书馆借了这本《Scrum敏捷项目管理》,并花了一周的工作之余的时间把它看完了。
总体觉得书有较多的案例,对一些知识点的解释比较到位,也容易理解。只是在工作中用不太到,因为整个公司的项目管理环境是CMMI,最多在本部门小范围的实施一些带点敏捷思想的东东。
【读书摘抄】
不同的项目可能需要不同的管理方法
应以项目成果为导向而非过程为导向
衡量项目成功与否,要看项目成果的商业价值与投资回报,而非仅仅看其有没有超支、延时或按原定计划行事
20/80法则,最大可能满足利益关系人的核心需要
尽可能让核心关系 人参与 并及早展示项目的进展和成果,及时作出必要的调整,以确保更高商业价值的交易。
Scrum只定义了高层次的信息系统开发项目的管理流程,并不涉及具体开发方法或者人员的有效沟通技巧。
其管理文化植根于“帮助他人完成目标”这一概念
Scrum是经验性过程控制
Scrum是围绕着一个迭代、增量的过程骨架展开
Scrum方法中有3个角色:产品负责人(Product Owner)、团队和ScrumMaster
产品负责人代表项目中每位利益相关者的权益,并为项目产出的软件系统负责
团队的责任是开发软件功能,实现自我管理
ScrumMaster对Scrum过程负责,确保所有项目相关人员遵守Scrum规则
项目成员==草场上的羊
ScrumMaster==牧羊犬
产品负责人的职责是提升项目的投资回报
Scrum使项目事项具有可视性
自管理 、涌现机制、可视性和检查/适应循环的根本原则
三个问题:
1、自上次Scrum简会后的一天里我做了什么?
2、从现在到下次Scrum简会的一天时间里我准备做什么?
3、在工作中遇到了哪些障碍?
Scrum是可能的艺术
ScrumMaster的职责:
1、排除产品开发和产品负责人之间的障碍,确保产品负责人直接推动开发工作
2、教授产品负责人如何实现投资回报最大化,以及如何利用Scrum达成目标
3、激发创造力和放权,从而改善开发团队的环境
4、千方百计提高开发团队的生产力
5、改善工程实践和工具,确保每个功能增量都具备潜在可交付性。
6、向各方面确保团队工作进展实时更新并高度可视
“限定时间”可向团队灌输“可能”的艺术,避免过分追求完美;
“增量交货”的举措可改进工程实践;
“放权”和“自组织”能够激发创造力,提升员工满意度
Scrum计划涉及3个问题的解答:
1、项目投资人希望项目结束时能取得哪些成果?
2、每个sprint应做出哪些进展?
3、如何使项目投资人相信该项目是有价值的投资,以及项目申报者有能力将会艰苦收益?
给客户做选择题,给领导做选择题
成功的开发需要不断的检查和调整
只有在全部事项对频繁检查和调整可视的情况下,Scrum才能有效运作。
Scrum的生产力源于:首先选择正确事项,然后高效完成选定事项。在Scrum中,团队自行寻找生产力最大化的方法,计划和执行任务完全由团队完成。
两个或以上Scrum团队同时开发的项目称作“扩展项目”,协调这些团队工作的机制称作“扩展机制”
Sprint计划会议限时8小时,分为两部分,各4小时。第一部分挑选产品Backlog;第二部分准备Sprint Backlog。
Sprint限期为30个连续日历日。
Sprint评审会议限时4小时
评审会议开始后,全体团队成员回答两个问题:
1、上一个Sprint有哪些成功方面?
2、下一个Sprint应做哪些改进?

Scrum敏捷项目管理读书笔记

由于最近的工作从开发转到了项目管理,所以需要了解一些项目管理的知识。

然后去公司的图书馆借了这本《Scrum敏捷项目管理》,并花了一周的工作之余的时间把它看完了。

总体觉得书有较多的案例,对一些知识点的解释比较到位,也容易理解。只是在工作中用不太到,因为整个公司的项目管理环境是CMMI,最多在本部门小范围的实施一些带点敏捷思想的东东。

【读书摘抄】

不同的项目可能需要不同的管理方法

应以项目成果为导向而非过程为导向

衡量项目成功与否,要看项目成果的商业价值与投资回报,而非仅仅看其有没有超支、延时或按原定计划行事

20/80法则,最大可能满足利益关系人的核心需要

尽可能让核心关系 人参与 并及早展示项目的进展和成果,及时作出必要的调整,以确保更高商业价值的交易。

Scrum只定义了高层次的信息系统开发项目的管理流程,并不涉及具体开发方法或者人员的有效沟通技巧。

其管理文化植根于“帮助他人完成目标”这一概念

Scrum是经验性过程控制

Scrum是围绕着一个迭代、增量的过程骨架展开

Scrum方法中有3个角色:产品负责人(Product Owner)、团队和ScrumMaster

产品负责人代表项目中每位利益相关者的权益,并为项目产出的软件系统负责

团队的责任是开发软件功能,实现自我管理

ScrumMaster对Scrum过程负责,确保所有项目相关人员遵守Scrum规则

项目成员==草场上的羊

ScrumMaster==牧羊犬

产品负责人的职责是提升项目的投资回报

Scrum使项目事项具有可视性

自管理 、涌现机制、可视性和检查/适应循环的根本原则

三个问题:

1、自上次Scrum简会后的一天里我做了什么?

2、从现在到下次Scrum简会的一天时间里我准备做什么?

3、在工作中遇到了哪些障碍?

Scrum是可能的艺术

ScrumMaster的职责:

1、排除产品开发和产品负责人之间的障碍,确保产品负责人直接推动开发工作

2、教授产品负责人如何实现投资回报最大化,以及如何利用Scrum达成目标

3、激发创造力和放权,从而改善开发团队的环境

4、千方百计提高开发团队的生产力

5、改善工程实践和工具,确保每个功能增量都具备潜在可交付性。

6、向各方面确保团队工作进展实时更新并高度可视

“限定时间”可向团队灌输“可能”的艺术,避免过分追求完美;

“增量交货”的举措可改进工程实践;

“放权”和“自组织”能够激发创造力,提升员工满意度

Scrum计划涉及3个问题的解答:

1、项目投资人希望项目结束时能取得哪些成果?

2、每个sprint应做出哪些进展?

3、如何使项目投资人相信该项目是有价值的投资,以及项目申报者有能力将会艰苦收益?

给客户做选择题,给领导做选择题

成功的开发需要不断的检查和调整

只有在全部事项对频繁检查和调整可视的情况下,Scrum才能有效运作。

Scrum的生产力源于:首先选择正确事项,然后高效完成选定事项。在Scrum中,团队自行寻找生产力最大化的方法,计划和执行任务完全由团队完成。

两个或以上Scrum团队同时开发的项目称作“扩展项目”,协调这些团队工作的机制称作“扩展机制”

Sprint计划会议限时8小时,分为两部分,各4小时。第一部分挑选产品Backlog;第二部分准备Sprint Backlog。

Sprint限期为30个连续日历日。

Sprint评审会议限时4小时

评审会议开始后,全体团队成员回答两个问题:

1、上一个Sprint有哪些成功方面?

2、下一个Sprint应做哪些改进?