作者归档:admin

从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年,不得了,算得上写了很长时间了。

此后,何去何从?

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

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

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

PHP设计模式笔记:使用PHP实现模板方法模式

PHP设计模式笔记:使用PHP实现模板方法模式

【意图】
定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。Template Method 使得子类可以在不改变一个算法的结构的情况下重定义该算法的某些特定的步骤【GOF95】

【模板方法模式结构图】

Template Method

Template Method

【模板方法模式中主要角色】
抽象模板(AbstractClass)角色: 定义一个或多个抽象方法让子类实现。这些抽象方法叫做基本操作,它们是顶级逻辑的组成部分。
定义一个模板方法。这个模板方法一般是一个具体方法,它给出顶级逻辑的骨架,而逻辑的组成步骤在对应的抽象操作中,这些操作将会推迟到子类中实现。同时,顶层逻辑也可以调用具体的实现方法

具体模板(ConcrteClass)角色:实现父类的一个或多个抽象方法,作为顶层逻辑的组成而存在。

每个抽象模板可以有多个具体模板与之对应,而每个具体模板有其自己对抽象方法(也就是顶层逻辑的组成部分)的实现,从而使得顶层逻辑的实现各不相同。

【模板方法模式适用场景】
1、一次性实现一个算法的不变的部分,并将可变的行为留给子类来实现。
2、各子类中公共的行为应被提取出来并集中到一个公共父类中以避免代码重复。
3、控制子类扩展。

【模板方法模式与其它模式】
1、策略模式(strategy模式):模板方法使用继承来改变算法的部分,策略模式使用委托来改变整个算法。区别在于封闭的变化不同,一个变化的部分,一个变化的是整体。
2、工厂方法模式(factory method模式):Factory Method模式常被模板方法调用。
【模板方法模式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
<?php
/**
 * 模板方法模式简单示例 2010-09-12 sz
 * @author phppan.p#gmail.com  http://www.phppan.com                                                       
 * 哥学社成员(http://www.blog-brother.com/)
 * @package design pattern
 */
 
/**
 * 抽象模板角色
 * 定义抽象方法作为顶层逻辑的组成部分,由子类实现
 * 定义模板方法作为顶层逻辑的架子,调用基本方法组装顶层逻辑
 */
abstract class AbstractClass {
 
    /**
     * 模板方法 调用基本方法组装顶层逻辑
     */
    public function templateMethod() {
        echo 'templateMethod begin.<br />';
        $this->primitiveOperation1();
        $this->primitiveOperation2();
        echo 'templateMethod end.<br />';
    }
 
    /**
     * 基本方法1
     */
    abstract protected function primitiveOperation1();
 
     /**
     * 基本方法2
     */
    abstract protected function primitiveOperation2();
}
 
/**
 * 具体模板角色
 * 实现父类的抽象方法
 */
class ConcreteClass extends AbstractClass{
    /**
     * 基本方法1
     */
    protected function primitiveOperation1() {
        echo 'primitiveOperation1<br />';
    }
 
     /**
     * 基本方法2
     */
    protected function primitiveOperation2(){
        echo 'primitiveOperation2<br />';
    }
 
}
 
/**
 * 客户端
 */
class Client {
 
     /**
     * Main program.
     */
    public static function main() {
        $class = new ConcreteClass();
        $class->templateMethod();
    }
}
 
Client::main();
?>

【模板方法模式】
模板方法是一种代码复用的基本技术,模板方法导致一种反射的控制结构,这指的是一个父类调用子类的操作。
其实现过程:准备一个抽象类,将部分逻辑以具体方法以及具体构造子的形式实现,然后声明一些抽象方法来迫使子类实现剩余的逻辑。不同子类可以以不同的方式实现这些抽象方法,从而对剩余的逻辑有不同的实现。

【重构的原则】
重构时应当遵守的原则是:将行为以是移到结构的高端,而将状态尽量移动到结构的低端。
Auer曾在文献【AUER95】中指出:
1、应当要所行为而不是状态定义一个类。
2、在实现行为是,是用抽象状态而不是用具体状态。
3、给操作划分层次。
4、将状态的确认推迟到子类中。在父类中,如果需要状态属性的话,可以调用抽象的取值方法,而将抽象的取值方法的实现放到具体子类中。
如果可以遵守以上的而,那么就可以在等级结构中将接口与实现分离,将抽象与具体分离,从而保证代码可以最大限度的被复用。

PHP帮助手册拾遗三:类与对象

PHP帮助手册拾遗:类与对象

1、__autoload函数
__autoload函数定义时必须包含一个参数,否则会显示如下错误:
Fatal error: __autoload() must take exactly 1 argument

在 __autoload 函数中抛出的异常不能被 catch 语句块捕获并导致致命错误。

2、父类的构造方法调用
如果子类中定义了构造函数则不会暗中调用其父类的构造函数。要执行父类的构造函数,需要在子类的构造函数中调用 parent::__construct()。这里python和php一样

3、父类的析构方法调用
和构造函数一样,父类的析构函数不会被引擎暗中调用。要执行父类的析构函数,必须在子类的析构函数体中显式调用 parent::__destruct()。
析构函数在脚本关闭时调用,此时所有的头信息已经发出。
试图在析构函数中抛出一个异常会导致致命错误。

4、访问限制
var与public在类中的变量定义相同,但是在php5的php5.1.3会生成一个E_STRICT警告
方法如果没有设置访问控制,则将默认设置为public

5、构造方法
PHP提交两种构造方法,以类名和__construct,当类中没有__construct方法时,PHP会调用类名函数,但是如果存在__construct时,不管其访问控制是什么,都不会调用类名函数。
如下所示代码:

1
2
3
4
5
6
7
8
9
10
11
class Demo {
    public function Demo() {
       echo 'Demo function';
    }
 
    private function __construct() {
       echo '__construct function';
    }
}
 
$demo = new Demo();

运行会报错:Fatal error: Call to private Demo::__construct() from invalid context
ps:上面的这个问题是ben前辈提出的,感谢ben前辈昨天的指导

6、静态变量
PHP5.3以后,可以使用变量引用类,但是这个变量不能是关键字(如self,parent,static等)。如下所示代码:

1
2
3
4
5
6
class Demo {
    public static $my_static = 'Demo';
}
 
$classname = 'Demo';
print $classname::$my_static . "\n"; // As of PHP 5.3.0

7、接口
接口可以有常量,不能有变量,并且常量在其子类中无法重载
如下所示代码:

1
2
3
4
5
6
7
8
9
10
11
interface Base {
    const constant = 'constant value';
    public $var = "test var";
}
 
class Foo implements Base {
 
}
 
echo Base::constant;
echo Base::$var;

以上代码报错为:Fatal error: Interfaces may not include member variables
注释掉对变量的操作后可以正常打印常量中存放的值。
8、对象迭代
在PHP5中,使用foreach,遍历一个对象,可以访问这个对象的所有可以访问的属性
如果要自定义迭代器,可以通过实现一个叫Iterator的接口来实现
9、单例模式
单例模式(singleton模式)在实现过程中,需要考虑__clone方法。
10、对象与引用
PHP5之后,对象在默认情况下是以引用的方式传递的。