新足迹

 找回密码
 注册

精华好帖回顾

· Medicare Levy 和 Medicare Levy Surcharge 综述 (2009-10-24) Brother · 端午节里包粽子 (2006-6-2) 我爱猫
· 猫唱 (2012-8-14) 征途归来 · 车拿到了,ford XR6 BA,初步油耗统计! (2006-2-25) ufo
Advertisement
Advertisement
查看: 2107|回复: 28

实战题 [复制链接]

2010年度奖章获得者

发表于 2011-2-10 16:53 |显示全部楼层
此文章由 dalaohu 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 dalaohu 所有!转贴必须注明作者、出处和本声明,并保持内容完整
大家看看这段代码,你觉得哪里不好?

public class FileTransferService : FileTransferBase, IFileTransferService
{
        public FileTransferService(IEnumerable<string> files, FTPPolicy policy) : base(files, policy)
        {
        }

        public void Transfer()
        {
                if (files.Count() > 0)
                {
                        Validate(files);
                        IFTP ftp = FTPFactory.GetFTPWorker(protocol.Name);
                        ftp.Transfer(files, protocol);
                }
        }
}

[ 本帖最后由 dalaohu 于 2011-2-10 21:42 编辑 ]
足迹 Reader is phenomenal. If you never used, you never lived 火速下载
Advertisement
Advertisement

发表于 2011-2-10 17:01 |显示全部楼层
此文章由 cdfei 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 cdfei 所有!转贴必须注明作者、出处和本声明,并保持内容完整
你这个也太短了,使用工厂模式,面向接口是好的地方,其他的看不出来。

评分

参与人数 1积分 +1 收起 理由
dalaohu + 1 就那么短,长的噪音太多没意义。

查看全部评分

发表于 2011-2-10 17:04 |显示全部楼层
此文章由 乱码 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 乱码 所有!转贴必须注明作者、出处和本声明,并保持内容完整
off top of my head, u might need to put parameterless constructor for this class if u want put it as service.

评分

参与人数 1积分 +1 收起 理由
dalaohu + 1 in the base

查看全部评分

发表于 2011-2-10 17:06 |显示全部楼层
此文章由 rogerk 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 rogerk 所有!转贴必须注明作者、出处和本声明,并保持内容完整
挺好,不过 Validate(files), 如果失败了,怎么搞?抛exception么?

难道不应该是这样么?

                if (files.Count() > 0 && Validate(files))
                {
                        IFTP ftp = FTPFactory.GetFTPWorker(protocol.Name);
                        ftp.Transfer(files, protocol);
                }

[ 本帖最后由 rogerk 于 2011-2-10 17:07 编辑 ]

评分

参与人数 1积分 +1 收起 理由
dalaohu + 1 就exception了

查看全部评分

发表于 2011-2-10 18:26 |显示全部楼层
此文章由 featheast 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 featheast 所有!转贴必须注明作者、出处和本声明,并保持内容完整
。NET的。。。

2010年度奖章获得者

发表于 2011-2-10 18:51 |显示全部楼层
此文章由 dalaohu 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 dalaohu 所有!转贴必须注明作者、出处和本声明,并保持内容完整
我把问法改了, 请打家光说不好的地方。

下午刚写的,写到那一处时心理就立即疙瘩了一下,绝对很不好。 但由于比较特殊一点,所以也就写这么写了。

这不是脑筋急转弯, 是架构,pattern上的问题。

大家继续啊。
足迹 Reader is phenomenal. If you never used, you never lived 火速下载
Advertisement
Advertisement

发表于 2011-2-10 21:21 |显示全部楼层
此文章由 cdfei 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 cdfei 所有!转贴必须注明作者、出处和本声明,并保持内容完整
IFTP ftp = FTPFactory.GetFTPWorker(protocol.Name);
你创建这个接口实例的时候已经传入protocol.Name了,也就是得到的是使用此protocol的ftp实例,为什么在执行方法的时候还要传一次呢?
ftp.Transfer(files, protocol);

评分

参与人数 1积分 +1 收起 理由
dalaohu + 1 这个没问题

查看全部评分

发表于 2011-2-10 21:31 |显示全部楼层
此文章由 flyspirit 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 flyspirit 所有!转贴必须注明作者、出处和本声明,并保持内容完整
你的constructor前为什么还有个void?

评分

参与人数 1积分 +1 收起 理由
dalaohu + 1 笔误,改掉了,好眼力

查看全部评分

2010年度奖章获得者

