当DP遇见Py(一) -- 简单工厂模式

前言

什么是设计模式?

设计模式(Design Pattern)的提出,是面向对象程序设计演化过程中的一个重要里程碑。正如Gamma,Helm,Johnson和Vlissides在他们的经典著作《设计模式》一书中所说的:设计模式使得人们可以更加简单和方便地去复用成功的软件设计和体系结构,从而能够帮助设计者更快更好地完成系统设计。

Python 与设计模式

设计模式是一种设计思想,语言是实现思想的工具。因此,不同语言的特性影响了设计模式的实现,有些语言更容易实现设计模式,而有些语言则比较难。
在讲设计模式的书籍中基本上都是以静态语言来实现的,如:《设计模式》主要以C++为主、《Head First 设计模式》使用Java、《大话设计模式》使用C#等等。那么,以Python为代表的动态语言怎么样来实现设计模式呢?
Python 是一种完全面向对象的动态语言,提供了与传统面向对象语言截然不同的对象模型,影响了设计模式的实现和使用。本系列尝试用Python语言来实现设计模式,并与C++的实现方式进行比较,进一步体现Python中的“动态性”及其具体应用。

Python中文处理

摘要

在Python(Python2.x)中使用中文字符常常给我们带来困扰。经常会遇到以下的错误:

1
UnicodeDecodeError: ’ascii’ codec can’t decode byte 0xe9 in position 1: ordinal not in range(128)

这是由于中文的字符编解码错误造成的。下面就让我们来研究一下字符编码和Python 的字符处理机制。注:本文Python 的内容仅适用于2.x,如果你使用3.x,那么恭喜你,你将不存在这些问题。

借用《Dive into Python3》中的一句话:

“你所了解的关于字符串的知识都是错的。”

C语言基础之内存分配

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
// main.c
#include <stdio.h>

int a1 = 0; // a1 在全局已初始化数据区
static int sa = 0; // sa 为全局(静态)数据,存在于已初始化数据区
int a2 = 0; // a2 同a1
int b; // b 未初始化全局变量,在bss区
int main()
{

int c1 = 1; // c1 在栈区
int c2; // c2 同c1

char *d = (char *)malloc(10);// d 在栈区,分配的10个字节在堆区
char *e = (char *)malloc(20);// e 在栈区,分配的20个字节在堆区

static int f = 0; // f 同sa

char *g = "123"; // g 在栈区,123\0 为常量,数据区(只读)

printf("a1:%p\n",&a1);
printf("a2:%p\n",&a2);
printf("sa:%p\n",&sa);
printf("f :%p\n",&f);
printf("b :%p\n",&b);
printf("c1:%p\n",&c1);
printf("c2:%p\n",&c2);
printf("d :%p\n",&d);
printf("e :%p\n",&e);
printf("g :%p\n",&g);
printf("*d:%p\n",d);
printf("*e:%p\n",e);
printf("*g:%p\n",g);
printf(" :%p\n",&"123"); // 123\0 为常量,数据区(只读)

free(d);
free(e);

return 0;
}

vim之godef

目录
  1. 安装步骤
  2. 使用方法

最近在研究Golang,作为Vimer当然要配置vim来建立Go的工作环境。对于一门语言的初学者来说,学习别人的代码,能够对代码中的符号进行自动跳转是比较重要的。安装godef和相应插件,就可以实现这个功能。

安装步骤

  • go get code.google.com/p/rog-go/exp/cmd/godef
  • git clone https://github.com/dgryski/vim-godef.git ~/.vim/bundle/vim-godef

使用方法

在Go代码文件,把光标移到一个函数或变量上,在命令模式下输入gd。vim会显示这个函数的定义。详细配置参见vim-godef


vim-godef提供了三种跳转方式:

  1. 切割窗口

    g:godef_split=1
    
  2. 打开新新窗口

    g:godef_split=2
    
  3. 在文件内的符号步切割窗口

    g:godef_same_file_in_same_window=1
    

感觉这三种方式都不是很爽,希望要的是:

  • 在文件内的符号切割窗口
  • 在文件外的符号打开新窗口

小小修改了一下vim-godef的插件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
if out =~ 'godef: '
let out=substitute(out, '\n$', '', '')
echom out
elseif g:godef_same_file_in_same_window == 1 && (out) =~ expand('%:t')
lexpr out
else
if g:godef_split == 1
split
elseif g:godef_split == 2
if (out) =~ expand('%:t')
split
else
tabnew
end
endif
lexpr out
end

~/.vimrc中添加:

let g:godef_split=2

搞定!