C#高级编程之一(核心、类型、继承、泛型、数组)

第二章 核心C#

  • 变量声明
  • 变量的初始化和作用域
  • C#的预定义数据类型
  • 在C#程序中使用条件语句、循环和跳转执行流
  • 枚举
  • 名称空间
  • Main()方法
  • 基本的命令行C#编译选项
  • 使用Console执行控制台I/O
  • 使用内部注释和文档编辑功能
  • 预处理指令
  • C#编程的推荐规定和约定

第三章 对象和类型

  • 类和结构的区别
  • 类成员
  • 按值和按引用传递参数
  • 方法重载
  • 构造函数和静态构造函数
  • 只读字段
  • 部分类
  • 静态类
  • Object类

类和结构实际上都是创建对象模板,每个对象都包含数据,并提供了处理和访问数据的方法。结构与类的区别是它们在内存中的存储方式、访问方式(类是存储在堆上的引用类型,而结构是存储在栈上的值类型)和它们的一些特征(如结构不支持继承)。较小的数据类型使用结构可提高性能。

类中的数据和函数为类的成员,还可以包含嵌套的类型。

System.Object()方法

第四章 继承

  • 继承的类型
  • 实现继承
  • 访问修饰符
  • 接口

实现继承,表示一个类型派生于一个基类型,它拥有该基类型的所有成员字段和函数。

接口类型:表示一个类型只继承了函数的签名,没有继承任何实现代码。在需要指定该类型具有哪些可用的特性时,这种类型的继承非常有用。接口继承的类可以继承自多个接口。

在一个基类中函数声明为virtual,就可以在任何派生类中重写该函数在派生类重写一个函数时,要使用override关键字显式声明。

抽象类和抽象函数不能直接实现,必须在非抽象的派生类中重写,显然抽象函数本身也是虚拟的,如果类包含抽象函数,则该类也是抽象的,必须声明为抽象的。密封类和密封方法不能继承不能重写。

一般情况下,接口只能包含方法、属性、索引器和时间的声明。

第5章 泛型

  • 泛型概述
  • 创建泛型类
  • 泛型类的特性
  • 泛型接口
  • 泛型结构
  • 泛型方法

有了泛型,就可以创建独立于被包含类型的类和方法。我们不必给不同的类型编写功能相同的许多方法或类,只创建一个方法或类即可。

泛型不限于类,也可以创建接口和方法的泛型。

泛型的一个主要优点是性能,适当利用泛型可以减少装箱和拆箱操作提高程序性能。从值类型转为引用类型为装箱,装箱的值类型可以使用拆箱操作转为值类型,在拆箱时,需要使用类型转换运算符。

泛型的另一个特性是类型安全,在编译时就会发现类型异常,尽早发现错误。

泛型允许更好地使用二进制代码。泛型类型可以定义一次,并且可以用许多不同的类型实例化,不需要像C++那样访问源码。泛型类型可以在一种语言中定义,在任何其他.NET语言中使用。

在用不同的特定类型实例化泛型时,会创建多少代码?

一般,泛型类型的名称用字母T作为前缀。如果没有特殊的要求,泛型类型允许使用任意类型替代,且只使用了一个泛型类型类型,就可以用字母T作为泛型类型的名称。

public class List<T> {}

public class LinkedList<T>{}

如果泛型类型有特定的要求(例如,它必须实现一个接口或派生自基类),或者使用了两个或多个泛型类型,就应给泛型类型使用描述性的名称。

public delegate void EventHandler<TEventArgs>(object sender, TEventArgs e);

public delegate Toutput Converter<TInput, TOutput>(TInput, from);

public class SortedList<TKey, TValue>{}

如果泛型需要调用泛型类型中的方法,就必须添加约束,如:

public class DocumentManager<TDocument> where TDocument:IDocument{}

除了接口约束,也可以是其他约束。

在C#中,where子句的一种重要限制是,不能定义必须由泛型类型实现的运算符。运算符不能再接口中定义,在where子句中,只能定义基类、接口和默认构造函数。

 

泛型类型可以实现泛型接口,也可以派生自一个类。泛型类型可以派生在泛型基类,其要求是必须重复接口的泛型类型,或必须指定基类的类型。

于是,派生类可以泛型类或非泛型类。例如,可以定义一个抽象的泛型基类,它在派生类中用一个具体的类型实现。这允许对特定类型执行特殊的操作。

泛型类的静态成员需要特别关注,泛型类的静态成员只能在一个实例中共享。

使用泛型可以定义接口,在接口中定义的方法可以带泛型参数。

在C#4中,扩展后的语言支持泛型接口和泛型委托的协变和抗变。如果泛型类型用out关键词标注,泛型接口就是协变的。这也意味着返回类型只能是T。如果泛型类型用in关键词标注,泛型接口就是抗变的这样接口只能把泛型类型T用作其方法的输入。

public interface IDisplay<in T>

{

void Show(T item);

}

ShapeDisplay类实现IDisplay<Shape>,并使用Shape对象作为输入参数:

 

与类相似,结构也可以是泛型的。它们非常类似于泛型类,只是没有继承特性。比如

public struct Nullable<T> where : struct

除了定义泛型类外,还可以定义泛型方法。在泛型方法中,泛型类型用方法声明来定义。泛型方法可以在非泛型类中定义。

void Swat<T>(ref T x, ref T y)

{

T temp;

Temp=x;

x=y;

y=temp;

}

where可以约束泛型类,也可以约束泛型方法。

 

通过泛型类可以创建独立于类型的类,泛型方法是独立于类的方法。接口、结构和委托也可以用泛型的方式创建。泛型引入了一种新的编程方式。

 

第6章 数组

  • 简单数组
  • 多维数组
  • 锯齿数据
  • Array类
  • 作为参数的数组
  • 枚举
  • 元组
  • 结构比较

如果需要使用同一类型的多个对象,就可以使用集合和数组。C#用特殊的记号声明、初始化和使用数组。Array类在后台发挥作用,它为数组中元素或过滤提供了几个方法。使用枚举器,可以迭代数组中的所有元素。

int[ ] myArray = new int[4];

如果使用错误的索引器值,就会抛出IndexOutOfRangeException类型的异常。

foreach语句利用了IEnumerable和IEnumerator接口。

