重重的壳裹着轻轻的仰望

I smile when I'm angry. I cheat and I lie. I do what I have to do ··· To get by.
posts - 19, comments - 23, trackbacks - 1, articles - 0

2008年5月13日

设计原则 英文表达 说明
单一职责原则 SRP,Single Responsibility Principle 一个合理的类,应该仅有一个引起它变化的原因,即单一职责。
开-闭原则 OCP,Open - Close Principle 软件应该对修改关闭,对扩展开放
依赖倒置原则 DIP,Dependency Inversion Principle 依赖于抽象,而不要依赖于具体,因为抽象相对稳定
接口隔离原则 ISP,Interface Segregation Principle 尽量应用专门的接口,而不用单一的总接口。应该将依赖建立与多个小接口上
Liskov 替换原则 LSP,Liskov Substitution Principle 子类必须能够替换其基类
合成/聚合复用原则 CARP,Composite/Aggregate Reuse Principle 少继承,多运用对象组合,即多聚合。
迪米特法则 LoD,Law of Demeter 又叫最小知识原则,指软件实体应该尽可能少的和其他软件实体发生相互作用。

posted @ 2008-05-13 10:55 暴走的猪 阅读(192) 评论(1) 编辑

2008年5月7日

概述:

串行化(serialization)是指将一个对象的当前状态转换成字节流(a stream of bytes)的过程,而反串行化(deserialization)则指串行化过程的逆过程,将字节流转换成一个对象。初听起来可能对此不太感兴趣,但是使用串行化却有许多重要的原因。一旦将某一对象串行化,得到的字节可以存储在文件、数据库,或内存中——只要是可以存储的任何地方。需要恢复对象时,仅仅只需从它存储的位置反串行化即可。对象固有的这种特性对于无状态的Web应用程序是非常重要的,因为它允许重要的状态信息可以在用户请求之间保留。

串行化也允许对象在应用程序边界之间传递,编程人员可以将描述对象状态的字节流在网络上传递,并在另一端反串行化成一个匹配的对象。从本质上讲,串行化允许对象以“数值”的方式传递给另一个应用程序。.NET远程框架广泛地在进程之间使用串行化来编组对象数据。

串行化不是.NET新引入的概念,Windows程序员同各种各样的串行化打交道:MFC中的归档机制、Visuabl BasicPropertyBagCOMIPersistStream接口等,都具有类似的特性。那么.NET串行化与这些方式又有什么区别呢?一个字,简单。在.NET以前的开发环境中,串行化是一个手工定制,对于类设计人员来说,实现类的串行化并不困难,但是实现难度较大的设计,它就显得能麻烦、耗时。在.NET中,该过程完全是自动进行的,用户所做的就是使用Serializable特性来标记一个能串行化的类,运行库做余下的事。

.NET运行库怎样实现这一捷径的呢?当然是利用镜像,或更为准确地说是反射。前面提到,程序集含有名为元数据的自描述(self-describing)数据,程序集的元数据完整地表述了内部每一个类型,包括类型中每个私有字段的信息。通过反射过程,运行库能识别元数据,并用它来决定类应怎样被串行化。

使用Serializable特性实现串行化:
前面已经提到,如果允许运行库串行化一个对象,必须将该类标记上
Serializable特性。下面的代码定义了两个标记了Serialable特性的类。

[Serializable]

public class Car

{

private string mColor;

private int mTopSpeed;

//Reference to another object

private Radio mRadio;

[NonSerialized] //Runtime will not serialize this field

private string mNickName;

public Car(string nickName, int topSpeed, string color)

{

mNickName = nickName;

mTopSpeed = topSpeed;

mColor = color;

mRadio = new Radio();

}

}

[Serializable]

public class Radio

{

private int mVolume = 5;

}

如上所示,Car类的mNickName字段用NonSerialized特性标注,指示运行库进行串行化时跳过该项,而其他部分允许进行串行化。这里注意,mRadio是对另一对象的引用,意味着运行库必须对其串行化。事实上,当运行库被告知要对某个对象串行化时,使用给定的对象作为根,建立一个对象图表(类似于垃圾回收器)。所有在图表中的对象也必须可被串行化的,否则运行库将引发异常。

