##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)>>]