除了能声明预定义类型的数组,还可以声明自定义类型的数组。

如果数组中的元素是引用类型,就必须为每个数组元素分配内存。若使用数组中未分配内存的元素,就会抛出NullReferenceException类型的异常。

一般数组用一个整数来索引,多维数组用两个或多个整数来索引。

用方括号声明数组是C#中使用Array类的表示法。在后台使用C#语法,会创建一个派生自抽象基类Array的新类。这样,就可以使用Array类为每个C#数组定义的方法和属性了。

C#2.0添加了yield语句,以便创建枚举器,yield return语句返回集合的一个元素,并移动到下一个元素上,yield break可停止迭代。

数组合并了相同类型的对象,而元组合并了不同类型的对象。

数组和元组都实现接口IStructuralIEquatable和IStructuralComparable,不仅可以比较引用,还可以比较内容。

发表在 编程 | 标签为 | 留下评论

面向对象的分析

1 面向对象的分析过程

        面向对象的分析就是抽取和整理用户需求并建立问题领域精确模型的过程。OOA强调运用面向对象方法,对问题和系统职责进行分析和理解,找出描述问题域及系统职责所需要的对象,定义对象属性、服务及它们之间的关系,以便建立一个符合问题领域、满足用户需求的OOA模型。

        面向对象分析过程,首要的先建模,通常需要建立4种形式的模型:用类和对象表示的对象(静态)模型,由用例和场景表示的用例(功能)模型、由状态机图和交互图表示的动态行为图、由构件图和部署图表示的物理实现模型。

  • 用例模型:往往是从用户需求的角度来描述系统,指明系统应该“做什么”,直接反映用户对目标系统的需求,描述数据在系统中的变换过程及系统的功能。

建立用例图模型有助于软件开发人员深入地理解问题域,改进和完善自己的分析和设计过程。

  • 对象模型:是面向对象方法最基本、最核心,也是最重要的模型,无论解决什么问题,都需要从客观世界级对象之间的联系中抽象出游价值的信息,用户表示静态的、结构的、系统的“数据”性质。

该模型主要关心系统中对象的结构、属性与操作,以及对象与对象之间关系的映射。对象模型是对模拟客观世界的对象及对象彼此间的关系静态结构的描述,为建立动态模型和用例模型i共了实质性的框架。

对象模型通过对象、类的属性、操作及其相互联系的描述,给出系统静态结构的刻画,在UML中常用类图和对象图来描述。

  • 动态模型:表示瞬时的、行为化的、系统的“控制”性质,定义对象模型中对象的合法变化序列,描述系统中不同对象类之间的交互。动态模型是基于事件共享而相互关联的一组状态图的集合。
  • 物理模型:关注的是系统实现过程的建模,常常用构件图和部署图表示静态的物理实现模型,用交互图和状态机描述动态实现模型。

        这四种模型相互补充,相互配合,使人们对系统的认识更加全面:对象模型用类、对象、接口等定义做时间的实体,是软件的基本组成单元,为其他3中模型奠定了基础,用例模型指明系统应该“做什么”,从用户的角度描述系统功能,是整个后续工作的基础。动态模型则明确规定什么时候做什么事情,当问体涉及交互作用和时序时,动态模型尤为重要。物理实现模型通过构件图和部署图描述系统实现和分析设计中的对应关系。

 

2 建立用例模型

目的是提取和分析足够的需求信息,该模型应该表达用户需要什么,而不涉及系统将如何构造和实现的细节。

用例模型由若干个用例图组成,主要用于需求分析阶段。

当设计复杂系统是,系统边界可以帮助分析人员清晰地划分要加按摩的子系统,同时系统边界也为软件系统建立了范围,分析员根据这个范围可以估计在规定时间内完成项目所需的资源。

当系统比较庞大和复杂时,通过明确参与者可以针对参与者确定系统需求,这样有助于保证系统需求的完整性。一般讲主要参与者华仔用例图中系统边界的左边,将次要参与者和后台参与者画在用例图中系统编辑的右边

一个用例(use case)描述系统的一项功能,功能被描述为一组动作序列的集合。每一个动作序列表示参与者与系统的一次交互,将为参与者产生一个可观察的结果值。

用例描述的目标是将用例的功能和应用场景描述清楚,包括:用例在何时开始,何时结束;参与者如何与系统交互;交互什么内容;所有可能的交互场景等。

用例之间主要有两大类关系,即包含和扩展,可以细分为4种关系:包含,使用,扩展和泛化关系,它们的共性:都是从现有的用例中抽取出公共的那部分信息,作为一个单独的用例,然后通过不同的方法来重用这个公共的用例,以减少模型维护的工作量。

包含关系可以把几个用例的公共步骤分离出来,成为一个单独的被包含用例,以便多个用例复用。

扩展关系可以在不能改变已有用例的情况下,在已有用例的扩展点上扩展用力的功能,扩展用例中必须包含触发和扩展说明。

 

3 建立对象模型

对象模型是面向对象建模中最关键的一个模型,它的作用是描述系统的静态结构,包括构成系统的类和对象、他们的属性和操作及它们之间的关系。对象模型通常通过类图、类的实例(即对象)图和它们的关系(关联、继承、聚集和组合等)表示。

大型系统的对象模型通常由5个层次组成:主题层、类和对象层、结构层、属性层和服务层。

其中,主题是知道读者理解大型、复杂模型的一种机制。及通过划分主题吧一个大型、复杂的对象模型分解成几个不同的概念范畴。

5个层次对应着建立对象模型的5项活动:找出类与对象、识别结构、识别主题、定义属性、定义服务。在概念上,面向对象分析大体上按照以下序列进行:寻找类和对象->识别结构->识别主题->定义属性->建立动态模型->建立功能模型->定义服务。

  • 确定类和对象

类和对象是对与应用有关的概念的抽象,实际操作中,分析员需要首先找出候选的类和对象,然后进行筛选,通过区分实体类、边界类和控制类来检查对象模型的完整性。

在对象建模时,一般首先从问题域的实体类入手分析,实体类表示系统将跟踪的持久信息;边界类表示参与者与系统之间的交互,边界对象收集来自参与者的建模;控制类对象负责用例的实现,协调实体类和边界类对象,控制类对象在现实世界中没有具体的对应物,它通常从边界类对象处收集信息,然后把这些信息分配给实体类对象。

  • 确定关联

