新足迹

 找回密码
 注册

精华好帖回顾

· show一下我拍的名人肖像 (2011-7-31) haoyue · 《参加活动》 - 摄出你手机的魅力 (2013-3-22) feihong
· 天天都是万圣节 (2006-11-1) AgeanSea · cheap parking place in CDB (2005-8-2) angelaleewi99
Advertisement
Advertisement
查看: 2180|回复: 51

[IT] Happy coding: BackgroundWorker refactoring [复制链接]

2010年度奖章获得者

发表于 2010-3-24 23:48 |显示全部楼层
此文章由 dalaohu 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 dalaohu 所有!转贴必须注明作者、出处和本声明,并保持内容完整
今天做的一个东西,项目里到处都是 BackgroundWorker, 每一处大概都有7, 8行。 今天决定refactor一下,做了个BackgroundWorkerManager warpper。

示意原先的代码
-----------------------------------------------------------------------------
var inputParams = 190;

void Initialise()
{
     var backgroundWorker = new BackgroundWorker();
     backgroundWorker.WorkerSupportsCancellation = true;
     backgroundWorker.DoWork += new DoWorkEventHandler(BackgroundWorker_DoWork);
     backgroundWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(BackgroundWorker_RunWorkerCompleted);
     backgroundWorker.RunWorkerAsync(inputParams);
}

void BackgroundWorker_DoWork(object sender, DoWorkEventArgs e)
{
     //Do Work Logics
     //var inputParams = (int)e.Argument; //inputParams can you any type, ie. arrays, lists, string, int
     //e.Result = [object];
}

void BackgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
      //Work Complete Logics
      //var result = (AnyDataType)e.Result;
      backgroundWorker.DoWork -= new DoWorkEventHandler(BackgroundWorker_DoWork);
      backgroundWorker.RunWorkerCompleted -= new RunWorkerCompletedEventHandler(BackgroundWorker_RunWorkerCompleted);
}

-----------------------------------------------------------------------------------

技术上对这个 BackgroundWorkerManager wrapper 有几个要求。
1. Initialise() 里的代码不超过2行。
2. wrapper 里必须要有delegate, 把DoWork, RunWorkerCompleted logic delegate 到caller.
3. 最好要用generics (type safe), rather than pass object data type around.
4. 另外请注意, BackgroundWorker inherits from Component which has IDisposable interface.

会把我做的明后天贴出来。 在此之前,大家不妨讨论讨论,意在抛砖引玉, 发散开去应该会有不少很有趣的讨论点。
尽量有针对性,避免泛泛而谈。
Advertisement
Advertisement

2010年度奖章获得者

发表于 2010-3-25 14:11 |显示全部楼层
此文章由 dalaohu 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 dalaohu 所有!转贴必须注明作者、出处和本声明,并保持内容完整
wow so quiet?
头像被屏蔽

禁止发言

发表于 2010-3-25 14:33 |显示全部楼层

没看懂,你太强了

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

发表于 2010-3-25 16:14 |显示全部楼层
此文章由 uowzd01 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 uowzd01 所有!转贴必须注明作者、出处和本声明,并保持内容完整
把这个帖子移到.net版会好一点

2010年度奖章获得者

发表于 2010-3-25 18:42 |显示全部楼层
此文章由 dalaohu 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 dalaohu 所有!转贴必须注明作者、出处和本声明,并保持内容完整
code refactoring 是日常工作中每时每刻都会发生的。

说白点, 但你看到以上这些代码,并在几十处出现, 你会有啥想法, 会做什么些什么?

发表于 2010-3-25 19:44 |显示全部楼层
此文章由 flyspirit 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 flyspirit 所有!转贴必须注明作者、出处和本声明,并保持内容完整
你要在initialize里面只有2行怎么实现?

给delegate赋值就要两行,还要新建BackgroundWorker。

这些操作应该也不是在构造时实现,你的wrapper只有1个实例吧。
Advertisement
Advertisement

2010年度奖章获得者

发表于 2010-3-25 22:56 |显示全部楼层
此文章由 dalaohu 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 dalaohu 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 flyspirit 于 2010-3-25 19:44 发表
你要在initialize里面只有2行怎么实现?

给delegate赋值就要两行,还要新建BackgroundWorker。

这些操作应该也不是在构造时实现,你的wrapper只有1个实例吧。


算是开了个好头

