MicroHelper.Net

雷锋说.对待朋友要MicroHelper,对待敌人要害尔扑
随笔 - 74, 评论 - 431, 引用 - 7

导航

关于

邮件系统不稳定,使用songdming at 263 dot net吧
PageRank

FastCounter by bCentral

 

标签

每月存档

最新留言

  • re: 代码组织
    <a href="http://www.vgoldseller.com/runescape-c-599.html">runescape money</a> ...
    by cxb000(匿名) on 2008/3/26 10:32:11
  • 回复: 看PPMM
    <a target="_new" href="http://www.bestgoldlion.com">http://www.bestgoldlio...
    by runescape gold(匿名) on 2007/12/18 5:13:00
  • 回复: IoC初阶
    <a target="_new" href="http://www.bestgoldlion.com">http://www.bestgoldlio...
    by runescape gold(匿名) on 2007/12/18 5:12:00
  • 回复: 数据分页 (最后更新2003/11/18)
    <a target="_new" href="http://www.sky361.com">http://www.sky361.com</a&...
    by wow power leveling(匿名) on 2007/12/18 5:06:00
  • 回复: iBATIS.Net
    <a target="_new" href="http://www.rsgold-rsgold.com">http://www.rsgold-rsg...
    by runescape money(匿名) on 2007/12/18 5:04:00
  • 回复: 防范Sql注入式攻击
    <a target="_new" href="http://www.rsgold-rsgold.com">http://www.rsgold-rsg...
    by runescape money(匿名) on 2007/12/18 5:03:00
  • 回复: TDD——NUnit的原理
    <a target="_new" href="http://www.rsgold-rsgold.com">http://www.rsgold-rsg...
    by runescape money(匿名) on 2007/12/18 5:03:00
  • 回复: 开源的CMS
    <a target="_new" href="http://www.rsgold-rsgold.com">http://www.rsgold-rsg...
    by runescape money(匿名) on 2007/12/18 5:03:00
  • 回复: CCNet 1.0即将发布
    <a target="_new" href="http://www.sky361.com">http://www.sky361.com</a&...
    by runescape gold(匿名) on 2007/12/18 5:00:00
  • 回复: 关于加班
    为什么这年头加班都成了是我们 的义务了?加班不给加班费也就算了,难得早点回去,还要说三道四的,这社会会为什么会发展成这样啊????
    by 小小(匿名) on 2007/12/14 8:18:00
  • 回复: Presentation草稿:面向对象设计的基本原则
    是的,模式要实事求是,应该是解决问题为主 <br>我搜集了原则方面的文章,有空去看看吧 <br><a target="_new" href="...
    by objecttutor(匿名) on 2007/10/31 17:26:00
  • 回复: 开源的CMS
    支持一下
    by qingxingmeng(匿名) on 2007/10/30 18:03:00
  • 回复: .Net的开源项目
    AnyView(网络警)网络监控软件是一款国内目前最专业的企业级的网络监控软件产品。包含局域网上网监控、邮件监控、聊天监控、BT禁止、流量监视、上下行分离流量限制、并发连接数限制、屏幕监视和录象、硬件...
    by 网络监控软件(匿名) on 2007/10/30 12:33:00
  • 回复: .Net的开源项目
    AnyView(网络警)网络监控软件是一款国内目前最专业的企业级的网络监控软件产品。包含局域网上网监控、邮件监控、聊天监控、BT禁止、流量监视、上下行分离流量限制、并发连接数限制、屏幕监视和录象、硬件...
    by 网络监控软件(匿名) on 2007/10/30 12:32:00
  • 回复: 看PPMM
    好看就成 <br>
    by 11(匿名) on 2007/10/27 15:43:00

广告

【第1页/共6页,90条】
首页
前页
1
2006年05月19日

wordpress一直没解封,就在dreamhost买了空间, 正在配置dreamhost的空间,设置好后就不再更新博客堂的Blog,同时正在考虑是否加一个关于sql server和.net的wiki,最近对容弘千先生的风雨估衣街比较感兴趣,也有可能用这个空间放风雨估衣街。

本来想选择Web4Life,只是Web4Life需要setup fee,不过传说DH的服务不好。