在确定了类和对象之后,需要确定类和对象之间的关系。关联是指两个或多个对象之间的相互依赖、相互作用关系的系统。分析、确定对象类之间的关联关系,能促使分析员考虑问题域的边界情况,有助于发现那些尚未被发现的类和对象。

类模型的结构及由类和子类构成的类层次,表示问题域中的复杂关系,是客观世界实体类关系的抽象。

  • 确定属性

属性是对类和对象做进一步的说明,借助于属性能够对类和对象的结构由更深入、更具体的认识。标识属性的方法和策略:只考虑与具体应用直接相关的属性,不考虑那些超出所要解决的问题范围的属性;先找出最重要的属性,在逐渐把其余属性添加进去;分析阶段不考虑纯粹用于实现的属性。

  • 建立对象类图

在分析阶段,类图主要研究应用领域概念;在设计阶段,类图主要描述类与类之间的接口关系;在实现阶段,类图描述软件系统中类的实现,因此在不同阶段类图有不同的层次。

概念层的类图描述应用领域的概念,与现实世界及所研究的问题相关;说明层的类图描述软件的接口部分,在概念层描述的基础上增加了和接口有关的描述属性;实现层的类图揭示软件的实现部分,此时的类才是严格意义上的类,包含了类图所有的内容。

类图建模,就是要表达类与类之间的关系,以便于人们理解系统的静态逻辑。

对象图是表示在某一时刻一组对象及它们之间的关系的图形表示。

  • 划分主题

在开发大型、复杂的系统时,为了降低复杂度,人们习惯吧系统再进一步划分成几个不同的主题。

 

发表在 编程 | 标签为 | 留下评论

统一建模语言UML

编制一个软件就是建立一个模型,为了方便编软件时的交流,产生了统一的建模语言,即在抽象层面编制软件的语言。UML为不同领域的人提供了一种统一的交流方法,为设计人员、开发人员、用户和专家之间的交流提供了便利。

UML提供了标准的面向对象的模型元素的定义和表示方法,以及对模型的表示方法的规定,使得对系统的建模有章可循,有标准的语言工具可用,有利于保质保量地建立起软件系统。

 

UML是一种标准的可视化建模语言,它有元模型和图组成。元模型给出图的定义,是UML的语义,图是UML的语法。

1 UML的语义

UML的语义定义在一个四层抽象级别的建模框架中。

1)元元模型层(Meta-Meta Model

UML最基本的元素事物组成,表示要定义的所有事物。

2)元模型层(Meta Model

UML的基本元素组成,包括面向对象和面向构件的概念。该层的每个概念都是元元模型中事物概念的实例。

3)模型层(Model

UML模型组成,该层的每个概念都是元模型中概念的实例,一般称为类模型或类型模型。

4)用户模型(User Model

用户模型有UML模型的例子组成,该层每个概念都是模型层的一个实例,也是元模型概念的一个实例,通常称为对象模型或实例模型。

2 UML的表示方法

UML由视图(View)、图(Diagram)、模型元素(Model Element)和公共机制(Common Mechanism)等部分组成。

UML用模型来描述系统的静态特征结构及动态特征行为,从不同的角度为系统建模,形成不同的视图。每个视图代表完整系统描述中的一个对象,表示这个系统中的一个特定的方面,每个视图又由一族图构成,每幅图强调系统某一方面的信息。

UML中提供了静态图动态图,共计13种。

1)静态图

  • 类图(Class Diagram):描述了类、接口、协作及它们之间的关系。在面向对象系统建模中,类图是最常见的图,类图描述了系统 的静态结构。
  • 对象图(Object Diagram):描述了对象及对象之间的关系,对象图也描述了系统在某个时刻的静态结构。
  • 用例图(Use Case Diagram):描述了用例、参与者及它们之间的 关系,用例图用来描述系统的功能。
  • 构件图(Component Diagram):描述模型元素之间的组织结构和依赖关系,构件图描述了实现系统的元素的组织。
  • 部署图(Development Diagram):描述系统环境元素的配置。
  • 包图(Package Diagram):描述能作为一个集合进行命名和处理的建模元素组织,包的存在只是为了帮助组织模型的元素,在系统运行时不出现,完全是组织设计的机制。
  • 组合结构图(Composite Structure Diagram):展示类或协作的内部结构。

2)动态图

  • 状态图(Statement Diagram):描述系统元素的状态条件和响应。
  • 顺序图(Sequence Diagram
  • 通信图(Communicatioin Diagram
  • 活动图(Activity Diagram
  • 计时图(Timing Diagram
  • 交互概览图

3 视图

  • 用例视图(Use Case View):表示系统的功能性需求,使用用例图来描述,用活动图来进一步描述其中的用例。
  • 逻辑视图(Logical View):表示系统的概念设计和子系统结构等,用类图、对象图、逻辑结构和包图描述系统静态结构,用状态图、顺序图、通信图和活动图描述系统状态行为。逻辑视图又称为结构模型视图。
  • 进程视图(Process View):表示系统的状态行为 及并发性,使用状态图、顺序图、通信图、活动图、即使涂构件图和部署图来描述动态行为,又称为行为模型视图。
  • 实现视图(Realiation View):表示系统实现的代码结构和行为特征,用构件图来描述,又称构件视图。
  • 部署视图(Developmen View):用户定义硬件结点的物理结构,表示实现环境和构件被部署到物理结构中的映射。

 

3 UML的特点和通途

UML的概念明确,建模表示方法简介明了,图形结构清晰,容易掌握使用。

学习UML应着重学习它3方面的主要内容:UML的基本元模型元素;把这些模型元素组织在一起的规则;UML语言中的公共机制。

UML不是程序设计语言,不能用来直接书写程序、实现系统。UML所建立的系统模型(逻辑模型和实现模型)必须转换为某种程序设计语言的源代码程序,然后经过该语言的编译系统生成可执行的软件系统。

UML同样也可以用于描述非计算机软件的其他系统,如机械系统,电子系统,企业机构或业务过程等,总之,UML是一种通用的标准建模语言,可以为任何具有静态结构和动态行为的系统建立模型。

在系统开发的各个阶段都可以使用UML语言,其应用覆盖了从需求分析道软件测试的各个阶段。

1)需求分析阶段:该阶段使用UML用例图来描述用户的需求。通过用例图建模,可以描述系统感兴趣的外部角色极其对系统的功能要求。

2)系统分析阶段:该阶段主要关心问题域中的基本概念(如,抽象、类和对象等)和机制,需要识别这些类及它们之间的关系,可以用UML的逻辑视图和动态视图来描述。类图描述系统的静态结构,通信图、顺序图、活动图和状态图描述系统的动态行为。在这个阶段只为问题域的类建模,而不定义软件系统的解决方案细节。

3)系统设计阶段:该阶段把系统分析阶段的结果扩展成技术解决方案,加入新的 类来定义软件系统的技术方案细节,引入具体的类处理用户接口、数据的访问、通信和并行性等问题。

4)编码阶段:该阶段的任务是吧来自设计阶段的类转换成某种面向程序设计语言实现的代码。