简单的来说,新的 Initialise() 大致是变成这样了。

void Initialise()
{
    var manager = new BackgroundWorkerManager(BackgroundWorker_DoWork, BackgroundWorker_RunWorkerCompleted);
}

一行就够!

大家继续讨论。。。

[ 本帖最后由 dalaohu 于 2010-3-25 23:01 编辑 ]

2010年度奖章获得者

发表于 2010-3-25 23:00 |显示全部楼层
此文章由 dalaohu 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 dalaohu 所有!转贴必须注明作者、出处和本声明,并保持内容完整
个人口味不同, 有些人不喜欢用constructor来做initialiser. 那么最多也就是2行。

var manager = new BackgroundWorkerManager();
manager.InvokeThread(BackgroundWorker_DoWork, BackgroundWorker_RunWorkerCompleted);

我倾向于2行。

发表于 2010-3-26 09:27 |显示全部楼层

回复 7# 的帖子

此文章由 flyspirit 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 flyspirit 所有!转贴必须注明作者、出处和本声明,并保持内容完整
这样你的Manager就有多个实例了,如果不是单件Initilize和我原先想的一样,Constructor里面初始化BacgroundWorker并副职delegate。

其他要求我先说说自己的思路。

generic type可以直接用.NET里面预定义的Action<T,T>。

考虑到需要Dispose。在Wapper里面写一个compelete handler, 里面调用caller的complete handler并且dispose backgroundworker。

这样你看能否满足要求?

发表于 2010-3-26 09:33 |显示全部楼层
此文章由 wegotooz 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 wegotooz 所有!转贴必须注明作者、出处和本声明,并保持内容完整
说句不好听的话。不要随意改变代码。除非是不用的程序代码。改了代码,就得测试,都是要花时间的,那都是成本。没有计划和预算没有必要改代码。在用的就是好的。

发表于 2010-3-26 09:44 |显示全部楼层

回复 10# 的帖子

此文章由 flyspirit 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 flyspirit 所有!转贴必须注明作者、出处和本声明,并保持内容完整
如果在开发中坚持用Unit Test,修改后的测试用不了多长时间。

Rafactoring还是需要的,不光能改进现有代码可读性,还可以为以后开发积累经验。
Advertisement
Advertisement

发表于 2010-3-26 09:48 |显示全部楼层
此文章由 litarcy 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 litarcy 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 wegotooz 于 2010-3-26 09:33 发表
说句不好听的话。不要随意改变代码。除非是不用的程序代码。改了代码,就得测试,都是要花时间的,那都是成本。没有计划和预算没有必要改代码。在用的就是好的。


不同意楼上的, 当然过了开发阶段, 最好不要改了
在开发阶段 应该随时随地的refactor
建议你看一些程序员修炼之道之类的经典丛书

2010年度奖章获得者

发表于 2010-3-26 09:49 |显示全部楼层
此文章由 dalaohu 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 dalaohu 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 flyspirit 于 2010-3-26 09:27 发表
这样你的Manager就有多个实例了,如果不是单件Initilize和我原先想的一样,Constructor里面初始化BacgroundWorker并副职delegate。

其他要求我先说说自己的思路。

generic type可以直接用.NET里面预定义的Acti ...


yep, that's exactly the goal.

发表于 2010-3-26 09:50 |显示全部楼层
此文章由 litarcy 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 litarcy 所有!转贴必须注明作者、出处和本声明,并保持内容完整
楼主这个例子很好,如果project里到处都有这些代码, 如果以后这些代码里有bug,修改起来的时间成本远远大于重构

2010年度奖章获得者

发表于 2010-3-26 09:51 |显示全部楼层
此文章由 dalaohu 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 dalaohu 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 wegotooz 于 2010-3-26 09:33 发表
说句不好听的话。不要随意改变代码。除非是不用的程序代码。改了代码,就得测试,都是要花时间的,那都是成本。没有计划和预算没有必要改代码。在用的就是好的。


refacorting is a constant effort throughout the whole project life cycle (well, if your a good dev and in a supportive team anyway.)

发表于 2010-3-26 10:02 |显示全部楼层

回复 13# 的帖子

此文章由 flyspirit 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 flyspirit 所有!转贴必须注明作者、出处和本声明,并保持内容完整
这个例子不错,很实用的。
Advertisement
Advertisement

发表于 2010-3-26 13:01 |显示全部楼层