在博客堂开通的第一天就申请了帐号,十分感谢博客堂,感谢创始人开心就好以及博客堂的管理团队。

 

posted on 2006-05-19 18:23:00 by microhelper  评论(19) 阅读(6637)

 
2006年03月28日

Windows Live Developer Center
http://msdn.microsoft.com/live/default.aspx

现在什么都带Live了,试了很多带Live的域名,都被注册了,还是没赶上潮流呀

Mashup 是什么呢

根据wikipedia的解释(http://en.wikipedia.org/wiki/Mashup
代表两类目前流行的东西:一是一种音乐风格 ; 二是所谓Mashup web application hybrid , 指把多个不同的支持web api的应用堆叠成为新型web服务

Mashup Camp 在美国是由一群geek发起的技术+idea聚会, 详细可以参考:http://www.mashupcamp.com/ 

canvas for IE

http://groups.yahoo.com/group/canvas-developers/message/180
看起来好像很美,

Drawing Graphics with Canvas
http://developer.mozilla.org/en/docs/Drawing_Graphics_with_Canvas

demo
http://redsquirrel.com/dave/play/ajaxtrains.html

八卦:
最浪费的域名,看看就知道了,
http://down.com/,另外,dell一万美金的电脑已经卖完了

posted on 2006-03-28 12:20:00 by microhelper  评论(3) 阅读(7676)

 
2006年02月16日

开源的CMS基本上是php的天下,选择时主要看

授权模式,不过很多人不关心这个
插件和模版的数量,开发社区是否活跃。有更多的人参与你才能源源不断地获得资源
中文的支持
系统需求,支持那些数据库,这会影响对空间的选择
扩展性,不过不是所有的人都有能力和兴趣自己做扩展
 
Mambo 曼波 
http://www.mamboserver.com/
http://www.mambors.org/
http://www.mamboforge.net

中文站点:
http://www.mambochina.net/
http://www.mambo.cn
 
Mambo是一个老牌的opensource建站程序,获得过“最佳开源方案”,“年度最佳自由软件项目”等很多奖, 国外比较热门,但是在中国不够

热,中文支持比较弱,中文资源相对来说不够多。
   
Joomla 逐浪
http://www.joomla.org/

中文站点:
http://www.mambo.cn/
http://www.joomla.org.cn/

Mambo的分支,Mambo核心开发团队另起炉灶的产品。,2005年度最佳Linux开放源码系统奖
 
(八卦来自bbs.joomla.org.cn)

曼波开源核心开发团队致社区的公开信

致社区的公开信
--曼波开源核心开发团队

越来越多的人关注曼波开源项目,曼波商会 ( Mambo Foundation Inc *) 应运而生,它的初衷是为了更好的发展曼波。

我们,曼波核心开发团队,一致认为:

1、所谓开源项目,是致力于开发一个免费的和开放源码的软件的人们,组成一个团队而服务社会的行为。

2、开源项目体现协作精神,并享受协作过程带来的乐趣。它存储社区的信息反馈,提供好的管理,允许商业机构放心地投资于它的开发。

开源项目对任何人都敞开大门,欢迎那些能贡献价值和愿意在社区一起工作的人加入。

我们,曼波开发团队,认真关注曼波商会及其和社区的关系。我们坚信,曼波的未来,应该由使用者的需求以及开发者的能力所掌握。然而,

曼波商会却受Miro公司所控制,因此商会同社区之间的自由协作将变得不再现实。

1、曼波商会组建之初,并没有听取曼波核心开发团队们的意见。我们、社区成员,对曼波的管理和未来的发展方向,没有任何的发言权。由开

发团队组成的曼波筹委会和 Miro 公司的代表,联合组成曼波商会,并成立第一届理事会。但 Miro公司的CEO Peter Lamont完全将商会置于自

己的控制之下,在没有和开发团队的两名代表,Andrew Eddie和Brian Teeman商议的情况下,擅自任命了理事会成员。

2、尽管Lanmont先生向曼波筹委会许诺把Mambo的版权转移给商会,但Miro公司现在拒绝这么做。

我们将要做的是:在GNU规范下继续开发和改善这个获多项大奖的开源软件。我们希望Miro公司及曼波商会一路走好,很遗憾,我们不能够再和

他们继续合作。

我们听取了软件自由法律中心关于这次事件的建议,将很快就近期发展计划发布更多的信息。

2005年8月17日,曼波开发团队:

Andrew Eddie
Emir Sakic
Andy Miller
Rey Gigataras
Mitch Pirtle
Tim Broeker
Alex Kempkens
Arno Zijlstra
Jean-Marie Simonet
Levis Bisson
Andy Stewart
Peter Russell
Brad Baker
Brian Teeman
Michelle Bisson
Trijnie Wanders
Rey Gigataras
Shayne Bartlett
Nick Annies
Johan Janssens

The name Joomla! is a phonetic spelling for the Swahili word "Jumla", which means "all together" or "as a whole"
Swahili -- 斯瓦希里人,穆斯林民族中的主要一支,居住在东非从索马里到莫桑比克的沿海和岛屿上。斯瓦希里语作为坦桑尼亚官方语言的斯

瓦希里班图语,在东非或中东非被广泛地用作通用交际语言。


drupal
http://drupal.org/

Drupal模块功能一览
http://www.verydummy.com/drupal_demo/node/8

一些Drupal中文网站供参考
http://www.todaylog.com/node/44

PhpNuke
http://www.phpnuke.org/

中文站点:
http://www.postnuke.cn/
http://www.postnuke.ws/

老牌的CMS工具了,最早的php cms工具,用户很多,能找到很多phpnuke搭建的中文站点。最新的版本是7.9,功能很丰富,社区也很活跃。

postnuke
www.postnuke.com

中文站点:
http://www.postnuke.cn

phpnuke的分支,目标是在更少代码,更少的服务器负担,更多模版地情况下实现phpNuke的功能,Postnuke在显示上和php-nuke非常相似,但

是postnuke功能更多。


XOOPS
http://sourceforge.net/projects/xoops
http://www.xoops.org/

中文站点:
http://xoops.org.cn/

PostNuke的分支,最近很流行,插件很多,中文支持得也不错,模块组合的能力强大,wordpress,osCommerce, ipb等很多工具都可以整合成

为XOOPS的模块。

(www.xoops.org.cn/)
XOOPS - eXtensible Object Oriented Portal System, 面向对象的可扩展门户系统
XOOPS 框架稳定灵活,适应于web2.0 的各类功能的开发与集成,目前已经实现各类 RSS/ATOM 资源管理,集成 WordPress 等著名blog系统和

各类wiki管理系统,并实现与 Flickr, Delicious, Technorati 等社会资源的互动。

xaraya
http://www.xaraya.com/

中文站点:
http://zh.xaraya.com/

xaraya也是nuke系列发展起来的,基本摆脱了Nuke架构的束缚,架构上兼具 PostNuke/Drupal的优点,评价很高,模块开发潜力大,但是汉化

进展缓慢

更多的可以查看
www.opensourcecms.com

dotnetnuke用过一段时间,已经决定放弃继续使用了。

签名:
开源的力量是无穷的

posted on 2006-02-16 15:11:00 by microhelper  评论(21) 阅读(23751)

 
2005年12月17日

release notes

http://nunit.com/testweb/index.php?p=releaseNotes&r=2.2.4

依然不习惯vs 2005自动生成的测试代码,以为很贴心,很细致,代码实际上太多太乱了。

还是简单的几行代码就晚上测试看着比较顺心。

posted on 2005-12-17 23:50:00 by microhelper  评论(3) 阅读(6187)

 
2005年12月13日

如果要找一个和我们的UI层设计最类似的open soure软件的话,那应该是

http://www.myxaml.com/

作者曾经在codeproject上发表过一系列关于declare programming的文章,对我们的启发很大,不过xaml和作者的专栏很久更新了。

另外从作者这里学到的是

Property Events和Property Pool

 

posted on 2005-12-13 21:23:00 by microhelper  评论(3) 阅读(5583)

 
2005年12月09日

每天一段郭德刚,祛火消痰防寒,相声回归现实,设计也倒退到以前

面向对象往回走,削减对象之间的关系,变成各自独立的实体。比如company和order,order不再是company的一个属性,order和company各自独立,对外提供服务。
company.getorder的职责迁移到order,order.getorderby(order.companyid)

framework简化,不再无所不包,只是把各个模块连接起来,提供objectfactory,MessageBus,模块间数据传递等基本功能。

web页面,asp.net提供了很大的便利,但是也有不方便的地方,从page control再回到font control,所有的事件处理都统一成action,动态生成webcontrol,或者干脆放弃一些webcontrol,不过一些数据绑定数据控件还是要利用它们的强大功能

数据库访问,在很多情况下,activeobject模式简单,而且用起来很方便,在很多不是很复杂的情况下能充分发挥出优点来。

对于代码,什么设计原则都不是重要的,最重要的是可测试,有了测试做基础,才有了不断改进,不断变化的可能性。

posted on 2005-12-09 12:24:00 by microhelper  评论(1) 阅读(4512)

 
2005年09月24日

修改不需要编译,用户现场只用记事本或者查询分析器就完成用户的需求对客户来说有吸引力。

可以做编辑器,让BA来控制流程和逻辑

借助用sql或者xsl,可以方便的修改和转换。

posted on 2005-09-24 23:24:00 by microhelper  评论(11) 阅读(4674)

 
2005年09月19日

Download details IEDevToolbar

试用了一会儿,确实为开发带来一些便利。

官方介绍:

Overview

The IE Developer Toolbar provides several features for deeply exploring and understanding Web pages.

-- Explore and modify the document object model (DOM) of a web page.
-- Locate and select specific elements on a web page through a variety of techniques.
-- Selectively disable Internet Explorer settings.
-- View HTML object class names, ID's, and details such as link paths, tab index values, and access keys.
-- Outline tables, table cells, images, or selected tags.
-- Validate HTML, CSS, WAI, and RSS web feed links.
-- Display image dimensions, file sizes, path information, and alternate (ALT) text.
-- Immediately resize the browser window to 800x600 or a custom size.
-- Selectively clear the browser cache and saved cookies. Choose from all objects or those associated with a given domain.
-- Choose direct links to W3C specification references, the Internet Explorer team weblog (blog), and other resources.
-- Display a fully featured design ruler to help accurately align objects on your pages.
The Developer Toolbar can be pinned to the Internet Explorer browser window or floated separately.
 
上一个随笔中Singleton第二个练习题的答案为1,2,那么为什么是不是创建了一个实例呢?

posted on 2005-09-19 10:57:00 by microhelper  评论(1) 阅读(3624)

 
2005年09月13日

单例模式

 

使用对象时最基本的事情就是要首先创建对象的实例,一般情况下,这是一件极其简单的事情,就是用new运算符来创建某个对象的实例,简单的人们都不想提及。然而有时候你会发现创建对象的实例也不是那么简单。

 

比如有一些类,在整个程序运行期间只允许一个实例,或者我们说如果有多个实例存在程序逻辑会变得难以控制,很可能遭遇错误,比如对程序所需要的资源如连接池之类的做集中管理。

 

或者从逻辑上讲,在整个程序运行期间可以只有一个实例,当然也可以创建多个实例,这对程序逻辑没有影响,但是实施强制单一对象实例的代价要远低于带来的收益。

 

全部强制对象单一机制有些多余,我们要比较实施强制措施的代价,而不同的实施方案代价和收益是不同的。

 

最原始方案的就是全局变量,程序开始运行时初始化这个全局变量,代码中每一个使用该类的地方都引用这个全局变量。

 

全局变量一个缺点是有些对象实例实际上很可能根本不会用到,而初始化又恰恰要花点时间。没有办法做到延迟加载,当然有聪明的人会说一样可以实现延迟加载,设置一个函数,每次通过这个函数来获得这个全局变量的引用,在函数里面会判断该全局变量的状态,如果没有初始化才作初始化的动作。实际上根本的缺点在于当这样的情况变得越来越多的时候,逻辑变得很复杂,代码变得难以控制,职责变得很不明确。

 

那么我们开始重构,将类的单一实例以及类初始化的职责封装起来,然后提供一个全局的访问点让其他的代码能够访问到这个单一的类的实例。简单的实现方式可能如下:

public sealed class Singleton

{

        static Singleton instance = null;

        private Singleton () {}

        public static Singleton Instance()

        {

                if (instance==null) {instance = new Singleton (); }

                return instance;

        }

}

 

这里把Singleton类的构造函数设置为private是为了其他类不能直接用new方法来创建多个Singleton的实例并使用它,而是提供了一个全局的访问接口Instance()方法,其他的代码只能通过访问Instance方法来获得一个Singleton类的实例。在Instance()中会判断instance是否已经创建,如果没有创建的话才去创建一个实例出来。

 

练习题:为什么instance要声明为static类型的变量。

 

简单测试之后发现可以Singleton类这样的设计实现了我们的意图,那么我们再检查Singleton的代码

如果多个线程同时调用Instance()方法,而这时instance还没有被创建,这时会怎么样呢,怎样保持线程同步?

 

我们可以对Singleton做一点改造,用lock来强制线程同步

public sealed class SingletonLock

{

    static SingletonLock instance=null;

    static readonly object padlock = new object();        

    private SingletonLock() {}

    public static SingletonLock Instance()

    {

        lock (padlock)

        {

            if (instance==null) {instance = new SingletonLock();}

            return instance;

        }

    }

}

 

每次强制线程同步是很耗费资源的,而实际上只有第一次访问Instance()才需要强制线程同步以确保只创建一个实例,那么可以在锁定线程之前先判断instance是否为null,如果为null才调用lock锁定线程。

public static SingletonLock Instance()

{

    if(instance==null)

    {

        lock (padlock)

        {

            if (instance==null)

            {

                instance = new SingletonLock();

            }

        }

    }

return instance;

}

 

javac#Singleton模式提供了天然的支持,于是我们有了更简单的实现方法。

public class Singleton

{

private static Singleton instance = new Singleton();

    private Singleton(){}

    public static Singleton Instance()

    { return instance; }

}

 

static Singleton instancestatic关键字确保instance在被载入AppDomain时被初始化,而且不会有多线程的困扰。这样在访问Instance()方法时,instance必定是已经创建好的,这样的代价就是失去了延迟加载的特性。

应该是the static field initializers are executed at an implementation-dependent time prior to the first use of a static field of that class.

 

应用Singleton模式会有哪些代价呢,首先实现Singleton模式类的Singleton特性不能被子类天然继承,因为私有变量instance和公共方法Instance()都是静态的,而且基类的构造函数是private的。另外一点就是不透明,调用者知道自己在使用一个Singleton类,需要通过Instance()方法来获得实例。

 

《敏捷软件开发 原则、模式与实践》中介绍了Monostate模式,Monostate模式使用静态变量来实现多个实例共享数据,这样多个类的实例使用起来像一个实例一样,Monostate的代价一方面在于多次创建对象并且销毁会有性能方面的损失,一方面将一个类改造成遵循Monostate模式的类比较麻烦。

 

Singleton强制结构单一,防止创造出多个对象实例,Monostate强制行为单一,所有的实例表现得像一个对象。

 

练习题:

1

以前论坛经常有人争论全是静态函数的Library和遵循Singleton模式的Library孰优孰劣,静态函数的Library有什么缺点?

 

2

CreateSingleton()instance.GetResource()的返回值分别是什么

 

public sealed class Singleton

{

        static Singleton instance = null;

        private int sequence = 0;

 

        private Singleton()

        {

        }

 

        public static Singleton Instance()

        {

                if (instance==null)

                {

                        instance = Initialize();

                }

                return instance;

        }

 

        public int GetResource()

        {

                CreateSequence();

                return sequence;

        }

 

        private static Singleton Initialize()

        {

                System.Threading.Thread.Sleep(200);

                return new Singleton();

        }

 

        private void CreateSequence()

        {

                sequence = sequence + 1;

        }

}

 

public void TestSingleton ()

{

        ThreadPool.QueueUserWorkItem(new WaitCallback(CreateSingleton));

        ThreadPool.QueueUserWorkItem(new WaitCallback(CreateSingleton));

}

 

public void CreateSingleton(object o)

{

        SingletonNotThreadSafeConsuming instance = SingletonNotThreadSafeConsuming.Instance();

        instance.GetResource();

}

posted on 2005-09-13 19:02:00 by microhelper  评论(8) 阅读(4702)

 
2005年09月12日

Template Method使用了对象继承,而继承是一种很强的对象和对象之间的耦合关系,底层模块还是依赖于高层模块,比如子类要知道哪些abstract method要重写,哪些hook method可以做扩展,哪些基类资源可以利用。

 

strategy模式使用对象之间的组合关系来代替继承,进一步减弱高层模块和底层模块之间的依赖,让底层独立于高层,使其完全符合更符合DIP的原则, 这样底层代码不需要了解高层代码是怎么工作的,高层也不需要知道底层的实现细节,

相对于Template Method模式来说strategy模式革命的更彻底一些。

 

还拿Report来作一个简单的例子。

Report的输出可以是Html格式的,可以是Word格式的,也可以是PDF格式的,我们可以定义一个Interface:IReportPublisher,在IReportPublisher中定义高层模块和低层模块之间的调用协议。(或者说Contract

 

Interface IReportPublisher {public void Publish()}

 

HTMLReportPublisher : IReportPublisher

WordReportPublisher : IReportPublisher

PDFReportPublisher : IReportPublisher

 

Report

{

      Public void GenerateReport()

{

     

      reportPublisher = MyContext.GetService()

      reportPublisher.Publish(reportData)

     

}

}

 

当然实现strategy模式也有代价,将Template Method改造成strategy模式后,架构中层次变复杂了,一些Template Method模式原有的特性就没有办法利用了,比如子类可以调用基类一些资源。

 

应用任何一种模式都会有代价,学习模式时,明白为什么这么做比明白怎么实现更重要,了解模式带来的收益的同时也要了解你要付出的代价。模式也是一直随着技术的发展在发展的,有些模式在慢慢消亡,有些新的模式出现,有些模式被新的编程语言天然支持,有些模式的形式发生了变化,Gof的《设计模式》里的一些观点现在来说已经是有些过时了。

 

strategy模式和Template Method模式的对比还体现了面向对象的另一个思想,解决对象之间的协作问题应用对象组合优先于对象继承。在面向对象的初期,人们非常看重对象继承,继承一个类,就可以重用该类的代码,把很多类的代码抽取到一个基类中就可以去掉代码重复,创建一个子类,改变一点点就能创造出一个能实现新功能的类出来,通过继承我们可以建立完整的软件结构分类,每一层都可以重用该层以上的代码,这看起来很美好,到后来人们才慢慢发现继承非常容易被过度使用,而过度使用带来的收益比代价要高的多,所以我们减少对继承的使用,用组合和委托来代替继承。

 

strategy模式和Template Method模式都面对一个问题,在运行时怎么创建某个子类或者某个实现了某个interface的类的实例,那就涉及关于创建对象实例的模式:Singleton模式和Factory模式。

posted on 2005-09-12 18:03:00 by microhelper  评论(0) 阅读(4036)

 
2005年09月09日

template method模式和strategy模式

 

template method模式和strategy模式都是关注对象的行为的,按照依赖倒置的方法来分离抽象和具体的实现,但是两者的实现方法不同。template method模式应用了面向对象中继承的思想,而strategy模式则应用了委托的思想,从template method模式和strategy模式中也可以看到面向对象世界中abstract类和interface的异同。实际上这两种模式我们经常会用到,只是可能没有意识到而已。

 

Template method的常见用法是将运算的骨架放在基类中,然后将某些具体的算法放到子类里面实现,这样就可以使得子类不改变算法的结构即可重定义该算法的某些特定步骤。

 

Template method的一个例子:Report服务。

假定系统中有一系列ReportBooking Report, Billing Report, Aging Report…。这些Report参数不一样,界面不一样,逻辑不一样,但是也有一些有共同点,验证权限,结果输出,Report载入步骤等等。那么为了避免重复代码,有一个较好的可扩充的结构,我们把这些共同点extract到一个基类中ReportBase,简单示例如下:

public class ReportBase

{

    public void OpenReport(string reportId)

    {

        if(UserIsInRole()==true)

        {

            Initialize();

            LoadSavedReport();

        }

    }

 

    private void Initialize()

    {

        InitializeControl();

        SetDefaultValue();

    }

 

    protected abstract void InitializeControl()

    {

    }

 

    protected abstract void LoadSavedReport ()

    {

    }

    protected virtual void SetDefaultValue ()

    {

    }

}

ReportBase中定义了OpenReport()的逻辑,先验证用户权限,然后初始化Report的页面上的控件,设置缺省值,载入用保存的Report。对于每个具体的report来说,界面和参数是不同的,要实现InitializeControl()LoadSavedReport()方法。

 

ReportBase.OpenReport()是一个Template,定义了算法的每一步,并且允许子类提供其中某些步的具体实现。

 

我们可以看到Template Method的主要特点是,将各个子类中不变的行为提取到基类中实现,可变的部分留给子类自己实现,而且基类中定义了一个相对稳定的结构,也就是一个模版Template,模版中的某些步骤留待子类来实现,基类还可以控制子类的扩展,允许某些子类在某些点上作扩展。对于基类来说意义在于控制整个结构,减少重复代码,对于子类来说意义在于不改变算法的机构可以方便的提供一种实现。

 

 

Template Method中可以看到Framework和控制反转的精神,不是每个具体做事情的子类调用所需的Library完成某个行为,而是提供具体实现,让高层的代码来调用。

Hollywood Principle: 当高层的模块依赖低层的模块时,由高层的模块决定何时以及如何调用底层模块,也就是说高层模块对底层模块讲:Don’t call me, we’ll call you

 

当然Template Method模式和strategy模式在现在看来都已经是很自然的都东西。

 

应用Template Method需要先对代码逻辑作分析,哪些放到基类,哪些留给子类,当然这属于OO世界最基本的东西。如果现有的代码重构到Template Method可以参考《RefactoringDealing with Generalization一章。

 

应用Template Method需要注意的是基类需要指明那些行为是子类必须重定义的,哪些行为是允许子类重定义的(Abstract methodHook Method),具体到C#的语法就是abstractvirtual定义。而且需要仔细评估那些子类必须重定义的行为,避免子类中需要做过多的重定义工作。对于可以允许子类重定义的行为来说好比提供了一个hook,在基类中通常是一个空操作,允许子类在这一点上扩展基类的行为。

 

另外一点需要注意的是继承属于很强的耦合关系,过多的继承关系会使系统变得僵化难以变化,往往会用对象的组合来代替继承。

 

一个替代继承的模式是strategy模式。

 

参考

Head.First.Design.Patterns].Head.First.Design.Patterns

《敏捷软件开发 原则、模式与实践》

面向对象设计的基本原则

posted on 2005-09-09 13:06:00 by microhelper  评论(5) 阅读(4271)

 
2005年08月25日

CCNet 1.0 RC1已经发布有些时间了,从进度看1.0正式版应该很快就会发布了。

CCNet支持直接使用Visual Studio IDE编译,单从编译的角度讲使用devenv task比写一个nant的build文件简单,但是不是每一台用来做持续集成的机器都会装Visual Studio,而且nant可以做更多的事情。
<devenv solutionfile="myproject.sln" configuration="debug" />

在nant中如果使用solution来做编译,可能会遇到.net 1_x sdk不可用的错误,这是因为没有安装.Net SDK
你可以检查注册表中的sdkInstallRootv1.1项来检查机器上有没有装SDK
HKML\Software\Microsoft\.NETFramework\sdkInstallRootv1.1
如果安装SDK后还会有该错误发生,可以试着把.Net SDK的Bin目录添加到系统Path中,并且在NAnt.exe.config中指定所需的.Net 版本

CCNet从0.9.1开始, WebDashboard新增了一个NAnt Timing Report,NAnt Timing Report可以显示NAnt每一个target的执行时间信息,不过需要NAnt 0.85 RC3支持。

在nant中用exec调用nunit等工具需要注意,如果命令行参数中含有文件路径,而且路径名含有空格,需要将文件路径用双引号括起来
如果有些程序实在处理起来太麻烦,比如NCover,可以把涉及到的文件copy到一个路径不含空格的临时目录中,处理完后再删掉

nant中调用fxcop时通过/p制定.FxCop文件灵活性更大一些,因为你可以在.FxCop中作一些很复杂的设置,单靠命令行做这些设置太繁琐,如果项目会引用到其他的项目,需要用 /d参数来指定路径
<target name="fxcop" >
 <exec program="${fxcop.executable}"
 commandline="/p:${workingdir}\project.FxCop /o:${artifactdir}\results-fxcop.xml " failonerror="false"/>
</target>

在nant中支持用task nunit2直接调用nunit,但是用exec执行可以忽略nunit版本的影响,更方便些

在持续集成的过程中会产生很多文件,比如nunit的结果,fxcop的结果,一个好的实践是设置ccnet的artifactDirectory属性,把这些文件全部放到artifact目录中,在nant的build文件中也可以访问到artifactDirectory,ccnet会把下列参数通过命令行的形式传递给nant
Label
CCNetBuildCondition
CCNetIntegrationStatus
CCNetLabel
CCNetLastIntegrationStatus
CCNetProject
CCNetBuildDate
CCNetBuildTime
CCNetArtifactDirectory
CCNetWorkingDirectory

在CCNet的Dashboard report中默认是支持simian的,但是simian是要钱的,要钱俺们是不用的,可以找一个免费的替代的。

如果你使用了其他ccnet Dashboard没有默认支持的程序,可以通过修改dashboard.config来让这些程序的结果显示在Dashboard中
比如要显示Vil的分析结果
<xslReportBuildPlugin description="Vil Report" actionName="VilBuildReport" xslFileName="xsl\vil.xsl"/>

vil也不是完全免费的,如果分析的assemblies超过100个type需要申请key,vil的结果还没看明白

posted on 2005-08-25 17:40:00 by microhelper  评论(5) 阅读(4105)

 
2005年04月29日

抽空将CCNet从0.7升级到0.9

0.9提供了安装文件,部署更简单了,Dashboard也变得整洁多了

0.9去掉了CommandLineBuilder,以Executable Task取而代之
FxCop仍然没有成为内置的Task
虽然有了NUnit Task,但是不如放在nant中执行test方便
性能有提高,不过解析大的xml文件时cpu占用率仍然很高

CCNet+nant,再加Visual Build的协助,非常好的持续集成平台

posted on 2005-04-29 20:11:00 by microhelper  评论(3) 阅读(3450)

 
2005年04月12日

AJAX Wrapper for .NET

作者提供了几个例子,dll可以免费下载,还有一段video讲解怎么使用。

新的特性可能会包括
- build a Javascript method by simply adding an attribute to your methods
- return every data type like int, long, double, bool, string,...
- return your own classes you are using in your favorite programming language
- return System.DateTime, System.Data.DataSet, System.Data.DataTable
- return arrays of objects
- use the returned objects as a local Javascript object

在Lostinet.Rane在外有了一个新的选择。

当然Lostinet.Rane也很好用。一直没见到Lostinet.Rane的license,到底Lostinet.Rane是免费的还是要钱的? :)