5)测试阶段:对系统的测试通常分为单眼测试、集成测试、系统测试和验收测试等几个不同的步骤。

发表在 未分类 | 标签为 | 留下评论

软件设计

软件设计解决把“做什么”的逻辑模型转换为“怎么做”的物理模型。
软件设计就是把软件需求转换为软件表的过程,总体设计是进入软件设计的第一阶段,只描述软件的总的体系结构,第二节个阶段是详细设计,即对结构进一步细化。
1、软件总体设计
软件总体设计的目的是用比较抽象概括的方式确定系统如何完成预定的任务。总体设计阶段主要有两个小阶段组成,首先进行系统设计,从数据流图出发设想完成系统功能的若干种推荐方案,然后比较分析这些方案,最后和用户共同选定一个最佳方案;然后进行软件结构设计,结构化设计方法吧软件结构主要划分为变换型和事务型两大类,并且提出与之相应的变换设计和事物设计两种方法,以及综合型数据流图的设计方法。
软件结构的模块化设计遵循抽象、信息隐蔽、分解逐步求精和模块独立性等一系列指导准则。模块独立性是一个良好设计的关键,评价标准是模块的耦合和内聚。
 
软件总体设计的任务是软件体系结构设计和软件模块设计。软件体系结构是软件系统中最本质的东西,软件结构是对复杂事物的抽象,在一定的时间内保持稳定,良好的体系结构意味着普通、高效和稳定。
在面向过程软件开发中,软件模块设计是关键,软件模块设计需要遵循以下准则:
(1)降低模块之间的耦合性,提高模块的内聚性。(但各个模块之间的数据相互关联怎么办?公共部分形成子模块!)
(2)模块结构的深度、宽度、扇出和扇入,好的系统一般的扇出数是3~4个。
(3)模块的作用范围赢该在控制范围内。
(4)模块接口设计要简单,以便降低复杂程度和冗余度。
(5)设计功能可预测并能得到验证的模块。
(6)适当划分模块规模,以保持其独立性。(模块的规模最好能写在1~2页纸内,源代码行数在50~150行的范围内比较适当。)
 
2 软件详细设计
在总体设计阶段,已将系统划分多个模块,并将它们按照一定的原则组装起来,同时确定了每个模块的功能及模块与模块之间的外部接口。软件详细设计就是对系统中的每个模块给出足够详细的过程性描述,故也称“过程设计”。
详细设计的根本目的就是确定应该怎样具体实现所要求的系统,具体就是为软件结构图中每一个模块确定采用的算法和块内数据结构,采用某种选定的详细设计工具更清晰地描述,从而在编码阶段可以把这些描述直接翻译成某种程序设计语言书写的源程序。
详细设计阶段的任务是设计出程序的蓝图,以后程序员将根据这个蓝图写出实际的代码。因此,详细设计的结果基本上决定了最终程序代码的质量。在整个软件生存周期中,软件测试、诊断程序错误、修改和软件维护等都必须先读懂程序。实际上对于长期使用的软件系统,读程序的时间可能比写程序的时间要长的多。
详细设计的目的不仅仅是逻辑上正确地实现每个每个模块的功能,更重要的是设计的处理过程应该尽可能地简明易懂。结构程序设计技术是实现上述目的的关键技术。
结构化程序设计采用自顶向下,逐步求精的设计方法和单入口单出口的控制结构。逐步求精,在总体设计阶段采用逐步求精法可以把一个复杂问题分解和细化成由许多模块组成的层次结构和软件系统。在详细设计阶段采用此方法可以把一个模块的工程逐层细划为一系列具体的步骤。
 

发表在 编程 | 标签为 | 留下评论

组件(COM)技术在油藏软件开发中的应用

从软件产业诞生以来,软件从业人员无不面临着以下困境:如何开发软件,以满足不断增长、日趋复杂的需求,如何维护数量不断膨胀的软件产品。解决这些问题的关键是如何从过去的项目中总结经验,抽象出公共部分,并在今后的项目中重用他们。软件的重用可以提高软件的生产效率,缩短开发周期,降低软件开发和维护费用。目前,软件重用技术日趋成熟,并逐渐成为一门新的学科,即软件构件技术或组件技术。尽快在软件项目中应用和推广构件技术,已成为当前软件项目管理者面临的重要课题。

1 软件构件概念

在程序结构上,组件对象技术COM(component object model)是继面向对象技术的又一重大发展。按照组件化程序设计思想,复杂的应用程序被设计成一些小的、功能单一的组件模块,这些模块可以运行在同一台机器上,也可以运行在不同的机器。

软件构件是模块化、可部署、可替换的软件系统的组成部分,它封装了具体的实现并对外提供一组接口。它由以下三大要素组成:

  • 接口,接口告诉我们构件能够完成什么样的功能。
  • 实现,实现是让构件得以运作的代码。一个构件可以有多个实现,如一个构件能同时处理XML文件的实现和处理关系型数据库文件的实现。
  • 部署,部署时构件的存在形式,一般为二进制代码和可执行文件形式。

构件解决两个重要问题:一是重用性,即构件具有通用的特性。所提供的功能为多种系统使用;二十互操作性,即不同来源的构建能够相互协调和通信,共同完成更复杂的功能。

