设计模式vsPythonic~数据转换
题面儿
关于“设计模式”的一个问题 - python-cn`CPyUG`华蟒用户组 | Google 网上论坛 {{{victor <[email protected]> reply-to [email protected] to python-cnCPyUG华蟒用户组 <[email protected]> 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 <[email protected]> reply-to [email protected] to [email protected] date Wed, Sep 17, 2008 at 14:14 subject [CPyUG:65882] Re: 关于“设计模式”的一个问题
2008/9/17 victor <[email protected]>: > > 如果一个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
编码对应式~黄毅
黄毅 <[email protected]> reply-to [email protected] to [email protected] date Thu, Sep 18, 2008 at 00:25 subject [CPyUG:65953] Re: 关于“设计模式”的一个问题
考虑 字符串 和 unicode 之间的这种关系
1 def encode_fmt1(midi_fmt_data):
2 return fmt1_data
3
4 def decode_fmt1(fmt1_data):
5 return midi_fmt_data
6
7 #...
8
9 encoders = {
10 fmt1: encode_fmt1,
11 #...
12 }
13
14 decoders = {
15 fmt1: decode_fmt1,
16 #...
17 }
18
19 def transform(data, fmt_from, fmt_to):
20 encoder = encoders[fmt_from]
21 decoder = decoders[fmt_to]
22 return encoder(decoder(data))
反馈
创建 by -- ZoomQuiet [2008-09-17 23:40:17]