回复 13# 的帖子

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

2010年度奖章获得者

发表于 2010-3-26 16:28 |显示全部楼层
此文章由 dalaohu 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 dalaohu 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 flyspirit 于 2010-3-26 13:01 发表
Any patten is used here?


so far not pattern is used.

what you think?

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


so far not pattern is used.

what you think?


I think the event handler is a kind of IoC. This is the only one I can find.

2010年度奖章获得者

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


I think the event handler is a kind of IoC. This is the only one I can find.


event delegate 和 IOC 是两码事。IOC 是通过interface走的。

说道pattern, 坛子里那么多pattern圣手, 模式强人不知为何那么安静了呢?

2010年度奖章获得者

发表于 2010-3-26 18:21 |显示全部楼层
此文章由 dalaohu 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 dalaohu 所有!转贴必须注明作者、出处和本声明,并保持内容完整
IOC 又是一个热门话题。等我找个好例子开新贴
Advertisement
Advertisement

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

发表于 2010-3-27 01:08 |显示全部楼层
此文章由 Cloy 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 Cloy 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 dalaohu 于 2010-3-26 18:20 发表


event delegate 和 IOC 是两码事。IOC 是通过interface走的。

说道pattern, 坛子里那么多pattern圣手, 模式强人不知为何那么安静了呢?


我不是高手,.NET的东西我也不熟悉,不过我说一句,看不出来这个问题和Pattern有啥关系。说的就不是一回事

不过上面有人提到 程序员的修炼之道,我倒是有和Pattern相关的话可以让喜欢骂Pattern的人多个话柄。那本书里面一个观点就是说 软件不要perfect, 要good enough。这个又涉及到上次说的看你持续性开发的问题。有时候good enough到后来就不good enough了,而且等到你决的他不Good Enough的时候,原来的程序作者已经走了,或者多半他自己也忘记了,就晚了。软件坐久了,尤其是经过很多人的手,就会有一些问题。僵硬,老化,牵一发动全身,没有人敢于动。不是说参与的人水平不够高,你也是高手,他也是高手,写的程序放到一起,有时候就是不100% match。所以又回到Pattern上面来。有时候Pattern就像是一种语言,你这样写了,你管这个类叫Factory了,你就告诉所有后来来参与这个类的研发的人,我这里是用的Factory模式啊,你们不要给我弄乱了。你用了订购者模式,后来的人就知道。哦,我这里要想获得信息,就把我自己注册进来就可以了。不需要自己写一个新的Listener,冗余也是很严重的问题,不光ugly,也potentially导致程序的错误,那本书里面对于duplication也有详尽论述。所以我想那个吵架帖子里面有人说多组开发和模式没关系。因为这个,就沾上了一点关系。模式用多了,有了一些约定俗成的东西,对于保持程序的良好结构是很有用处的。缺点么,毕竟模式不是Sun,也不是IBM推出的东西,没有人说的是权威的,有时候你也叫Factory,我也叫Factory,但是实现方法不一样,最后还是容易搞乱。

知道很多人不喜欢谈这个。不小心说多了的话,还请口下留情。

说远了,所以以我的经验,起码原来在国内的时候,refactor我们要做,而且要及时做,不过一定要谨慎做。我们每一年的开发任务,都留出2 - 4个礼拜专门做refactor的项目,安插到全年之中。需要额外的时间会找项目经理额外批。平时干活的时候,大家看着哪里不爽的时候,都会记下来。Refactor的时候所有人都在场,一起来,只修严重问题。至于UnitTest Cover所有的case,说起来很容易,实际项目当中经常也就是一个美好的愿望而已。你作为直接做的人有这个胆量,调用你的模块的人,或者有权利Approve你做Refactor的人,不见得敢相信你。呵呵,毕竟其他的程序员作为你的模块的用户,你永远想象不到他会怎么用,而且我看,做IT的人犯起傻来,比不IT的傻多了

[ 本帖最后由 Cloy 于 2010-3-27 01:56 编辑 ]

发表于 2010-3-27 01:35 |显示全部楼层
此文章由 Cloy 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 Cloy 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 dalaohu 于 2010-3-26 18:21 发表
IOC 又是一个热门话题。等我找个好例子开新贴