构件的功能均由标准接口定义,通过接口调用完成。这样不仅容易重用构件,而且由于标准接口的存在,不同操作系统、不同语言、不同结构的构建之间即可完成可以完成相互操作,又保证了构件之间相互独立,最大限度降低耦合。构件的范围非常广泛,可以是函数、过程和对象,也可以是它们的集合,甚至可以是软件构架和软件系统。

COM以其统一的标准,强大的兼容性,成为了软件发展的新方向。COM充分继承两了面向对象技术的优点,进一步在概念上将对象模型从中间分割开来。COM并不是一种计算机语言,而是一种以软件组件为单元的软件开发模型。COM是基于二进制的代码重用,不存在类库重用的问题。此外,COM充分利用了原有的DLL机制,并加以发展,改变了重用的方法,客服了DLL本身固有的缺陷,实现了更高一级的灵活性。它是的各软件组件可以以统一的方法进行信息交互。COM既提供了组件之间进行交互的规范,也提供了实现交互的环境,因为组件对象之间交互的规范不依赖任何特定的语言,所以COM也成为不同语言协作开发的一种标准。

组件是在面向对象软件开发方法的基础上发展起来的一种新技术。组件技术抽象了许多面向对象技术的实现概念,是面向对象技术在系统设计层面上的一种自然延伸,它们之间的关系如图所示:

2 基于构件的软件开发(CBSD)

基于构件的软件开发,是通过整合已有的构件来完成大型软件系统的开发,其核心就是构件的可重用。CBSD通过提高软件系统的可扩展性和可维护性来减少软件开发的费用,更快地整合系统,并能有效地降低大型系统的维护和升级能力。

基于构建的开发过程有4个主要活动:构件的选取、构件的调整、使用构件组成系统、升级系统。

单个构件要想发挥作用还应与其他构件整合起来,共同融入一个良好的构架中。这个构架能够将完全不同的构件组合在一起。构件必须符合系统其他部分的要求。将符合应用环境的构件组装到系统的构架中,装配成系统的功能模块。一般是将原子构件尽量捆绑成较大的符合构件,再根据构件的接口进行装配。

3 基于构件的软件开发实例

基于构建的软件开发设计与其他传统方法的设计有不同之处,CBSD的关键是子上而下地将需求分解为构件集合,及自上而下地将构件组合成目标应用系统。在油藏软件开发中,应将构件技术灵活地运用于软件过程的各个阶段。

3.1 需求分析和选择构件

油藏管理是一个高效的、综合的管理过程,目标是追求储量价值的最大化和持续有效的发展,因此必须有一套与之相适应的油气田综合数据库,贯穿油藏经营管理的勘探、开发、生产经营及退出各阶段,以确保实现油藏的经营挂历内涵。

比如对一个油藏分析如那件系统的开发过程中,利用组件对象技术,根据其已有的功能,原来系统的各个模块分割为不同的部分,封装为不同的组件,来实现软件中的重用。

需求分析阶段除分析、确定系统架构外,还要进行构件的评价。一般分为两步:查找所要构件和评价构件。首先按需要分析结果,从构件库或构件市场查找所需要的标准构件。了解构件的功能、可靠性、可预测性等特性,选择最合适的构件。

3.2 构件的修改与测试

确定的构件不可能马上都能用,有时要进行属性扩展或修改。这常需要由使用者提出扩展和修改意见,由构件开发者去完成。修改后的构件必须进行测试,保证构件功能及接口规范的实现。

3.3 专用构件的开发和测试

构件选择和获取后,可能要重新开发一些新构件,这些新开发的构件,必须构造应用工具上进行测试,保证构件功能及接口规范的实现。

3.4 构件的组装和测试

按照系统构件组装构件,得到应用系统,对应用系统进行总体测试。本系统的后台数据库、数据库接口和报表图形的web展示,均需经过单元测试、集成测试、功能测试和系统测试。

3.5 系统的演化

应用系统的维护就是系统的演化过程,系统功能的不断改善和扩展,是通过对系统中构件的升级替换来实现的,随着构件版本的变换,应用系统也形成了不同的版本。这就是系统的演化。

 

基于构件的软件开发方法对软件功能性、开发效率、质量、可靠性、可移植性等方面具有良好支持而受到越来越多开发组织的重视。在油藏软件的开发中实践了CBSD的方法,以软件构件库为基础,用高质量的软件构件建立系统,带来软件质量的提高,并大大提高软件开发周期。

刘飞. 构件技术在油藏软件开发中的应用[J]. 中国石油大学胜利学院学报, 2010, 24(2):25-27.

罗正蓉. COM技术在油藏分析软件中的应用研究[D]. 西安电子科技大学, 2006.

发表在 编程 | 标签为 | 留下评论

开源科学计算

数学是整个科学大厦的基础,科学计算是所有工程应用的根基,大量的工程问题归根揭底就是求解一系列的方程。前人已经在科学计算方面做了大量工作,在工程实践中可以直接拿来用,特别是那些开源的项目。目前已经有大量的科学计算算法库,把各种算法打包整理,方便使用和推广。每种编程语言下都有不少开源科学计算包可以用,由于历史原因,以及科学计算对运算速度的要求,Fortran和C,以及C++平台下的科学计算包相对多一些,随着java和.NET的用户越来越多,相应的科学计算包也逐渐增多,尽管计算效率稍微逊色,当然也有一些多语言的科学计算算法包。

多语言的科学计算算法包有:ALGIB、IMSL Numerical Libraries、 NAG Library、GNU Octave…

Fortran语言下的科学计算包有:BLAS、CERNLIB、EISPACK、IMSL Numerical Libraries、LAPACK、LINPACK、Lis、Netlib、PETSc、ARPACK…

C语言下的科学计算包有:BLOPEX、FFTW、GNU Scientific Library、GNU Multi-Precision Library、hypre、IMSL Numerical Libraries、LabWindows、Lis、Intel MKL、SLEPc…

C++语言下的科学计算包有:Advanced Simulation Library、Armadillo、Blitz++、Boost、Ceemple、LAPACK++、LSSP、Intel MKL、PETSc…

.NET Framework下的科学计算包有:AForge.NET、Accord.NET、Math.NET Numerics 、ILNumerics.Net、NMath…

Java语言下的科学计算包有:Apache Commons、ND4J、Colt、Efficient Java Matrix Library、JAMA、Jblas、Parallel Colt、DataMelt、Matrix Tookit Java、OjAlgo、exp4j…

