net是什么?
首先 他是一个环境.其不光可以实现开发 控制台应用程序 web 应用程序,windows应用程序,移动开发,web service开发 分布式开发 服务器与客户端开发 水晶报表开发而且将来可以实现将分布在不同地方的计算机组共同合作开发
其次 其核心 :CLR和庞大的类库.CLR(通用语言运行时)为程序运行提供服务,例如:内存管理,线程管理,代理管理,安全管理,垃圾管理,纠错功能,提升程序运行速度.
当然NET还支持非受控代码 也就是其不受CLR管理,这样就不能享受CLR提供的安全 垃圾等一些服务.
第三:NET有一个庞大的野心:也是NET的设计核心概念:也就是分布式的发展 ,从单机 客户端/服务器模型 和web网站的方式向分布式方向发展,通过跨平台,与无言无关的soap协议,web服务,把各种不同功能的接口由在软件的一个部件中提升到网络上,从而实现了分布式开发,使用"服务"
第三:NET其实只有一种语言:MSIL(microsoft中间语言),但其却支持20多种语言,而且msil是开源的,也就是说只要开发出相应的转换程序 就可以支持任意的语言
框架学习:
垃圾管理 :managed Heap 受控堆
程序集:自描述的主体元数据 装载卸载方便 版本控制 dell地域 安全性:GUID 延迟签名
应用程序域比历史上进程的优点:
历史上 进程是隔绝每个应用程序的 ,如果进程间要交换数据,可以通过代理
应用程序域:1一个进程可以有多个应用程序域,这样一个应用程序域出错,不用关掉整个应用程序,只需关掉出现错误的应用程序域,然后重新加载
2一个应用程序域中的错误不会影响其他应用程序域
3一个应用程序域不能访问另一个应用程序域,可以通过拷贝应用程序域中的需要用到的对象来访问一个应用称西域(本地访问)
还可以通过代理的方法 实现远程访问
4程序集与应用程序域: 程序运行的时候先加载 程序集,可以把一些对象经常使用的封装称共享程序集,装载到一个中立应用程序域中,这样所有的程序都可以访问
加载到中立应用程序域中,而不是都加载,这样节省了内存空间
5:应用程序域与线程
1微软打算用270亿美元来传播 .net
net出发点就是分布式,
2webService就相当于是API函数,或者类的方法的接口,只不过 其不是分布在软件的不同部分中
而是分布在不同的网络上
3实现了 software as service 软件即服务 的理念
以后可以把软件分布在网络上,根据需要订购不同功能的"服务
4 soap 和 web服务 成为.net的核心
web服务定义:
是一种自描述,自包含,模块化的应用,可以为web上其他应用程序调用
web服务三大协议:
soap使用XML,这样便屏蔽了平台之间的差异 使其与平台无关,与操作系统无关
soap:简单对象访问协议:soap 提供是在分布式系统中
wsdl web服务描述语言
DISCO :web服务发现协议
优点:
1平台无关性
对于服务请求者 与 服务提供者之间的交互 被设计成完全与平台无关
,通过WSDL语言和现在平台都支持的HTTP协议来保证平台无关性
2Just in time integration 即时整合技术 DISCO确保发现服务 是自配置的,健壮的,其直接把请求服务与提供服务者绑定一起,
从而实现分布式,各人做个人的事情,而不存在一个主机了
3 封装性,使用者只需只要服务的接口 就可以使用条用服务
webService体系:
部署Deploy:将web服务部署到web上,并使用WSDL描述
发布Publish:将web服务发布到web上,服务代理(Server Broker)帮助服务提供者与服务请求者(Service Requestor)互相发现
返回:指代理处理用户请求,并返回结果,然后将请求者与服务绑定(Bind),从而使得请求者可以调用服务
面向服务的体系结构SOA:
面向服务的架构(soa)
三种角色:
Service Provider:发布服务
Service broker:注册应经发布的Service Provider 并对其进行分类,并提供搜索服务,方便Service requester查找,
Service requester:
三种操作:
publish:Service Provider 向Service broker注册自己的功能及其访问接口
find: service requester通过Service broker查找特定的功能的服务
bind:使Service requester 能够真正使用web服务功能
web 服务平台是:
XML HTTP SOAP WSDL UDDI
未来会增加的:XMAL XLANG XKMS XFS
SOAP:Simple Object Access Protocol 简单对象访问协议:
定义了传递XML数据的方式,以及如何在底层通信协议HTTP基础上执行远程调用(RPC)的方法
它有三个内容:
1XML-envelope:1定义了如何把一般信息,数据描述成xml形式的数据,信息
2远程调用的约定:RPC
3HTTP
简单的说SOAP=XML+RPC+HTTP
2UDDI:Universal Description Discovery and Integration :提供了描述 发现商业服务的框架
核心组件: UDDI商业注册,其提供的信息包含三个方面的内容:
白页:提供了地址,联系方法和已知的企业标示
黄页;提供了:基于标准分类法的行业类别
绿叶: 包括了该企业所提供的Web Service的技术信息
3WSDL webService 定义语言:用于定义WebService, 描述一个WebService的功能,它在哪里,如何调用等内容
UDDI描述了一个web Service的大部分方面,而UDDI可以看做是其一个子集
怎么样A地方的用户明白B地方的web 服务是什么意思呢,这是需要共同的标准来定义
IBM与MICROSOFT都支持WSDL作为WEB SERVICE的标准语言
4XLAN:数据库中事务处理的传统概念是:原子性 也就是要么不做,要么全做,在分布式系统中维持这种概念
即使用 两项承诺的方式 处理事务;
XLAN是未来的方向:
XLAN概念:每一个动作都有一个互补的动作,例如取出100元,互补的就会存入100元,这项技术还在研究之中
例如对于这个简单的web service: 其soap:
[WebMethod(Description = "返回两个数的和")]
public int Add(int num1, int num2)
{
return num1 + num2;
}
请求时候:
Host是要请求的主机地址,
length是一个变量,会根据用户输入的int 数值的长度变化
表示请求的soap的总的字节数
POST /vs2005/WEB%20SERVICE/WebService.asmx HTTP/1.1
Host: localhost
Content-Type: application/soap+xml; charset=utf-8
Content-Length: length
<?xml version="1.0" encoding="utf-8"?>
<soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://www.w3.org/2003/05/soap-envelope">
<soap12:Body>
<Add xmlns="http://tempuri.org/">
<num1>int</num1>
<num2>int</num2>
</Add>
</soap12:Body>
</soap12:Envelope>
HTTP/1.1 200 OK
Content-Type: application/soap+xml; charset=utf-8
Content-Length: length
响应的时候:
返回结果给调用者,响应也是一个xml文件
<?xml version="1.0" encoding="utf-8"?>
<soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://www.w3.org/2003/05/soap-envelope">
<soap12:Body>
<AddResponse xmlns="http://tempuri.org/">
<AddResult>int</AddResult>
</AddResponse>
</soap12:Body>
</soap12:Envelope>
WSDL是对WeB SERVICE进行所有的描述的语言,可以让不同平台,不同的公司
能够识别web service的功能,调用方法 等等一切信息
例如下面是对 两数相加的 有关需要的参数的类型的描述部分:
WSDL是xml-shema形式的定义文件
- <s:element name="Add">
- <s:complexType>
- <s:sequence>
<s:element minOccurs="1" maxOccurs="1" name="num1" type="s:int" />
<s:element minOccurs="1" maxOccurs="1" name="num2" type="s:int" />
</s:sequence>
</s:complexType>
</s:element>
- <s:element name="AddResponse">
- <s:complexType>
- <s:sequence>
<s:element minOccurs="1" maxOccurs="1" name="AddResult" type="s:int" />
</s:sequence>
</s:complexType>
</s:element>
SOA:面向服务,与AJAX结合 可以实现一种飞跃
Web2.0技术 就是WEB SERVICE +AJAX 把网站上别人辛苦的东西 都聚集起来,用创新的思想整合成自己的网站,例如有一个网站,把baidu google 的搜索结果 都放在自己的网站上,供用户选择,这样用户就直接浏览这个网站,其他很多 ,只要很好的创新 就可以设计出赚钱的web.2.0网站
加入你有一个宏伟的网站目标,但是你一个人没有这么多经历去做,我们就可以从别人做好的比较成熟的网站上提取我们需要的功能整合起来 组织成一个网站,这就是web 2.0
AJAX不是新技术,但是 web2.0思想是新思想,只要创新就可以赚钱
Web 2.0
AJAX
RSS技术
Web service 必须要学会定制服务,所以 底层的saop相关技术要学习
实现自己的梦想必须要认真学习以上技术
例如 网站的体育新闻来自sina
不同的游戏来自不同的游戏主运行商
然后把所有的信息组织起来,一个网站整合所有的东西
可以定制页面,可以给用户提供一个桌面 :现在桌面图像化界面 什么文件夹是在电脑上面,可以把电脑的相关技术 引入互联网
例如 打开一个网页是各种 图标, 我的电脑有我的文件,完全由用户自己组织,
每一个人都有一个网络桌面,有开始菜单,对应于电脑的每一个方面都认真思考创新
都可以 与当前的电脑关联 还可以与远程的电脑关联,远程操作其他的电脑傻瓜化管理都可以 还有定制服务,还有添加功能,为用户提供服务,游戏里面的攻略
全部采用 魔兽世界的小图标,开始菜单程序放置用户定制的所有的功能
开始菜单放置用户常用,可以有虚拟桌面背景,音乐连接各大网站,每一个人都有一个管家,是客户端的形式,一起组成一个网络电脑界面,每个人都有一个家
真正让用户实现 打开一个网站 不用再打开其他任何网站,而且完全友好 由用户自己管理自己需要的东西,
1
有索引的地方都要有RSS
2
当用户输入联系人的时候 可以实现自动显示以a开头的所有人的名字,这是AJAX的一个应用
3
可以随便的拖拽,在网页上随便拖拽某个图形或者其他东西 这个也是需要的
4
网站推广:炒作不错 例如 以前 一个女的 描述一下 踩死猫,可以引起人思考的事件
AJAX设计模式”
:<拥抱变化> 这本书 有设计模式的相关内容
《人月神话》
1重构
2封装(因为不同的浏览器使用不同的AJAX原理,所以必须要把一些技术封装起来,
AJAX封装底层的一些浏览器的不同,使得开发者不用写这么if语句.微软帮我们设计号了
)
设计模式是软件开发最流行的词语,也是面试中最具诱惑的闪光点!
软件腐化的原因:--可维护性才是王道
1过于僵硬?? 相反:要使软件具有 可扩展性(新性能可以很容易加入系统)
2过于脆弱?? 灵活性(修改不会波及其它)
3复用率低??
4粘度过高?? 可插入性(新功能容易加入系统(气囊加入方向盘))
解释:
过于僵硬、过于脆弱、复用率低、粘度过高的系统都必然导致可维护性的减弱。反过来,可扩展、可插入、灵活的设计是提高可维护性的基础,但不一定能够保证可维护性。
有些人开发的系统高度灵活,所有数据库字段都可以动态添加、删除,表也可以动态构建。可以说灵活性高、可插入、可扩展性也很强。但导致代码超级复杂,读起来根本就找不到北,更不用说修改了。这时候,可维护性就显得很低。甚至在维护代码时,不小心触动一些关键部件造成系统出现问题。
有时候我提倡为开发人员写代码(注意:不是注释)。有些代码不是给客户用的,而是给开发人员用的。包括必要的错误定位工具,内部调试断点,性能计数器等等。这些代码可以帮助提高系统的可维护性。
总之,可维护性是一个综合的概念,任何人都无法预料客户需求会发生什么样的变化,“未雨绸缪”和“亡羊补牢”都是提高可维护性的一个很好切入点。测试驱动开发以及契约式开发对提高可维护性也有不少帮助。?
提高系统可复用性的几点原则:
传统复用:
1. 代码的粘帖复用
2. 算法的复用
3. 数据结构的复用
* 可维护性与可复用性并不完全一致
应用下面原则可以调高程序的可维护性:
一、 "开放-封闭"原则(OCP)
Open-Closed Principle原则讲的是:一个软件实体应当对扩展开放,对修改关闭。
二、 里氏代换原则(LSP)
Liskov Substitution Principle(里氏代换原则):子类型(subtype)必须能够替换它们的基类型。
三、?依赖倒置原则(DIP)
四、?接口隔离原则(ISP)
五、?合成/聚合复用原则(CARP)
六、?迪米特法则(LoD)
一、 "开放-封闭"原则(OCP)
要求我们在设计软件的时候,应尽可能使软件有扩展性,封闭性
Open-Closed Principle原则讲的是:一个软件实体应当对扩展开放,对修改关闭。
优点:
??? 通过扩展已有软件系统,可以提供新的行为,以满足对软件的新的需求,使变化中的软件有一定的适应性和灵活性。
??? 已有软件模块,特别是最重要的抽象层模块不能再修改,这使变化中的软件系统有一定的稳定性和延续性。
生动的例子:
例子:玉帝招安美猴王
当年大闹天宫便是美猴王对玉帝的新挑战。美猴王说:"'皇帝轮流做,明年到我家。'只教他搬出去,将天宫让于我!"对于这项挑战,太白金星给玉皇大帝提出的建议是:"降一道招安圣旨,宣上界来…,一则不劳师动众,二则收仙有道也。"
换而言之,不劳师动众、不破坏天规便是"闭",收仙有道便是"开"。招安之道便是玉帝天庭的"开放-封闭"原则。
招安之法的关键便是不允许更改现有的天庭秩序,但允许将妖猴纳入现有秩序中,从而扩展了这一秩序。用面向对象的语言来讲,不允许更改的是系统的抽象层,而允许更改的是系统的实现层。
二、 里氏代换原则(LSP)
Liskov Substitution Principle(里氏代换原则):子类型(subtype)必须能够替换它们的基类型。
反过来的代换不成立
《墨子·小取》说:"娣,美人也,爱娣,非爱美人也……"娣便是妹妹,哥哥喜爱妹妹,是因为两人是兄妹关系,而不是因为妹妹是个美人。因此,喜爱妹妹不等同于喜爱美人。用面向对象语言描述,美人是基类,妹妹是美人的子类。哥哥作为一个有"喜爱()"方法,接受妹妹作为参数。那么,这个"喜爱()"方法一般不能接受美人的实例。
三、?依赖倒置原则(DIP)
依赖倒置(Dependence Inversion Principle)原则讲的是:要依赖于抽象,不要依赖于具体。
简单的说,依赖倒置原则要求客户端依赖于抽象耦合。原则表述:
抽象不应当依赖于细节;细节应当依赖于抽象;
要针对接口编程,不针对实现编程。
反面例子:
缺点:耦合太紧密,Light发生变化将影响ToggleSwitch。
解决办法一:
将Light作成Abstract,然后具体类继承自Light。
优点:ToggleSwitch依赖于抽象类Light,具有更高的稳定性,而BulbLight与TubeLight继承自Light,可以根据"开放-封闭"原则进行扩展。只要Light不发生变化,BulbLight与TubeLight的变化就不会波及ToggleSwitch。缺点:如果用ToggleSwitch控制一台电视就很困难了。总不能让TV继承自Light吧。
解决方法二:
?
优点:更为通用、更为稳定。
结论:
使用传统过程化程序设计所创建的依赖关系,策略依赖于细节,这是糟糕的,因为策略受到细节改变的影响。依赖倒置原则使细节和策略都依赖于抽象,抽象的稳定性决定了系统的稳定性。
四、?接口隔离原则(ISP)
接口隔离原则(Interface Segregation Principle)讲的是:使用多个专门的接口比使用单一的总接口总要好。换而言之,从一个客户类的角度来讲:一个类对另外一个类的依赖性应当是建立在最小接口上的。
过于臃肿的接口是对接口的污染。不应该强迫客户依赖于它们不用的方法。
五、?合成/聚合复用原则(CARP)
合成/聚合复用原则(Composite/Aggregate Reuse Principle或CARP)经常又叫做合成复用原则(Composite Reuse Principle或CRP),就是在一个新的对象里面使用一些已有的对象,使之成为新对象的一部分;新对象通过向这些对象的委派达到复用已有功能的目的。
简而言之,要尽量使用合成/聚合,尽量不要使用继承。
六、?迪米特法则(LoD)
迪米特法则(Law of Demeter或简写LoD)又叫最少知识原则(Least Knowledge Principle或简写为LKP),也就是说,一个对象应当对其它对象有尽可能少的了解。
其它表述:
??只与你直接的朋友们通信
??不要跟"陌生人"说话
??每一个软件单位对其它的单位都只有最少的知识,而且局限于那些与本单位密切相关的软件单位。
迪米特法则与设计模式
Facade模式、Mediator模式
使民无知
《老子》第三章曰:"是以圣人之治,虚其心,实其腹,弱其志,常使民无知无欲。"使被"统治"的对象"愚昧"化,处于"无知"的状态,可以使"统治"的成本降低。
所谓"最少知识"原则,实际上便是老子的"使民无知"的统治之术。
不相往来
《老子》云:"小国寡民……邻国相望,鸡犬之声相闻,民至老死,不相往来。"将被统治的对象隔离开来,使它们没有直接的通信,可以达到分化瓦解,继而分而治之的效果。迪米特法则与老子的"小国寡民"的统治之术不谋而合。