第一单元 21世纪的程式执行
.net framework组成元素
基底类别库(BCL)
提供开发各种解决方案时所需使用的物件
所有的.net语言皆使用同一组
将各种不同解决方案的模型一致化
共同语言执行时期(CLR)
提供所有.net程序语言执行程式时的服务
提供自动记忆管理
提供与COM元件互通的能力
内建多执行绪执行能力
中介语言格式IL
由微软所指定,是CLR的组合语言
所有.net程式语言编译器的目标格式皆为IL
可在不同平台,跨平台使用
编译成原生码之后的执行,仍被CLR管理
组件的搜寻规则:
从GAC中找(搜寻组件公用快取)
如果没有找到,不过有组态设定档存在,则搜寻组态设定档所指定的位置。
如果还是没有找到,.net会搜寻执行档所在的目录
如果还是没有找到,应用程式将发生错误并结束执行、
部署的选择
XCOPY Deployment
注册到GAC中
透过.Config
单元2
物件的导向程式设计
物件——对象
属性——属性
行为——方法
物件的复制
e.Clone()
物件的产生
Dim e as employee
e=new employee();
- Dim e as new employee()
物件的毁灭(回收空间)
GC资源收集器来自动回收,会周期性地自动执行
装箱(Boxing)
所有的东西不见得都是物件
实质型,放在堆点里面, 当成物件来看,tostring()装箱
方法Method
用来执行一些动作的程式,就是Method
多载(Overloading)其实就是函数的重载(可能版本有点老吧,说法都没跟上时代潮流)
多个名称相同的方法
资料的保护(就是访问修饰符)
尽可能的将资料隐藏起来。(将内部成员限制访问)
Shallow copy
Deep copy(需要自己写两层复制)
第三单元 类别与基底类别库
常量和共享
Const
Shared(共用成员)
列举型别(Enum)
就是枚举类型
模组
- Public Module _name
-
- End Module
命名空间
- Namespace _name
-
- End Namespace
命名空间可以嵌套,空间里可以有子空间。增加可读性,把一类的东西分到一个空间中,好区分,减少类名的冲突。
使用:
完整参照(完整的名字)
优点:确保对象的类型正确
缺点:代码冗长
导入命名空间
Imports
就可以只写最关键的类名
导入太多命名空间可能会:妨碍程序的可读性,增加名称冲突的风险
折衷方法:建立命名空间的别名。
- Imports BT=TeamX.BusinessTier
- …
- Dim c as BT.customs
集合
ArrayList 还可以排序
HashTable
使用vs建立类别库,类别库将会编译成DLL
方式1:加入DLL参考
执行起来较有效率,因为只有一个专案
当Dll变更之后,必须手动重新 编译
方式2:加入专案
将自动编译DLL
会在背景编译变更过的元件,这会导致暂时停止回应。
第四单元 事件驱动程序设计
- 多对一的事件处理
- Private Sub form_load(…) Handles button1.click,button2.click
- Message.show("Changed!")
- End Sub
- 一对多的事件处理
- 在執行時期可以動態加入或移除事件與事件處理的關連
- *範例: *在按鈕的事件中,呼叫 AddHandler 或是 RemoveHandler
WinForms
AutoScroll属性
Anchor属性(固定控件的位置)
物件的毁灭
无法自行毁灭物件
物件只能被garbate collector所毁灭
第五单元
明确型别转换
Option Strict On 开启明确型别转换
Option Explicit On 开启显示声明
例外处理
发生了预期之外的状况
例如: 除零錯誤
數值溢位
存取陣列超過界限
物件參考不存在
檔案不存在
無法存取資料庫
- 每一个例外都被视为物件,通过throw掷出,通过catch方式捕捉
- 例外的类别
- System.SystemException系統定義的例外
- System.ApplicationException使用者自訂的例外
- 处理
- 使用try-catch语法
- Try
- statement1
- statement2
- Catch ex As Exception
- statement4
- Statement5
- Finally
- Statement6
- Statement7
- End Try
- (ps:Throw New System.ApplicationException(“File not found!”,ex) 扔出一个新的错误例外)
应用程式的追踪
追踪会记录有关从程式执行的讯息
第六单元 资料库设计与sql
- 开放式资料库设计
- 栏位
- 栏位是具有型别的(string,int。。。)
- 主索引键(primary key)
- 关联
- 一对多
- 一对一
- 多对多
- 资料库正规化
- 第一阶正规化:一个栏位中只包含一个“原子”的资料
- 1NF,2NF,3NF,…
- 不要有重复的资料,资料只要储存一次
- 命名规则很重要
- 资料库管理系统(DBMS)
- 资料
- 资料库引擎JET
- 要求→ 资料库引擎 → 资料
- 类型:MS sql Server,Oracle,DB2,MysqL
- 工具
- sql Server
- Query Analyzer : 執行 T-sql 語法
- 服務管理員 : 啟動或停止 sql Server
- Enterprise Manager : 管理 sql Server
- Microsoft Access
- 建立資料庫、查詢、…
- 使用 JET 引擎,免費
- 其它:
- 使用 Visual Studio .NET 中的伺服器總管
- WebMatrix 整合開發環境 (http://www.asp.net/)
- 结构化查询语言(sql)
- DML:Data Manipulation Language (select,update,…)
- DDL:Data Definition Language (create,drop,…)
- DCL
- Join table_name on
- Outer join
- Insert
- Update
- Delete
删除记录的时候,最好多设置一个字段来标记已不被使用,不要真的删除,这会节省效率,也会减少不必要的麻烦。
第七单元 资料库ADO.NET
- ADO.NET架构
- 资料提供者
- 原生提供者: sql Server,Oracle
- 非原生提供者: OLEDB,ODBC
- 核心命名空间
- 一般: System.Data,System.Data.Common
- sql Server: System.Data.sqlClient
- Oracle: System.Data.OracleClient
- OleDB: System.Data.OleDb
- ODBC: System.Data.Odbc
- 存取方式
- 资料读取与写入
- DataReader类可以逐一读取资料
- 只能下一个,唯独的游标
- 存取资料步骤
- 1、开放资料库连线
- 2、进行资料库操作(读取)
- 3、关闭资料库连线
- DataSet
- 就是一个在记忆中的资料结构,用表格的方式来储存
- DataSet = 離線式的 Recordset
- 資料是由伺服端複製回來
- 然後在用戶用端離線處理資料
- 允許你 :
- 減少資料庫伺服器的負載
- 關閉資料庫連線,並且離線處理資料
- 特別是在分散式應用程式中特別有用
- 使用DataAdapter类填满DataSet类
- sql = "Select * From Products;"
- .
- .
- .
- Dim adapter As ss.sqlDataAdapter,ds As System.Data.DataSet
- dbConn = New ...
- dbCmd = New ...
- adapter = New ss.sqlDataAdapter(dbCmd)
- ds = New System.Data.DataSet()
- dbConn.Open()
- adapter.Fill(ds)
- dbConn.Close()
- ds.Tables(“Table”).TableName = “Products” ‘** 修改 DataSet 中表格的名稱 …
- DataSet :
- 可以儲存你想要處理的所有資料
- 可以搜尋、排序、修改
- 範例:
- 將整個 Sales 資料庫的資料填滿 DataSet
- sql = "Select * From Customers; Select * From Orders; " & _
- "Select * From OrderItems; Select * From Products;"
- .
- .
- .
- dbConn.Open()
- adapter.Fill(ds)
- dbConn.Close()
- 工具
第八单元 界面:类别的设计(接口)
- 首先制定协定
- Interface
- 使用implements 来实现
- 第二步才是实作
- 必须实现接口中的每一个方法,否则无法编译
- 优点:
- 统一了方法,当具体行为改变时,不用改变客户端的程序。
- 多型
- 就是声明接口,实例不同对象,就可以达到程序不用修改的效果
- 物件的复制
- IClonable
- Public Class Customer: Implements IClonable
- Private m_Name As String
- Private m_Email As String
- Private m_Balance As Decimal
- ...
- Public Function Clone( ) As Object Implements ICloneable.Clone
- Return Me.MemberwiseClone( ) ‘** returns a shallow copy...
- End Function
- IComparable接口
- 比较两个物件,并传回一个数值(使用ASCII码来比较)
- < 0 表示 obj1 < obj2
- = 0 表示 obj1 = obj2
- > 0 表示 obj1 > obj2
- Public Interface IComparable
- Function CompareTo(obj As Object) As Integer
- End Interface
- 泛用型资料层
- 通过选择判断来决定实例化具体的那个数据库对象连接。
第九章 继承:类别的设计
第10单元 资料库 商业层设计
- 资料存取的一般化
- 连线的开启与关闭
- 单一或少数使用者的情况:保持连线开启
- 多使用者的情况:用时开,用完就关闭。
- 连线集区(Pooling)
- 连线会存放到集区中
- 一般资料存取的问题
- sql指令隐码攻击(注入)
- 验证输入
- Regular expressions
- 友谊类别
- Friend
- 资料层的设计
- 多层次设计:模组化、弹性、重复使用
- 重量化和轻量化
- 商业逻辑层的设计
- 支持流程中所有安全性、逻辑与资料存取(验证、维护、存储)
- 具型别DataSet
- Dim DS As System.Data.DataSet
- Dim customersDS As DataTier.CustomersDataSet
- .
- .
- .
- dataAdapter.Fill(DS)
- dataAdapter.Fill(customersDS)
- ‘ 一般的 dataset 存取方式
- FirstName = DS.Tables(“Customers”).Rows(i).Item(“FirstName”).ToString()
- ‘ 具型別 dataset
- FirstName = customersDS.Customers(i).FirstName
- ORM Framework
第十一单元 以元件为基础的开发
- 组件
- 建立一个DLL组件
- 组件层级的attributes
- 强式名称
- 数字签章
- .snk挡
- com元件
- 互通机制
- .net呼叫com元件
- 建立ccw
- interop的运作
第十二单元 应用程式设计与布置
- 应用程式设计
- (1)整体的:布署单一的 .exe+ .net 到用户端
- (2)分层结构的, .exe,DLLs,.net 到用户端
- (3)远端,布署到用户端与服务端
- (4)以web为基础的,布署web网页,DLLs+.net到web服务器
- 应用程式布署
- .net必须安装
- CLR + FxCL必须安装在 .exe执行的主机上
- 组件manifest
- AppBase
- .exe所在的位置称为AppBase,应用程式的主目录
- 布署选项
- XCOPY布署
- 将exe,dlls+相关档案,全部拷贝到同一个资料夹
- 零接触布署
- 给exe一个url,用户直接透过ie浏览url
- NET 將 AppBase 設定到 Web 伺服器上的虛擬目錄 !
- .NET 從 AppBase 下載 .EXE 和 .DLLs
- 問題: 安全性? 如何下載必要的檔案 (資料庫)
- 组建搜寻演算法
- 版本转向
- 应用程式的.config挡设计可以重写.exe manifest
- GAC
- Global Assembly Cache
- 位於 C:\Windows\Assembly
- 直接用檔案總管就可以檢視…
- 安装组件到GAC
- 组件必须有强式名称,使用gacutil.exe命令列工具(要有管理员权限)
- CodeBase
- 共用布署
- 将共用的各版本组件安装到GAC
- 具有强式命名的组件载入的效率比较快
- 下载布署
- 使用CodeBase来指定DLLs位置
- 潜在的问题:
- (1)config档hell问题
- (2)程式码逆向工程
- (3)程式码存取安全性
- 通过reflection机制手动布署
- 是一种在执行阶段针对组件进行处理的机制
- 载入组件
- 建立物件
- 检查栏位、方法、属性的规格
- 存取栏位、方法、属性
第十三单元 分散式程式设计
- 分散式设计
- 同步
- 用户端呼叫服务端,然后等待回应
- 简单,传统的程式设计模型
- 基于RPC的基础上
- RPC架构
- Proxy-stub物件用来建立爽法的同步呼叫机制
- proxy是在用户端,stub在服务端
- 常见的同步设计
- Form-based web 应用程式(webForms)
- 浏览器解决方案,要求某一页,等待服务器传回html
- Web service
- 呼叫web方法,等待xml资料传回来
- 连接不同平台的应用程式
- Remoting
- 程式,呼叫方法,等待结果传回来
- 两端都是.net平台
- 连接.net平台下各层的元件(例如,java和.net)
- 例如:
- .NET on Linux & .NET on Windows
- .NET on WinXP & .NET/COM+ on Win2003
- 非同步
- 用户端传送要求,然后用户继续进行其它工作,服务端执行完后在将回应传给用户端
- 比较有弹性
- 比较难设计、实作、测试
- Remoting设计
- Sales物件是一个“single-call MBRO”
- 使用IIS(web server)
- 很容易开发和设定服务端
- 可以使用windows安全机制
- Web services
- WSDL=web service description language
- .net web service
- 步骤:
- 1、建立一个asp.net web 服务专案
- 2、专案位置=http://localhost/SalesWebService
- 3、参考businessComponent.dll
- 4、将sercicel.asmx改名为Sales.asmx
- 5、撰写Sales.asmx的程式码Sales.asmx.vb
第十四单元 concurrent Programming
指的是有多个操作会同时执行的程式。
- Concurrency
- 多个操作同时执行
- 范例
- web服务器慧颖多个浏览器的要求
- 资料库服务器处理多个查询
- 怎么办到?
- 实际上,一个cpu会在多个程式之间快速切换,看起来就像同时执行
- cpu切换
- 由硬件切换
- 每隔一段时间,程式暂停、等候回应
- 行程(process)
- 多行程
- 多执行绪
- 多执行
- 设计上很困难
- 1、协调问题
- 通过执行绪通讯协调
- 等待彼此执行结束
- join:值得就是等待执行绪执行完
- 一直等
- 等一段时间(带参数)
- 检查执行绪执行状况
- IsAlive
- 2、通讯问题
- 参数
- 结果
- 执行过程中的变数值
- 使用队列
- 执行绪使用dequeue方法从队列取出资料
- 执行绪使用enqueue方法将资料加入队列
- 3、同步问题
- 使用syncLock指令
- 只有一个执行绪可以进入,其它执行绪要等
- 使用执行绪安全的队列物件
- 多执行绪很难设计
- 很多细节要注意
- 很难证明执行结果一定正确
- 很难进行侦错
- 可能产生死结(deadlock)
- 必须在执行绪中处理例外
- delegates
- 是一种方法的指标,可以做呼叫端与被呼叫端的抽象化。
- 在执行绪上的另一层抽象化
- 内建支援多执行绪
- 更有效率:因为使用执行绪集区(thread pool)
- 支持参数传进与传回值
第十五单元 软体工程
所谓的“软体工程”其实就一个软体开发程序,依循这些程式就可以开发出稳定、可靠的软体系统,这些开发程序也可以不断重复使用、不断改良
- 软体工程
- 背景:
- 软件越来越困难
- 软件应用在重要的系统上
- 软件甚至用在和生命相关的系统上
- 一般的做法:
- 传统“瀑布式”模型
- 1.需求分析
- 2.设计
- 3.实作
- 4.单元测试
- 5.整合测试
- 6.布署
- 7.维护
- 最近流行的“eXtreme Programming”模型
- 一个非常不同、比较精简快速的流程
- 主要原则:
- 把客户整合到软件开发流程中
- 随时设计
- 随时测试
- 不做过当的设计,越简单越好
- 工具
- UML绘制工具
- 程式码分析工具:
- FxCop
- 测试工具:
- NUnit是一个免费的单元测试工具
- 原始码管理工具:
- 版本管理工具(Visual SourceSafe 、CVS 、 WinCVS)
- 文件产生工具:
- XML注解
- Make工具:
- 是一个在Unix系统上常用的工具,用自动化整个软件的组建(编译)流程。
- NMake是视窗版的
我好像学了一门古老的语言,而且跟语法都没有关系,介绍了从最初的程序设计到后来的软件工程,从软件设计到程序的编译会产生什么文件,需要那些系统工具的支持,比如CLR、DLL等等,再到软件的部署、维护用到的技术、工具和方法,从一个更加接触底层的角度去学习了软件的整个流程。 视频里面讲了好多都不认识的系统软件,原来我们编写的程序要真正的发布运行还需要学习很多的东西,不仅仅只是写完代码就ok了,还要考虑不同平台上的运行,并发操作带来的问题,需要有什么样的支撑环境等等一系列的工作。