Python语言下也有不少科学计算包:DataMelt、matplotlib、NumPy、Sage Math、Poltly、SciPy、ScientificPython…

每个包具体特点请参考维基百科https://en.wikipedia.org/wiki/List_of_numerical_libraries

科学计算包有这么多,我用过Math.Net的稀疏矩阵、以及线性方程组的高效求解,比如GMRES, BICGSTAB方法,你用过哪个呢?为了方便交流学习,最近建立了一个QQ群,名字叫“开源科学计算”,群号559227841。如果你恰好也对科学计算感兴趣,欢迎加入!

发表在 编程 | 标签为 | 留下评论

【ocean学习4】ocean Services层

基础

            索引类(Index Classes)

            浮点索引类(IndexDouble Classes)

            区间索引类(IndexRange Classes)

            扩展类(Extent Classes)

                        Extent Classes

                        Extent2 and Extent3 Classes

            算法类(Algorithm Classes)

几何

            角度类

            二维点和三维点类(Point2 and Point3 Classes)

            二维点和三维点类(Point2Extensions and Point3Extentions Classes)

            二维点集类和三维点集类(Point2Set and Point3Set Classes)

                        二维点集源和三维点集源接口(IPoint2SetSource and IPoint3SetSource Interface)

            ……

单位

            组成

            单位转换

            管理单位

            Ocean单位服务接口

坐标系统

            概念和术语

            坐标与Petrel

            Ocean坐标接口概览

            坐标服务

            坐标引用系统接口

            转换

            坐标系统操作

            面积

            ……..

轨迹计算

            轨迹系统

            轨迹和其他记录

            。。。

轨迹和空间入口

目录

 

基础

Slb.Ocean.Basics命名空间提供了一些基本的目标类型,代表的概念有索引,扩展,区间,也提供了一些简单的算法。

索引类是一组整数向量,有Index2, Index3, Index4,分别表示二维,三维和四维整数向量,

索引浮点类是浮点向量,有IndexDouble2, IndexDouble3, IndexDouble4,分别表示二维、三维和思维的浮点向量。

索引区间类,有IndexRange1, IndexRange2, IndexRange3, IndexRange4,分别表示一维、二维、三维、四维空间的区间。

扩展类,有Extent,Extent2,Extent3,ExtentKd和ExtentKdBase,这些类提供了定义和管理整数向量的方法。

Slb.Ocean.Basics也定义了一些静态的算法类,用于执行一些数学相关的计算。

 

几何

Slb.Ocean.Geometry命名空间定义了一些几何相关的类和操作,基本的类型有点、线,角度、面、体,以及表示真实世界二维向量的栅格(lattice)。

 

角度类(Angle Class)表示不可改变的几何角度,有属性和行为,也可以评价为罗盘角(从正北方向开始),

Angle支持的操作有:

  • addition, subtraction, multiplication, division, and negation
  • conversion from unnormalized radians (弧度) to degrees and vice versa
  • greater than, less than, equality, and inequality
  • creation from compass (罗盘) angle

Angle的属性有:

  • normalized degrees (positive in the counter-clockwise direction), and radians
  • normalized compass degrees, compass radians (measured from North)
  • cosine, sine, and tangent
  • whether it is east, west, south, north, northeast, northwest, southeast, and
  • southwest

 

二维点和三维点类(Point2 and Point3 Classes)分别定在了二维和三维欧拉空间,主要表示目标的位置,如井筒和网格节点等。

二维向量和三维向量(Vector2 and Vector3 Classes)定义了有两个二维点或三维点组成的向量。

二维方向和三维方向类(Direction2 and Direction3 Classes)定义了二维和三维空间的方向向量,没有长度的概念。

二维盒子和三维盒子类(Box2 and Box3 Classes)分别表示矩形和立方体。

二维区域和三维区域类(Segment2 and Segment3)表示有点和方向或向量组成的二维区域和三维区域。

栅格类(LatticeInfo Class)用二维数组表示真实的二维世界,栅格工具类(LatticeUtils Class)定义了了一些对栅格的操作,除此之外还有LatticeCompare Class可以用。

二维线和三维线类(Line2 and Line3 Classes)定义了二维和三维空间的线,分别代表ax+by+c=0和ax+by+cz+d=0的线,其中a,b,c,d是类的属性。

三维点点平面类(Plane3 Class)表示由三维点控制形成的平面,但不一定是水平面,组成形式是ax+by+cz+d=0,也可以是三维点加一个三维空间的方向。

二维多边形和三维多边形类(Polyline2 and Polyline3 Classes)是IPolyline2和IPolyline3接口的实例,而这两个接口是二维点集和三维点集接口(IPointSet,IPoint3Set)的扩展,这些点集用于表示二维和三维欧拉空间的数据,他们都有公共的属性,即闭合性(IsClosed)。两者都表示由一组点集组成的线。

二维多边形集合和三维多边形几何(Polyline2Set and Polyline3Set Classes)分别表示在二维和三维空间的一组多边形。

二维射线和三维射线类(Ray2 and Ray3 Classes)表示半无限长的线。

索引三角网类(IndexedTriangleMesh Class)表示由一系列顶点组成的三角网几何形态。

 

单位

大部分数据都是测量数据,测量数据必须有单位才有意义。Ocean的单位系统有3各组成部分,分别是基本测量,测量和单位。

基本测量是对一定数据类型的测量,如长度、温度、体积、流速、压力,而测量是针对目标域的度量,如半径、厚度、泡点、井筒温度等,具有实际的意义。每种测量都有多种单位可以用,各个单位之间可以转换。

Ocean单位服务的接口有,Uint CateLog,Unit System, Unit Measurement, Units, Unit Conversion,

坐标系统 Coordinate System

井轨迹计算 Trajectory Calculations

            Ocean为井轨迹计算提供了标准的模型,

发表在 编程 | 标签为 | 留下评论

【ocean学习3】ocean core层

简介

Ocean模块

            模块管理

            模块接口

                        默认构造

                        初始化

                        整合

                        整合展示

                        分离

                        卸载

            模块依赖特性

            模块信任

            模块外观显示

Ocean插件

            插件类

                        模块

                        身份

                        依赖特性

                        版本和信任

                        联系信息

                        开发文件夹

