2008年8月28日

使用 Visual Studio Tools for Office 可以创建两种类型的解决方案:文档级自定义项和应用程序级外接程序。它们具有以下配置:

  • 文档级自定义项由附加于 Microsoft Office Word 文档或 Microsoft Office Excel 工作簿的托管代码程序集组成。

  • 应用程序级外接程序由作为 Microsoft Office 应用程序中的外接程序运行的托管代码程序集组成。

 使用Visual Studio Tools for Office 开发的应用程序是基于CLR的托管应用程序,而Office 是基于COM 组件的非托管应用程序.所以在此觉得有必要复习一下托管应用程序在CLR中的执行过程.就举一个最简单的例子吧,代码如下:

Code

下图为执行的流程图

     简单说说执行过程,VS.NET IDE 调用CSC.exe编译器生成EXE程序集.以32位操作系统为例.当执行EXE程序集时,首行创建一个32位的进程,这个进程中的主线程会去调用MSCorEE.dll组件来初始化CLR,MSCorEE.dll位于C:\WINDOWS\system32目录下,用来判断一台机器是否安装.NET Framework.初如化的CLR会去加载EXE程序集,并从函数入口点Main()开始执行程序,CLR为Main方法中调用的Console类型分配一个单独的内部结构,并为每个该类型的每个方法付上地址,以便该方法调用的时候使用,当首次调用WriteLine()方法时,会去调用JIT编译器,JIT编译器从元数据中查找WriteLine方法,把它编译成本地的CPU代码.并修改存储在Console类型中WriteLine的指针,这样子第二次开始调用WriteLine方法可直接执行本地的CPU代码.另外对元数据有点补充,元数据有二张表,一张是类型表,如用来核对编译时的参数类型.另一个是成员表.说明该托管模块有哪些成员.

 

还没写完.........

posted @ 2008-08-28 16:40 Cameo 阅读(17) | 评论 (0)编辑

2008年8月1日

     摘要: 耦合与变化耦合是软件不能抵御变化灾难的根本性原因。不仅实体对象与实体对象之间存在耦合关系,实体对象与行为操作之间也存在耦合关系。 动机(Motivation)在软件构建过程中,“行为请求者”与“行为实现者”通常呈现一种“紧耦合”。但在某些场合——比如需要对行为进行“记录、撤销/重做(undo/redo)、事务... 阅读全文
posted @ 2008-08-01 19:35 Cameo 阅读(22) | 评论 (0)编辑

2008年7月28日

无处不在的Template Method
     如果你只想掌握一种设计模式,那么它就是Template Method!

     变化——是软件设计的永恒主题,如何管理变化带来的复杂性?设计模式的艺术性和复杂度就在于如何分析,并发现系统中的变化点和稳定点,并使用特定的设计方法来应对这种变化。

动机(Motivation)
     在软件构建过程中,对于某一项任务,它常常有稳定的整体操作结构,但各个子步骤却有很多改变的需求,或者由于固有的原因(比如框架与应用之间的关系)而无法和任务的整体结构同时实现。
     如何在确定稳定操作结构的前提下,来灵活应对各个子步骤的变化或者晚期实现需求?

意图(Intent)
     定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。Template Method使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤
                                                                                                                                                      ——《设计模式》GoF

结构(Structure)

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Template_method
{
    
//框架开发者-先开发

    
public abstract class Vehical //表示汽车
    {
        
protected abstract void startup();//业界的共识 虚方法前加protected
        protected abstract void run();
        
protected abstract void turn(int degree);
        
protected abstract void stop();
        
public void Test()  //非虚方法前加public
        {
            
// 测试数据记录
            startup();//晚绑定-留给应用程序开发人员;扩展点

            
// 测试数据记录
            run();//晚绑定-留给应用程序开发人员;扩展点

            
// 测试数据记录
            turn(40);//晚绑定-留给应用程序开发人员;扩展点

            
// 测试数据记录
            stop();//晚绑定-留给应用程序开发人员;扩展点

            
//生成测试报表
        }

    
    }



    
//应用程序开发-晚开发

    
public class HongqiCar : Vehical
    
{
        
protected override void startup()
        
{
            Console.WriteLine(
"startup");
        }


        
protected override void run()
        
{
            Console.WriteLine(
"run");
        }

        
protected override void turn(int degree)
        
{
            Console.WriteLine(
"degree");
        }

        
protected override void stop()
        
{
            Console.WriteLine(
"stop");
        }


    }


    
class VehicalTestFramework
    
{
        
public static void DoTest(Vehical vehical)
        
{
            vehical.Test();
        }

    }

    
class Program
    
{
        
static void Main(string[] args)
        
{
            VehicalTestFramework.DoTest(
new HongqiCar());
            Console.ReadLine();
        }

    }

}

 

Template Method模式的几个要点
     • Template Method模式是一种非常基础性的设计模式,在面向对象系统中有着大量的应用。它用最简洁的机制(虚函数的多态性)为很多应用程序框架提供了灵活的扩展点,是代码复用方面的基本实现结构
     • 除了可以灵活应对子步骤的变化外,“不要调用我,让我来调用你”的反向控制结构是Template Method的典型应用。
     • 在具体实现方面,被Template Method调用的虚方法可以具有实现,也可以没有任何实现(抽象方法、纯虚方法),但一般推荐将它们设置为protected方法。

     模版方法模式实际上是所有模式中最为常见的几个模式之一,而且很多人可能使用过模版方法模式而没有意识到自己已经使用了这个模式。模版方法模式是基于继承的代码复用的基本技术,模版方法模式的结构和用法也是面向对象设计的核心

 