发表于 2011-2-10 21:50 |显示全部楼层
此文章由 dalaohu 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 dalaohu 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 cdfei 于 2011-2-10 21:21 发表
IFTP ftp = FTPFactory.GetFTPWorker(protocol.Name);
你创建这个接口实例的时候已经传入protocol.Name了,也就是得到的是使用此protocol的ftp实例,为什么在执行方法的时候还要传一次呢?
ftp.Transfer(files, protocol);


先说,问题不再这里,这没每问题。

澳洲的邮局用两种Protocol - SecureFTP, XCOM

Factory 用 name (“XCOM”)来调用FTP 的实例 => new XCOMFtp()

XCOMFtp 里 要用到Protocol 里的 IP, Port, User, Password...etc
足迹 Reader is phenomenal. If you never used, you never lived 火速下载

发表于 2011-2-10 22:07 |显示全部楼层
此文章由 cdfei 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 cdfei 所有!转贴必须注明作者、出处和本声明,并保持内容完整
为什么不在Transfer接口方法中传入IEnumerable<string> files?要在构造函数中传入?你的类需要依靠它做一些初始化的工作?

评分

参与人数 1积分 +1 收起 理由
dalaohu + 1 其他几处也要用到files

查看全部评分

发表于 2011-2-10 22:07 |显示全部楼层
此文章由 cdfei 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 cdfei 所有!转贴必须注明作者、出处和本声明,并保持内容完整
我去看碟子去了。
Advertisement
Advertisement

2010年度奖章获得者

发表于 2011-2-10 23:54 |显示全部楼层
此文章由 dalaohu 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 dalaohu 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 cdfei 于 2011-2-10 22:07 发表
为什么不在Transfer接口方法中传入IEnumerable files?要在构造函数中传入?你的类需要依靠它做一些初始化的工作?


你这个提醒我了, 也是个大败笔, 我脑子简直进水了。
足迹 Reader is phenomenal. If you never used, you never lived 火速下载

发表于 2011-2-11 11:46 |显示全部楼层
此文章由 混不到坑的萝卜 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 混不到坑的萝卜 所有!转贴必须注明作者、出处和本声明,并保持内容完整
protocol哪来的啊?它是由policy决定的?
如果是的话,在Factory那里应该根据policy返回针对不同protocol的具体实现吧?ftp.Tansfer那里不需要再知道protocol了吧?


public class FileTransferService : FileTransferBase, IFileTransferService
{
        Protocol protocol;

        public FileTransferService(FTPPolicy policy) : base(files, policy)
        {
             //switch(policy.Name)
             protocol = xxxx; //according to policy, decide which protocol to use
        }

        public void Transfer(IEnumerable<string> files)
        {
                if (files.Count() > 0)
                {
                        Validate(files);
                        IFTP ftp = FTPFactory.GetFTPWorker(protocol.Name);
                        ftp.Transfer(files, protocol);
                        //ftp.Setting = new ProtocolSetting(protocol);
                        //ftp.Transfer(files);
                }
        }
}

[ 本帖最后由 混不到坑的萝卜 于 2011-2-11 10:54 编辑 ]

评分

参与人数 1积分 +1 收起 理由
dalaohu + 1 笔误,protocol 是 Policy 来的

查看全部评分

2010年度奖章获得者

发表于 2011-2-11 12:05 |显示全部楼层

回复 13# 的帖子

此文章由 dalaohu 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 dalaohu 所有!转贴必须注明作者、出处和本声明,并保持内容完整
又漏写了哈哈, 笔误, Protocol 是在 Policy 里的。 我copy时没有把那段copy过来。
不过问题不在这里。

给个暗示:是个设计Pattern上的大问题。

我在针对这个写blog。 完了贴上来。

大家继续。
足迹 Reader is phenomenal. If you never used, you never lived 火速下载

2010年度奖章获得者

发表于 2011-2-11 12:09 |显示全部楼层
此文章由 dalaohu 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 dalaohu 所有!转贴必须注明作者、出处和本声明,并保持内容完整
标题起好了, 叫

Pattern, Tests and Other Drugs

写好了大家看啊, 很有养分的。
头像被屏蔽

禁止发言

发表于 2011-2-11 12:16 |显示全部楼层

看不懂的同志飘过

此文章由 澳贼 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 澳贼 所有!转贴必须注明作者、出处和本声明,并保持内容完整
Advertisement
Advertisement

发表于 2011-2-11 12:43 |显示全部楼层
此文章由 乱码 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 乱码 所有!转贴必须注明作者、出处和本声明,并保持内容完整
你这么短的code,都没交待大环境,让大家怎么给你提pattern的意见?

你先说说你想让哪块固定,哪块灵活可变,大家才能提意见。

2010年度奖章获得者

发表于 2011-2-11 12:45 |显示全部楼层
此文章由 dalaohu 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 dalaohu 所有!转贴必须注明作者、出处和本声明,并保持内容完整
你就把这当一个很普通的class看好了。 就这么点code,足以了。


