设计模式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来实现。

这样每次new 一个converter,然后调用他的cnvt函数就可以了。

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

2008-09-17-144452_719x609_scrot.png

编码对应式~黄毅

黄毅 <[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]

MiscItems/2008-09-18 (last edited 2009-12-25 07:18:20 by localhost)