IoC我看起来,不只是一个模式那么简单。属于一种新的技术或者说思想。就像你说.NET, Java,是一门新的语言么?
其实C# Java作为语言很简单,.NET 和 JAVA的价值,在于基于他们语言本身的各种技术的集合,汇总形成的这个体系。
.NET 我不清楚是否有其他公司参与, 参与程度如何
JAVA 百家争鸣的情况是坏事也是好事,坏事不用多说,好事是一个是同样的产品有很多竞争,
你要轻量级的有jetty这样的,你要重量级的有websphere
说起来最重要的80%的功能都一样,但是一个免费一个死贵
但是你的东西放进去,要跑出来结果一摸一样。
这时候规范就尤其重要。所以JAVA世界有很多东西都是规范
语法这样的硬性的,也有模式这种软的,有SUN之类发的EJB规范这样成文的,也有一些不成文的
反正我是很enjoy JAVA这样的一个体系。

发表于 2010-3-27 01:37 |显示全部楼层
此文章由 Cloy 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 Cloy 所有!转贴必须注明作者、出处和本声明,并保持内容完整
不知道你们.NET 里面的delegate,是不是就是类似于AOP那种概念?
AOP 对JAVA世界的改变也蛮大的。很多时候不比IoC小

[ 本帖最后由 Cloy 于 2010-3-27 01:50 编辑 ]

发表于 2010-3-27 01:54 |显示全部楼层
此文章由 Cloy 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 Cloy 所有!转贴必须注明作者、出处和本声明,并保持内容完整
刚发现lz说不让泛泛而谈。我这都是泛泛而谈,具体的.NET啥也不懂, 就当我啥也没说吧
Advertisement
Advertisement

2010年度奖章获得者

发表于 2010-3-27 20:53 |显示全部楼层
此文章由 dalaohu 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 dalaohu 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 Cloy 于 2010-3-27 01:54 发表
刚发现lz说不让泛泛而谈。我这都是泛泛而谈,具体的.NET啥也不懂, 就当我啥也没说吧


Cloy兄一看就是道上的熟手,说的都在点子上。外行的泛泛而谈那叫扯淡, 内行的那叫经验体会。这是嘴一张就看的出来的。

我对java 的industry了解不多,只是有江河日下的感觉。可能是我认识不够的原因。

Cloy能不能大致说一下java的现状, 主要的应用领域?还有开发的环境,开发工具等等。目前流行的framework, 架构是那些?

发表于 2010-3-27 22:00 |显示全部楼层
此文章由 乱码 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 乱码 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 Cloy 于 2010-3-27 01:37 发表
不知道你们.NET 里面的delegate,是不是就是类似于AOP那种概念?
AOP 对JAVA世界的改变也蛮大的。很多时候不比IoC小


不知道AOP代表什么,但google了一下,略看了几眼,觉得它是seperation of concern(不确定,如果说错了,一定要纠正我).从这个角度来说,它跟delegate是两回事,delegate说白了就是函数指针(说method指针也好,反正都是内存中function的instance的entry),如果非要跟patter联系,最长用的就是observer.

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


Cloy兄一看就是道上的熟手,说的都在点子上。外行的泛泛而谈那叫扯淡, 内行的那叫经验体会。这是嘴一张就看的出来的。

我对java 的industry了解不多,只是有江河日下的感觉。可能是我认识不够的原因。

Cl ...

熟不熟的见笑了.. 总归做了几年了.

JAVA 份额逐年下降这个是事实啊.. 痛苦. Oracle收购Sun也是一个非常的不明朗.
最近已经眼看就要滑落到语言排行榜的第二名了.. (C语言要重新做回第一了, 真是奇迹啊)
(不过份额很多部分都是被 Groovy, Scala等兄弟语言抢走. )
主要是最近市场的风向变化. 原来开源世界选择不多, 轻重都是java
现在轻量快速开发的可以用 php, ror, grails
而且轻量级的项目怕是起码占到市场总量的90%以上吧.


[ 本帖最后由 Cloy 于 2010-3-28 20:07 编辑 ]

2010年度奖章获得者

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

熟不熟的见笑了.. 总归做了几年了.

JAVA 份额逐年下降这个是事实啊.. 痛苦. Oracle收购Sun也是一个非常的不明朗.
最近已经眼看就要滑落到语言排行榜的第二名了.. (C语言要重新做回第一了, 真是奇迹啊)
(不过 ...


这张表的排名是以open source project 来排的吧?

发表回复

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

本版积分规则

Advertisement
Advertisement
返回顶部