核心记录类

核心系统类

            模块

            添加模块方法

            服务

                        得到服务方法

            状态特性

            系统状态变化事件

            同步调用特性

            系统设置方法

数据管理

            工作空间事件

            数据源管理

                        数据源

                        注册数据源

            机器类

            事务

                        事务接口

                        事务管理接口

服务定位类

接口和类的描述

 

Ocean框架

Ocean core的设计是为了满足对ocean的畅想。它提供了最底层的工业组件,是开放的,模块化的,可重复利用的,能够促使应用快速开发。核心的类和介乎界面提供了ocean模块管理,ocean服务,数据管理,事务管理,以及消息记录。

通过产品家族你可以把核心类和接口打包成一个更方便的类,也可以直接用它们。

Ocean框架通过使用ocean模块的方式扩展家族产品的功能。Ocean模块通过ocean core管理,拥有一个生命周期。它的生命周期包括几个阶段,有授权摸块许可,初始化,整合它到产品家族,添加到现实接口,以及模块卸载时的移除操作。

在模拟时会核实许可,在初始化阶段会注册它提供的服务到ocean框架,在整合阶段,模块从其他模块或框架内获取它需要的服务。在整合展示阶段,模块会添加他的用户接口组件到正在运行的产品家族。当产品家族关闭时,开启分离阶段,它会清除用户接口组件,卸载许可,以及不再占用的资源。

一个ocean模块会综合利用产品家族、ocean service、ocean core和.NET提供的功能,也可以利用第三方应用或其他模块。

 

模块管理器

CoreSystem.Modules提供了模块管理器(ModuleManager)类的接口,它能够定义当前系统加载所加载的模块的身份信息。模块管理器类有模块(IModule)的执行的集合,也提供了模块信任对象的接口。可以用GetModule方法得到ocean中加载的单独模块,它返回模块实例。Ocean为每一个模块执行提供一个实例。

产品家族开发者可以通过ModuleManager.Includes属性获取所加载模块的信息,这些信息可以用于GUI展示,集合类型名,和模块类型。

 

模块接口

模块通过IModule接口的执行生成。IModule在Slb.Ocean.Core命名空间定义。为了释放不在占用的资源,模块也必须执行IDisposable,它定义在Microsoft.System.ComponentModel。

IModule接口定了模块生命周期的5各阶段,继承于IDisposable。这些阶段和方法是:

创建(default constructor),即模块的实例化

  • 初始化(Initialize)
  • 整合(Integrate)
  • 展示整合(IntegratePresentation)
  • 分离(Disintegrate)
  • 卸载(Dispose)

由Ocean Core控制的模块生命周期阶段的执行顺序非常重要,如果模块间存在依赖关系,则各个模块的不同阶段相互影响。

在产品运行时ocean core会对所加载的模块进行实例化,如果不被实例化,它定义的任何服务都不能被其他模块使用。

初始化的主要目的是注册模块提供的服务,它是模块生命周期中第一能被CoreSystem和Datamanager方法调用的节点,这些静态方法提供了ocean模块、服务、以及数据的接口。你的模块应该懂得系统的变化,如工程的打开或关闭等。这样,在初始化中应该设置事件柄以执行相应的事件。而事件柄应该在后续的分离阶段的Disintegrate方法中移除。

如果你的模块或插件是需要许可授权的,那么在初始化阶段应该合适许可的可用性。初始化完成以后,它所注册的服务就可以被所有模式使用。

整合(Integrate)方法是模块使用服务的第一个节点,因为初始化阶段,各个模块都注册了服务,ocean core的ServiceLocator类用于寻找服务,可以通过服务的类型,或服务类型和数据类型的组合寻找所需的服务。在整合阶段,模块定义的过程和步骤被添加到过程控制面板和工作流编辑器。

整合展示方法是用户交接口组件添加到产品家族的方法,这些组件包括;

  • 新的菜单
  • 菜单中新的项目
  • 新工具条
  • 工具条中新的工具
  • 设置对话框的页面
  • 通用窗口

当产品家族开始关闭时会调用各个模块的IModule.Disintegrate方法。Disintegrate方法的职责是清理模块安装的任何展示元素,也服务于与其他模块的连接。

卸载以IDisposable模式出现,必须是IModule执行的一部分,主要目的是释放不在占用的资源,以及占用的许可文件。

 

模块依赖表示各个模块之间相互依赖,模块信任表示对许可的灵敏程度,模块外观是对自身的简述。

Ocean插件是一组模块的组合,也包含了管理插件的简述。

 

核心记录(CoreLogger)类给出了一些方便的方法,显示程序运行过程中的错误、警告、信息和调试消息。这些消息分类记录在log文件中。

核心系统(CoreSystem)类提供了一些静态类,可以访问ocean的模块、方法、和系统状态信息。你可以将这些类理解为方便访问ocean core重要信息的方法。主要包括服务定位器和模块管理器。并且定了其他命名空间常用的对象和功能。

CoreSystem.Module属性提供了访问Ocean core中模块管理器类的途径,也提供了添加模块的方法CoreSystem.AddModules。尽管很多模块是产品启动时加载的,而有些模拟是用户交互界面创建的。

CoreSystem.Services属性提供了访问ocean core中服务定位器的类。服务定位器用来管理系统中的服务。服务执行常用的任务,由数据类型和相应的任务注册服务。

状态属性(CoreSystem.State)用于返回系统的当前状态。SystemState枚举定义了系统可能处于的状态,分别是:

None,系统状态未知,(这个系统不是电脑系统,而是petrel这个局部系统,也呈插件的宿主)

Initializing,单个模块正在加载,模块可以利用CoreSystem,但是不能相互作用。

Integrating,模块都已加载,能够相互作用。

IntegratingPresentation,用户接口元素可以添加。

Running,所有项目都已加载,整合,用户接口也已经创建,系统正正常运行。

Disintegrating,系统正在关闭,用户接口正在销毁,资源正在释放,方法的引用和时间柄正在移除,垃圾收集正在进行。

系统状态改变事件:当系统状态改变ocean core将会发送SystemStateChanged事件,系统状态改变这个事件的引用包含系统的当前状态。