posted on 2005-04-12 17:54:00 by microhelper  评论(7) 阅读(4825)

 
2005年04月08日

今天试用了DotNetNuke一下,先安装的3.0.10,添加了几个页面后升级到3.0.13,DotNetNuke的安装和升级方式值得借鉴一下。

网上的中文安装文档转来转去实际就那么几份,大多很简单,而且都是讲访问localhost/dotnetnuke来安装,不过这样做是有问题的,这样一来从别的机器访问dotnetnuke时,页面上显示的链接都是错误的,指向了localhost/dotnetnuke/....,起码我这样安装时是遇到这样错误的,应该通过访问myserver/dotnetnuke这样的url来安装。升级的时候新增的module不会自动添加,需要用host账号登陆手工添加。

DotNetNuke用起来确实很方便,很快就可以建一个普通的portal,网上搜索了一下,没找到什么skin,免费的module也不多,自己也不会花时间去定制,不过自带的module也基本够用了。

试用的时候发现添加多个module到pane后,因为module宽窄不一显得比较难看,没有css基础,也没看到那里可以设置让他们对齐。

日历用起来不太爽,title和description都挤在日历里显示,有点凌乱,没找到在日历用图标来代替title的方法。

有些还需要继续确认一下,比如Announcements支不支持分页,Gallery怎么添加,还有哪些免费的module可以利用等等。

posted on 2005-04-08 00:03:00 by microhelper  评论(11) 阅读(9162)

 
【第1页/共6页,90条】
首页
前页
1

Powered by: Joycode.MVC引擎 0.5.1.0