下面的代码举例说明如何将Car对象串行化到一个文件之中。

static void Main(string[] args)

{

Car myCar = new Car("Christine", 150, "Red");

FileStream mySoapFile = File.Create("Car.txt");

// Use a SOAP formatter object to serialize the object.

new SoapFormatter().Serialize(mySoapFile, myCar);

mySoapFile.Close();

}

运行库不控制串行化数据的实际格式,但是有一个专门进行格式化的对象负责对串行化输出进行格式化。.NET框架有两种格式化程序:SOAP格式化程序和二进制格式化程序。在前面的例子中,SoapFormatter对象将对象串行化进一个SOAP报文,并将其发送到特定的流中。图2-26显示了在执行完这段代码后Car.txt中的内容。

如果仔细查看图2-26,很容易发现SOAP是如何描绘每个对象和它的数据成员。这种方式通过增加文件大小来提高了可读性。二进制格式化程序使用了更为紧凑的格式。如果需要在网络间发送对象,这种方式就更重要,尤其是在需要考虑网络带宽而不强调可读性的情况下。

通过调用SoapFormatter.Dewerialize方法,就可将该对象读入内存中:

static void Rehydrate()

{

FileStream mySoapFile = File.Open("Car.txt", FileMode.Open);

Car myCar = (Car) new SoapFormatter().Deserialize(mySoapFile);

mySoapFile.Close();

}

2-26  使用SOAP格式化程序对Car对象进行串行化




注:摘自《NET分布式编程——C#篇 》

posted @ 2008-05-07 16:56 暴走的猪 阅读(89) 评论(0) 编辑

 .NET3CCTSCLSCLR

.NET结合JavaCOM解决方案两者优点来解决互操作性问题。类似于COM定义的标准二进制格式,.NET定义了一个称为通用类型系统Common Type System(CTS)的类型标准。这个类型系统不但实现了COM的变量兼容类型,而且还定义了通过用户自定义类型的方式来进行类型扩展。任何以.NET平台作为目标的语言必须建立它的数据类型与CTS的类型间的映射。所有.NET语言共享这一类型系统,实现它们之间无缝的互操作。该方案还提供了语言之间的继承性。例如,用户能够在VB.NET中派生一个由C#编写的类。

很显然,编程语言的区别不仅仅在于类型。例如,一些语言支持多继承性,一些语言支持无符号数据类型,一些语言支持运算符重载。用户应认识到这一点,因此.NET通过定义公共语言规范(CLSCommon Language Specification),限制了由这些不同引发的互操作性问题。CLS制定了一种以.NET平台为目标的语言所必须支持的最小特征,以及该语言与其他.NET语言之间实现互操作性所需要的完备特征。认识到这点很重要,这里讨论的特征问题已不仅仅是语言间的简单语法区别。例如,CLS并不去关心一种语言用什么关键字实现继承,只是关心该语言如何支持继承。

CLSCTS的一个子集。这就意味着一种语言特征可能符合CTS标准,但又超出CLS的范畴。例如:C#支持无符号数字类型,该特征能通过CTS的测试,但CLS却仅仅识别符号数字类型。因此,如果用户在一个组件中使用C#的无符号类型,就可能不能与不使用无符号类型的语言(VB.NET)设计的.NET组件实现互操作。这里用的是“可能不”,而不是“不可能”,因为这一问题实际依赖于对non-CLS-compliant项的可见性。事实上,CLS规则只适用于或部分适用于那些与其他组件存在联系的组件中的类型。实际上,用户能够安全实现含私有组件的项目,而该组件使用了用户所选择使用的.NET语言的全部功能,且无需遵守CLS的规范。另一方面,如果用户需要.NET语言的互操作性,那么用户的组件中的公共项必须完全符合CLS规范。让我们来看下面的C#代码:

public class Foo

{

// The uint(unsigned integer)type is non-CLS compliant.

//But since this item is private,the CLS rules do not apply.

private uint A = 4;

// Since shis uint member is public,we have a CLS

// compliance issue.

public uint B = 5;

// The long type is CLS compliant.

public long GetA()

{

return A;

}

}