同步调用(SynchronizeInvoke)属性,提供了在主线程上同步或异步执行委托的方式。通过ISynchronizeInvoke可以把工作线程转移到主线程上,但必须排队等其他模拟执行完。

 

数据管理类

Ocean core提供的DataManager静态类可以访问数据服务,这些服务管理数据源,事务和工作空间事件。

工作空间表示系统尺度,每个project表示一个工作空间。

数据源管理器用于管理数据源,DataManager.DataSourceManager属性提供了访问主要工作空间的IDataSourceManager的途径。在一个工作空间,可能存在多种数据源,IDataSourceManager管理这些数据源对象。

数据源定义了存储和提取数据的机制,每个数据源拥有唯一的身份。IDataSource定义了数据源,它的执行提供了一些属性。IDataSource拥有的方法包括数据源的打开、关闭和保存,也有IsDirty属性指示目标已经改变需要保存,以及与之相关的IsDirityChanged事件。IsDirty继承于IDirtyResolver,可以使Dorid作为目标的引用。

IDateSource接口表示以Droids方式保存和提取所链接数据的方式,Droid是目标存在期间的身份证,代表唯一的目标,它表示实际数据对象的引用,利用Droid使得对数据的操作更加方便。

使用droid使得对象与数据接口分开管理,数据接口通过IDataSource接口的类执行,这些接口.

当数据生成、更新或删除时需要用到事务处理(Transactions),一个事务处理表示了对数据的一组编辑行为,使得对数据的处理效率更高更安全。

使用transactions处理数据需要一些简单的步骤,包括:

  • 生成transactions
  • 锁定占用的数据
  • 修改数据
  • 执行transactions
  • 卸载transactions

服务定位器(ServiceLocator)类

Ocean服务用于满足常用的功能,一个服务是一个对象,提供其他对象常用的操作。服务有两类,一类是由.NET 框架提供的系统接口,另一类是由服务类型及相应对象类型定义的服务。

接口和对象的描述也是ocean core提供的途径。

 

 

发表在 编程 | 标签为 | 留下评论

【Ocean学习2】ocean框架介绍

Ocean是一个开放的软件开发框架,它可以把你的想法无缝整合到petrel平台。它使开发者把更多的精力放在应用创新,而不是地层开发。Ocean提供了大量的api给客户和第三方平台。

Ocean基于微软的.NET开发环境,非常适合团队合作,提高效率。

Ocean庞大的内部结构由三层框架组成。Ocean core是最底层,Ocean service层是中间层,Ocean for petrel层是最高层。

Ocean core是基础,每个ocean模块都由core管理,并且管理每个产品的注册,管理数据源。

Ocean service是一组相互独立的工具和函数应用,独立于产品家族。它提供了主要目标对象、单位系统和转换,坐标系统和转换,抽象数据类型,几何数据类型等。

Petrel是ocean 插件的宿主,是ocean插件和模块运行的环境。它提供了主要对象,定义了这些对象的数据源,管理项目中所有数据的存储,另外,也提供了图像显示环境。

一个ocean插件包括一个或多个模块,每个模块都是对petrel产品家族功能的扩展,模块才是真正添加到petrel中的功能。

Ocean模块能够无缝地整合petrel的各个部分,能够连接软件各层资源以及最底层的.net框架功能。

Ocean 命令和工作步骤:命令可以以命令行或petrel UI的形式出现,提供了对目标的一种操作,工作步骤是一组命令,工作流是一组工作步骤。

Petrel数据域:为了在各个插件之间管理和操作数据,Petrel提供了一系列数据模型,减少了数据冗余,并提供了数据元素。

常用的数据模型组成了所有插件的基础,Petrel提供了常用数据的通用表示方式,即接口,这些数据涵盖了从地震到数模的所有类型。

Ocean提供了这些Petrel数据域的接口:

获取的数据:这些数据共同油田实际测试得到,或者对观测数据的处理得到,包括:

       井和井轨迹数据

       完井数据

       测井和地质标记

       地层数据

       地震和叠前数据

油藏模型:

       断层模型

       结构模型

       柱状网格

       模拟数据

Ocean中的数据结构遵循生成、读取、更新、删除的顺序模型,对数据的操作必须满足这个关系。

Ocean提供的API不是只限于对数据的接口,也提供了丰富的图形现实环境来整合ocean模块。用户交互界面API提供了常用的Petrel窗口系统元素。

 wordpress的图片上传总失败,欢迎关注微信公众号查看文章,微信公众号名称是“油藏地质与开发”或者“ReservoirGeoDevelop”。

发表在 编程 | 标签为 | 留下评论

[Ocean学习1]Ocean插件开发教材整体目录

[Ocean学习1]Ocean插件开发教材整体目录

1 ocean framework-Introduction     53

2 Ocean Core    65

3 Ocean Services    109

4 Petrel convenience classes     305

5 Worksteps, Processes, and workflows     327

6 Accessing Domain objects     473

7 General domain objects     513

8 Templates          519

9 Domain Conversion      539

10 Import and Export       549

11 Structural Domain

12 Services              617

13 Prestack Seismic        621

14 Seismic Datasets       639

15 Seismic Interpretation      753

16 Import/Export      791

17 Microseismic      817

18 Spatial Access      833

19 Borehole geology       839

20 Stratigraphic Models     949

21 Borehole Settings    973

22 Reservoir Modeling    977

23 Filtering             1063

24 Petrel Processes       1083

25 Services        1197

26 Reservoir Simulation        1213

27 External Simulators      1395

28 Production        1491

29 Petrel Processes      2585

30 Ocean UI services      1629

31 UI Customization Default Mode     1667

32 UI Customization – Classic Mode Menus and Toolbars    1733

33 Windows, Dialogs, and Controls     1765

34 Interaction in Petrel Windows         1909

35 Trees              1925

36 Setting Information Access           1931

37 Active Object            1945

38 Color Tables       1951

39 Domain Object Style     2382

40 Custom Domain Objects     2009

41 Persistence     2285

42 Ocean Plug-in Licensing         2327

43 Ocean Plug-in Development    2343

44 Acceptance Testing     2361

45 Ocean Plug –in Unit Testing

 

已经有一些C#基础了,最近开始学习Ocean插件开发。用博客记录学习过程,逐步释放学习资料,分享学习经验。

发表在 编程 | 标签为 | 留下评论