这些格式可以转换成一种通用格式么?比如 嵌套的 dict ,或者xml 之类的
用一个函数, convert(src_data, src_format, target_format)
里面用不着啥模式。
建议直接使用 protocol-buffers 或是 XML 或是JSON 等等标准数据交换支持,
完成之,,,
--
http://zoomquiet.org'''
过程改进乃是催生可促生靠谱的人的组织!
PE keeps evolving organizations which promoting people be good!'''
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)
示例代码。没有出错判断。
--
I like python!
UliPad <<The Python Editor>>: http://code.google.com/p/ulipad/
UliWeb <<simple web framework>>: http://uliwebproject.appspot.com
My Blog: (new)http://http://hi.baidu.com/limodou
(old)http://www.donews.net/limodou
> On Sep 17, 2:14 pm, limodou <limo...@gmail.com> wrote:
>> 2008/9/17 victor <hanha...@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)
>>
>> 示例代码。没有出错判断。
--
我的示例代码不就是吗?每个Fmt类都有自已的convert()方法。上面的代码还可以处理为:
def convert(s, d):
mid = source[s.fmt].convert()
return des[d.fmt].convert(mid)
具体到楼主这个问题,基本需求就是要进行数据的格式转换,如果数据格式有很多,而且可能会需要后期的增加。在这种情况下,需要转换可以尽量容易的增加对新格式的支持,那么采用工厂模式是非常合适的。
需求上我们先考虑对一个数据格式,我们要实现哪些功能,来确定一个新增数据格式工作量最小的需求,每个格式提供这些功能即可。
那么在实现上就非常简单了
首先是对每个确定每个数据格式都要求实现的接口(认为所有格式都是可以和中间格式相互转化的,这个在实际中显然不满足。)
这个接口的实现在Python中可以以类或者模块的方式来实现,看转化过程的需求(比如调用之间有必须保存的中间量那么为了线程安全的考虑,最好用类来实现)。
一个简单的实现如下
def isFormat(data):
...
def convertFromThisFormat(data,**kwargs):
...
def convertToThisFormat(middata,**kwargs):
...
然后就是工厂函数的实现(这个里面增加了对数据是否是指定格式的判定)
def formatFactory(fmt, data=None):
if data is None:
return fmt
if fmt.isFormat(data):
return fmt
else:
raise FormatError, ...
后面直接调用formatFactory返回的fmt的两个转化函数就行了
如果可以通过数据保证每个数据都只属于某一特定格式,那么我们甚至可以实现一种自动判定数据格式的工厂:
_fmts = []
... #从指定目录导入每种格式的模块,并把这个模块加入到_fmts中
def autoFormatFactory(data):
for fmt in _fmts:
if fmt.isFormat(data):
return fmt
raise UnknownFormatError
在这个过程中,所有已存在的格式模块没有任何的改动。
当然了,由于我也不清楚你的具体需求,所以工厂模式也有可能不适合你的应用,这个就得具体情况具体分析了。
足够了,收录在:
http://wiki.woodpecker.org.cn/moin/MiscItems/2008-09-18
--
2008/9/17 Albert Lee <hanzh...@gmail.com>:
>
> 先把设计模式忘掉吧。
>
呃...不明白为什么这么多人讨厌设计模式...设计模式就像uml一样,是给设计人员交流之间提供了一种共同的符号,减少的交流中表意不清造成的代价。
这句话说得好。设计模式主要的一个好处就是减少重复,而上面的话是同样的道理。只要是想到这一点,模式不模式的就无所谓了。
动态语言有自己的模式, 硬套OOP那套模式会很别扭的。尤其是java上的一些模式,根本就是因为语言局限所以才搞的那么麻烦,很多那些模式在python这类语言中根本用不上。所以不要为"我为什么没能把23种模式都用上?"
这种问题而苦恼。
好比拿着辞海不一定写得出红楼梦,
对特定事务/情景的特定解决模式,不能期待可以普适的解决我的相同事务/情景问题,,,因为其它因素太多了,,
设计模式,应该多看,体会人家解决问题的思路,其它的,甭在意了,,,
动态语言有自己的模式, 硬套OOP那套模式会很别扭的。尤其是java上的一些模式,根本就是因为语言局限所以才搞的那么麻烦,很多那些模式在python这类语言中根本用不上。所以不要为"我为什么没能把23种模式都用上?"
这种问题而苦恼。
听了大家的讨论,觉得自己的问题已经上层次了。。。呵呵
好吧,我发表一下自己对设计模式的看法
我觉得设计模式很"博大精深",是很"靠谱"的东西,特别是当你用面向对象的思想设计大型软件的时候,不管你用什么语言实现,很多模式都可以用上,而且
确实可以方便很多,好处我就不多说了。
但是学习设计模式有一个很高的门槛,只有当你很深入理解其原理以及为什么要用这个模式,有什么好处的时候才能用的得心应手,披荆斩棘,快速解决设计,开
发中的很多问题。否则的话用这把双刃剑只能伤了自己,就像是高级的内功,在一开始练习的时候往往会走火入魔。而这些人往往就会觉得这种武功不入流,不好
用,不如一些"快餐技术"来的方便。
总之,如果你想快速解决小规模的问题,可能用不上什么模式,但是如果你要做一个architecture,不用模式很难开发出好的OO软件。
总之,如果你想快速解决小规模的问题,可能用不上什么模式,但是如果你要做一个architecture,不用模式很难开发出好的OO软件。
典型的 myth