posted @ 2008-07-28 19:17 Cameo 阅读(10) | 评论 (0)编辑

2008年7月25日

直接与间接

     人们对于复杂的软件系统常常有一种处理手法,即增加一层间接层,从而对系统获得一种更为灵活、满足特定需求的解决方案

     

动机(Motivation)
     在面向对象系统中,有些对象由于某种原因(比如对象创建的开销很大,或者某些操作需要安全控制,或者需要进程外的访问等),直接访问会给使用者、或者系统结构带来很多麻烦。
     如何在不失去透明操作对象的同时来管理/控制这些对象特有的复杂性?增加一层间接层是软件开发中常见的解决方式

意图(Intent)
     为其他对象提供一种代理以控制对这个对象的访问
                                                                 ——《设计模式》GoF
 

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Proxy
{

    
Subject

    
RealSubject

    
Proxy

    
Client
}

Proxy模式的几个要点
     • “增加一层间接层”是软件系统中对许多复杂问题的一种常见解决方法。在面向对象系统中,直接使用某些对象会带来很多问题,作为间接层的proxy对象便是解决这一问题的常用手段。
     • 具体proxy设计模式的实现方法、实现粒度都相差很大,有些可能对单个对象做细粒度的控制,如copy-on-write技术,有些可能对组件模块提供抽象代理层,在架构层次对对象做proxy。
     • Proxy并不一定要求保持接口的一致性,只要能够实现间接控制,有时候损及一些透明性是可以接受的。
posted @ 2008-07-25 11:29 Cameo 阅读(16) | 评论 (0)编辑

2008年7月20日

     摘要: 面向对象的代价面向对象很好地解决了系统抽象性的问题,同时在大多数情况下,也不会损及系统的性能。但是,在某些特殊的应用中下,由于对象的数量太大,采用面向对象会给系统带来难以承受的内存开销(拆箱操作)。比如图形应用中的图元等对象、字处理应用中的字符对象等。 动机(Motivation)采用纯粹对象方案的问题在于大量细粒度的对象会很快充斥在系统中,从而带来很高的运行时代价——主要指内存需求方面的代价(空... 阅读全文
posted @ 2008-07-20 10:43 Cameo 阅读(16) | 评论 (0)编辑

2008年7月16日

     摘要: 意图(Intent)为子系统中的一组接口提供一个一致的界面,Façade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。——《设计模式》GoF 下列的图形只是我自己对软件产品的了解Facade模式的两层含义:1.简单  2.解藕 [代码]结构(Structure)Facade模式的几个要点• 从客户程序的角度来看, Facade模式不仅简化了整个组件系统的接口,同... 阅读全文
posted @ 2008-07-16 11:08 Cameo 阅读(27) | 评论 (0)编辑

2008年7月4日

     摘要: 动机(Motivation)上述描述的问题根源在于我们“过度地使用了继承来扩展对象的功能”,由于继承为类型引入的静态特质,使得这种扩展方式缺乏灵活性;并且随着子类的增多(扩展功能的增多),各种子类的组合(扩展功能的组合)会导致更多子类的膨胀(多继承)。如何使“对象功能的扩展”能够根据需要来动态地实现?同时避免“扩展功能的增多”... 阅读全文
posted @ 2008-07-04 13:38 Cameo 阅读(24) | 评论 (0)编辑

2008年7月1日

    面向对象有一个原则:接口最小化原则.(我们应该把我们对象里尽可能少的接口暴露给外界(一般只暴露业务业务接口)) |内部实现,和内部实现细节的接口不要暴露给客户. 
    面向对象和设计模式解决的是依懒问题.
 
    动机(Motivation)
        上述描述的问题根源在于:客户代码过多地依赖于对象容器复杂的内部实现结构,对象容器内部实现结构(而非抽象接口)的变化将引起客户代码的频繁变化,带来了代码的维护性、扩展性等弊端
        如何将“客户代码与复杂的对象容器结构”解耦?让对象容器自己来实现自身的复杂结构,从而使得客户代码就像处理简单对象一样来处理复杂的对象容器

意图(Intent)
    将对象组合成树形结构以表示“部分-整体”的层次结构。Composite使得用户对单个对象和组合对象的使用具有一致性
                                                                                                                                    ——《设计模式》GoF

结构(Structure) 
 
  • 抽象构件(Component)角色:这是一个抽象角色,它给参与组合的对象规定一个接口。这个角色给出共有接口及其默认行为。
  • 树叶构件(Leaf)角色:代表参加组合的树叶对象。一个树叶对象没有下级子对象。
  • 树枝构件(Composite)角色:代表参加组合的有子对象的对象,并给出树枝构件对象的行为。

可以看出,Composite类型的对象可以包含其它Component类型的对象。换而言之,Composite类型对象可以含有其它的树枝(Composite)类型或树叶(Leaf)类型的对象。(像asp.net控件中的panel控件,其它的asp.net控件没有实现ControlCollection方法)



namespace Composite
{
    
Component

    
Leaf

    
Composite