而且pattern这东西,不用特用力的看, 扫一眼,立即就能问出味道了。

就是说你只要眯着眼,上下这样扫一下就可以了。
足迹 Reader is phenomenal. If you never used, you never lived 火速下载

发表于 2011-2-11 12:47 |显示全部楼层

回复 18# 的帖子

此文章由 IsDonIsGood 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 IsDonIsGood 所有!转贴必须注明作者、出处和本声明,并保持内容完整
功力不够,看得我吐血三升~~~

发表于 2011-2-11 12:49 |显示全部楼层

回复 19# 的帖子

此文章由 cdfei 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 cdfei 所有!转贴必须注明作者、出处和本声明,并保持内容完整
你是经期到了吧

评分

参与人数 3积分 +8 收起 理由
dalaohu + 1 这叫经血倒流
澳贼 + 4 狂笑十秒钟
乱码 + 3 偶对你的景仰如滔滔江水

查看全部评分

发表于 2011-2-11 12:51 |显示全部楼层
此文章由 乱码 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 乱码 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 dalaohu 于 2011-2-11 12:45 发表
你就把这当一个很普通的class看好了。 就这么点code,足以了。


而且pattern这东西,不用特用力的看, 扫一眼,立即就能问出味道了。

就是说你只要眯着眼,上下这样扫一下就可以了。


没有context用pattern,很有可能导致over design,it's root of devil coding.
Advertisement
Advertisement

发表于 2011-2-11 14:36 |显示全部楼层

没我的份

此文章由 porcorosso 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 porcorosso 所有!转贴必须注明作者、出处和本声明,并保持内容完整

发表于 2011-2-11 14:37 |显示全部楼层
此文章由 rogerk 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 rogerk 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 dalaohu 于 2011-2-11 12:05 发表
又漏写了哈哈, 笔误, Protocol 是在 Policy 里的。 我copy时没有把那段copy过来。
不过问题不在这里。

给个暗示:是个设计Pattern上的大问题。

我在针对这个写blog。 完了贴上来。

大家继续。


就这么几行code,要么你是说你这个service应该是singleton?

2010年度奖章获得者

发表于 2011-2-11 14:45 |显示全部楼层
此文章由 dalaohu 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 dalaohu 所有!转贴必须注明作者、出处和本声明,并保持内容完整
直接说了吧,

问题是在Tight Coupling 和 Testibility 上。

写完了大家看吧。

2010年度奖章获得者

发表于 2011-2-11 15:55 |显示全部楼层
此文章由 dalaohu 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 dalaohu 所有!转贴必须注明作者、出处和本声明,并保持内容完整

评分

参与人数 1积分 +2 收起 理由
cdfei + 2 等partII

查看全部评分

特殊贡献奖章

发表于 2011-2-11 16:06 |显示全部楼层
此文章由 kr2000 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 kr2000 所有!转贴必须注明作者、出处和本声明,并保持内容完整
老大,我忍不住想问你一下
你是姓贝吗?
小贝的贝?
Advertisement
Advertisement

2010年度奖章获得者

发表于 2011-2-11 17:42 |显示全部楼层

回复 26# 的帖子

此文章由 dalaohu 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 dalaohu 所有!转贴必须注明作者、出处和本声明,并保持内容完整
不带你这么外楼的好伐。

小弟免贵姓洪
江湖行号 洪门老板。
网名 dalaohu

评分

参与人数 1积分 +3 收起 理由
kr2000 + 3 拜见洪贝老板

查看全部评分

2010年度奖章获得者

发表于 2011-2-12 01:00 |显示全部楼层
此文章由 dalaohu 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 dalaohu 所有!转贴必须注明作者、出处和本声明,并保持内容完整
cdfei积分 +2等partII 2011-2-12 00:42


Part II 正在写呢, 我得把不必要的code去掉,否则太长了。

Part I 觉得有道理吗?

发表于 2011-2-15 11:28 |显示全部楼层

回复 28# 的帖子

此文章由 cdfei 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 cdfei 所有!转贴必须注明作者、出处和本声明,并保持内容完整
老兄,你晃点我们啊,你帖子里的代码和blog上的代码差别很大嘛。
如果你constructor已经传入了(string sourceFolder, ServiceMessage serviceMessage, TransmissionPolicy policy, IFileManager fileManager。。。。。等等,你这个类就是有状态的了,TransmissionWorker.Start()当然不需要再传参数,如果你要面向服务的设计,整个设计就要改,对客户来说,类要是无状态的,和客户有关的参数都应该放在接口中传入。

发表回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Advertisement
Advertisement
返回顶部