最后一个C是公共语言运行库Common Language Runtime(CLR)。简单地说,CLRCTS的实现,也就是说,CLR是应用程序的执行引擎和功能齐全的类库,该类库严格按照CTS规范实现。作为程序执行引擎,CLR负责安全地载入和运行用户程序代码,包括对不用对象的垃圾回收和安全检查。在CLR监控之下运行的代码,称为托管代码(managed code)。作为类库,CLR提供上百个可用的有用类型,而这些类型可通过继承进行扩展。对于文件I/O、创建对话框、启动线程等类型——基本上能使用Windows API来完成的操作,都可由其完成。

让我们正确看待“3C”。开发人员在构建自己的分布式应用程序时,因为用户在编程时将直接面对CLR,应将主要精力放在学习了解CLR上,而不是CTSCLS。而对于希望以.NET平台为目标的语言和工具开发商来说,就需要深入理解CTSCLS。互操作性组件是分布式应用的关键,因此理解.NET如何通过定义公共类型实现这一目标,也就显得十分重要。

所有.NET语言编译器生成与平台无关的代码,称为通用中间语言(CIL,简称IL)。从概念上来讲,这一点非常类似Java中的字节码。但与Java字节码所不同的是,Microsoft设计的IL可以由任一语言编译器很容易地生成。

前面提到的,程序集包含IL,而不是源代码。在运行过程中,当第一次调用一个方法,为了更快的执行程序,实时Just-In-Time (JIT)编译器将该方法的IL代码转换成源代码(与平台有关).NET只编译需要在运行库中使用的那部分IL。当然,它将会把转换得到的源代码放入缓存中,以便以后的调用能够直接使用该源代码。

同时考虑到CTSCLRIL.NET提供了除了Windows之外,还能移植到其他操作系统的可能。如果可能的话,用户可以用任何一种语言开发与平台无关的应用程序。当然,这里有一个关键词是“可能”,因为目前.NET只能在Windows操作系统上运行。


注:摘自《.NET分布式编程——C#篇

posted @ 2008-05-07 13:58 暴走的猪 阅读(651) 评论(1) 编辑

2008年4月17日

摘要: 本文案例如下:后台使用C#写的webservice,返回一个xml串作为结果集。前端需要对xml结果解析,放入到一个表格中。以前没用Ext的解决办法是 :前台写xsl 转换xml,把结果放入某个div内。。。优点是灵活多样,缺点是需要手写xsl代码,并对开发人员的dom以及css技术有比较高的要求。现在有了漂亮贼酷的Ext,没有理由不选它。于是用Ext.data.XmlReader 读取服务器传回...阅读全文

posted @ 2008-04-17 17:54 暴走的猪 阅读(3560) 评论(6) 编辑

2008年4月8日

项目需要,领导让俺研究一下ExtJS。以前用的是我们公司自己写的ajax框架,感觉很多地方不是太方便。终于要换一个ajax框架,那是相当高兴,马上下载研究。

发现ExtJS确实很强大很好使。其他的就不说了,说说无意中还发现的ExtJS提供的本地化功能:

你想用Ext.MessageBox.alert一个对话框,结果发现“确定”按钮是英文的“OK” ,取消按钮是英文的“cancel”...
在通篇的中文页面上,出来这几个英文字母实在有碍观瞻。怎么办?

ExtJS2.0
提供了多种语言的本地化功能(赞一下)。以简体中文为例:
在\source\下找到一个\locale\ 文件夹,里面有个ext-lang-zh_CN.js 文件,把这个js文件引用到你的页面上:
<script type="text/javascript" src="ExtJs/source/locale/ext-lang-zh_CN.js"></script>
注意:
上面这行要放在 <script type="text/javascript" src="ExtJs/ext-all.js"></script> 之后。


就这么简单,重新弹出一个alert框看看!应经变成中文的“确定”了!


posted @ 2008-04-08 17:59 暴走的猪 阅读(1189) 评论(2) 编辑