##language:zh
#pragma section-numbers off
##含有章节索引导航的 ZPyUG 文章通用模板
<<TableOfContents>>
## 默许导航,请保留
<<Include(ZPyUGnav)>>


= 设计模式vsPythonic~数据转换 =


##startInc
== 题面儿 ==
[[http://groups.google.com/group/python-cn/browse_thread/thread/c6310bdc6e576e18/b59c386a0354ff13|关于“设计模式”的一个问题]]^ - python-cn`CPyUG`华蟒用户组 | Google 网上论坛^
{{{victor <hanhanab@gmail.com>
reply-to	python-cn@googlegroups.com
to	python-cn`CPyUG`华蟒用户组 <python-cn@googlegroups.com>
date	Wed, Sep 17, 2008 at 13:24
subject	[CPyUG:65860] 关于“设计模式”的一个问题
}}}	
俺在项目里面要用到一个软件结构,不知道用什么模式设计比较好些。:)
当初设计模式也学的不是很深,只好求助于各位大侠。

=== 软件的大体功能是这样的: ===

有多种格式的数据要convert 到另外多种格式:
{{{
Fmt1  conv_mid                    conv_dest    Fmt1
Fmt2  --------------->   mid_fmt  ----------------> Fmt2
Fmt3                                                      Fmt3
...                                                          ...
}}}
=== 下面是我的思路: ===
我设计了两个converter类,类里面分别有一个函数:
{{{
class SrcConv:
   def cnvt(self, src_data, mid_data):...
class MidConv:
   def cnvt(self, mid_data, des_data):...

在cnvt这个函数里面肯定不能用
if src_data.fmt is Fmt1:...
elif src_data.fmt is Fmt2:...
...
或
if des_data.fmt is Fmt1:...
elif des_data.fmt is Fmt2:...
...
}}}
这种多重判断的结构,太不OO了,所以我想肯定有一种设计模式跟这种情况是对应的,
我是想用factory pattern来实现。
 * (1)把两个converter类变成虚基类,继承类每种conveter都有自己的实现,
这样每次new 一个converter,然后调用他的cnvt函数就可以了。
 * (2)写一个ConverterCreater基类,然后分别有ConvMidCreater和
ConvDestCreater继承这个基类,基类是这样定义的:
{{{
class ConverterCreater:
   def creatConverter(self,format):
   def convert(self,format,src,dest):
        converter = self.creatConverter(format)
        converter.cnvt(src,dest)
}}}
这样,如果有新的format增加,只要改两个ConverterCreater的继承类的creatConverter函数
再增加converter类就可以了。

不知道这样设计是不是好,感觉有点生搬硬套"factory 模式",不知道有没有更好的设计,
或是有什么好的改进方法。。。

== 字典式~Limodou ==
{{{
limodou <limodou@gmail.com>
reply-to	python-cn@googlegroups.com
to	python-cn@googlegroups.com
date	Wed, Sep 17, 2008 at 14:14
subject	[CPyUG:65882] Re: 关于“设计模式”的一个问题
}}}	
2008/9/17 victor <hanhanab@gmail.com>:
>
> 如果一个function里面有并列十多个if elif,每个if 下面有几百行代码,那是不是就会让看代码的人
> 很痛苦呢?
>
{{{
source = {'Fmt1':Fmt1class, 'Fmt2':Fmt2class, ...}
des = {'Fmt1':Fmt1class, 'Fmt2':Fmt2class, ...}

def convert(s, d):
   mid = source[s.fmt].convert()
   return mid.convert_to(d.fmt)
}}}
示例代码。没有出错判断。

=== 源头~Zoomq ===
{{attachment:2008-09-17-144452_719x609_scrot.png}}

== 编码对应式~黄毅 ==
{{{
黄毅 <yi.codeplayer@gmail.com>
reply-to	python-cn@googlegroups.com
to	python-cn@googlegroups.com
date	Thu, Sep 18, 2008 at 00:25
subject	[CPyUG:65953] Re: 关于“设计模式”的一个问题
}}}
	
考虑 字符串 和 unicode 之间的这种关系
{{{#!python
def encode_fmt1(midi_fmt_data):
    return fmt1_data
 
def decode_fmt1(fmt1_data):
    return midi_fmt_data
 
#...
 
encoders = {
    fmt1: encode_fmt1,
    #...
}
 
decoders = {
    fmt1: decode_fmt1,
    #...
}
 
def transform(data, fmt_from, fmt_to):
     encoder = encoders[fmt_from]
     decoder = decoders[fmt_to]
     return encoder(decoder(data))
}}}

##endInc

----
'''反馈'''

创建 by -- ZoomQuiet [<<DateTime(2008-09-17T23:40:17Z)>>]