我现在正在学习C#,以前一直是用c,c++,其实用c++也只是把他当作一个更好的c来用的。也就是说虽然用过面向对象的语言,但是没真正去应用面向对象的思想和方法。 现在呢,就想了利用博客,在此记录自己的学习过程。从小开始就习惯了3步曲。学到面向对象概念这里也来个三步走,第一是初论,二是中论,三是末论。
初论主要学到的是,何为抽象,什么是对象。
中论主要学到的是,对象互操作,对象间关系,对象群集。
末论主要学到的是,多态。
下面就来梳理一下初论中所涉及的内容。
作为软件开发者,主要的也就是把真实世界的各种状况进行软件建模。那么我们面对真实世界如此繁杂的信息海洋,应该如何从这些信息中提炼精华,而不知为其所淹没。人类的大脑天生懂得简化接收到的信息,让信息细节通过一种叫做“抽象(abstraction)”的过程得到管理。
第一,通过抽象进行简化。我们最熟悉的莫过于旅游时用的游览路线图。你就是来一次欧洲或者世界游,你都可以用一根线把他们连起来,把主要的公路,游览点等等这些重要特征标记出来,基本上就一目了然了。学过离散数学的人就更好理解了,离散数学中有图论部分,很多用其他数学不好证明和理解的东西,在图论中很轻松的就解决了。其中很大一个功劳在于图论的简单化处理。
第二,通过抽象来概括特征。这也是人类认识世界的一个过程,通过抽象,让模型变得越简单,让其越通用,那么该模型就越具有普遍性。我们对事物的认识也越清楚。
第三,将抽象模型组织为层级结构。当人类有了成千上万的抽象模型时。为了对付由此带来的复杂性,人类根据既定标准进行分类处理,也就是一个层级结构的划分。在科学领域将所有自然物区分为动物、植物,矿物质。而动物之中又可分为哺乳类,鱼类,鸟类,爬行类,两栖类,昆虫类。哺乳类下就有了狗,猫,猴子啊,等等等。每种类别都是有非常清楚的概念,什么才是动物,什么是植物,什么是矿物质。我们用这些概念,构造出一个自顶向下渐趋复杂的抽象层级结构。如果我们不对其进行层级结构的划分的话,那么我们可能总是面对着这些什么狗,猴子,鸽子,鸡啊等等等等,我们终究会精尽而亡。
作为软件开发中抽象又是怎样的呢?
首先用户有很多的需求,用户和你讲我们要怎么怎么样,我们想怎么样怎么样。到时候他们另外一个部门的什么人又来了,我们要怎么样怎样。各个部门不同的人和你讲了七七四十九天,你的笔记大概有九九八十一本了。哇,我们该怎么建立我们的软件模型呢,我们的模型是一个应该是一个怎么样的呢,怎么样才能满足那些人呢?那么我们就需要判断这些细节中哪些是与系统最终目标相关的,这是根本大计,因为我们不能对付所有细节!容纳太多细节的结果,就是让系统变得过于复杂,使之难以被设计、编码、测试、调试撰写文档和维护,以后也难以扩展。在构建一个软件系统时,所有抽象过程的容纳或排除动作,都必须给予该系统的总体目标、应用域和关注点进行考虑。
抽象的重用。
挑战
虽然抽象是人类自然而然的信息处理方式,但为软件系统开发合适的模型确实是一个不容易的工作,因为
1,存在无穷多可能。抽象是观察者眼力的延展:独立工作的观察者,几乎总是会造出彼此不同的模型,那个最棒?争论随之而来。
2,对于将来的复杂状况,永远不会有最好或正确的模型,对于要解决的问题只存在较好或较差的模型。同一情形可能有多种功效等同的建模方式。
3,但是要注意,的确存在不正确的模型:即错误的表达真实世界的模型。
4,要测知模型是否已经全然捕捉到用户需求,这可没有现成的试剂。判断一种抽象方案是否恰当的最终依据,是软件系统的成品。我们可不愿一直等到项目尾声才发现误入歧途。所以必须详细而明确的和下列人员沟通:
程序的用户
软件工程师
如何成为成功的对象建模者
为软件系统进行恰当的抽象和建模,需要
1,洞察问题的所在
2,创造力
3,好的倾听技巧
4,好的观察技巧
5,选定抽象方案的有组织过程。
6,与软件开发人员和用户就结果模型进行简要沟通。
7,在比较理想的情况下,我们还会使用软件工具来使这样的蓝图创建工作变得更加自动化。
何为对象。
对象是面向对象系统的基本构成块。
我们先来说说真实世界的对象。对象是:
1,某种可为人感知的物质
2,思维,感受或动作所作用的物质或精神体。
也就是物理对象和概念性对象。
软件对象是,一种将状态和行为合成到一起的软件构造,用来描述真实世界的一个物理或概念性的对象。
何为状态/属性/数据?
何为行为/操作?
可以访问对象的数据和修改/维护数据的方法.