StupidBeauty
Read times:3231Posted at:Mon Jun 26 23:46:47 2017 - no title specified

《C++面向对象软件设计及构建》文章翻译:1.2抽象,1.2 Abstraction

抽象,是一个设计技巧,它专注于某个实体的本质方面,而忽略或隐藏掉那些并不重要或非本质的方面。抽象,是一种重要的工具,可用来将复杂的情景简化到一定的级别,使得我们能够对其进行分析、试验或理解。例如,为了理解太阳系的运行机制,早期的数学家和天文学家就对“行星”进行了抽象,将行星当成一个整体,其整个质量被集中到单个物理点上。这样的抽象,忽略掉了每个行星的狠多方面的细节 -- 它的实际直径、它的大气成分、它的平均温度 -- 这些细节对于太阳系的基本轨道机制的理解和建模无关。

在软件中,抽象是对于实体的“属性”和“行为”两个方面的考虑。属性,表示的是,与实体相关联的特性。行为,表示的是,实体能够做出的动作。在软件对象中,属性,是由与对象相关联的数据来表示的。对于一个销售情况跟踪系统来说,与一个销售人员相关联的特性可能包括:名字、已销售的汽车数量、已销售的汽车总价值;顾客名单;成交率;总成交数。该对象的动作或行为,对应的是,与该对象相关联的操作或函数。对于“销售人员”,其动作可能包括:卖车;报告收入;以及,提升成交率。

要想创建出能够有效管理的软件对象,进行抽象是至关重要的,因为,现实世界中的对象是太复杂了,无法完全地详细描述。考虑一下上文提到的那个简单的销售人员对象。真实生活中的销售人员,有着狠多属性:身份编号;家谱;医疗记录;基因数据;信用记录;天赋才能;以及,其它的狠多独特属性。类似地,销售人员可以做出狠多动作(卖车;接听电话;买房;生娃;得病;提升信用卡额度;付账单;等等)。即使妳只打算在软件对象中描述这些细节中的一小部分,也是无意义的。重要的是,仅仅关注销售人员身上那些与特定系统(例如,销售情况跟踪系统)的开发相关的方面。

在面向对象的系统中,那些对象,通常都是与“真实世界”中的实体直接对应的。对象,例如在汽车交易跟踪系统中可能会出现的销售人员和汽车,都对应着交易相关的实际人员和交易中被销售的实际汽车。在某些时候,这些软件对象和真实世界中实体之间的对应关系是如此地直观,以至于,利用电脑所做出的盗窃或欺诈过程通常都牵涉到利用了人们对于这种对应关系的信任。这种对应关系的感觉,也有另外一种表达方式,即,软件程序相当于真实世界的模拟或模型,当妳改变其中一个事物时,另一个事物也跟着发生改变。一个“好的”软件程序,应该精确地模拟出真实世界中发生的事情。


对于销售人员的抽象

上述示例,催生了以下对于抽象的定义:

抽象

出于某种目的,对某个特定实体进行建模的过程中,使用的用来表达与该实体相关的属性和行为的,带有名字的,明确的表达方式。

这个定义,也反映了一个事实,即,对于计算机科学家和软件工程师来说,抽象并非是“抽象的”、虚无的概念。反过来,抽象,被用来对这个抽象过程进行明确的表示。在软件生命周期的不同阶段,某个抽象的表示形式可能不同。在早期设计阶段,可能会使用手绘的图案、图表和列表。在随后的设计阶段中,可能会使用特定的设计形式,这个阶段通常会使用一些设计工具。最后,在实现阶段,抽象是由软件来呈现的,这个阶段中,它可能已经对用户可见了,并且可与用户进行交互。

单个的实体可以拥有多种有效的抽象。销售人员的基因数据对于销售情况跟踪系统来说没有意义,但是,对于医疗数据库系统来说可能就有意义了,如下图所示。相应地,医疗数据库系统的开发者,也不会对已销售的汽车数量感兴趣。抽象本身的名字,可用于将同一个实体的不同抽象区分开,也可用于将不同实体的抽象区分开。在面向对象的设计中,一个关键点就是,要决定,将哪些属性和行为包括到某个特定的抽象中去。

对于医疗数据库中一个病人的抽象

好的抽象所具有的特点


尽管对于同一个实体可以有狠多种不同的抽象,但是,每种抽象都应当有某些特定的特点,使得它确实是一个“好的”抽象。对于一个好的抽象,它应当是:

名字起得好:

抽象的最大特点,由其名字反映。如果其名字所蕴含的意义、直觉、印象和预期能够精确地反映出该个抽象的某些天然特点,那么,这个抽象的名字就起得好。一个名字,它有没有意义,取决于要使用该个抽象的社区中的人们。在某些情况下,其名字可能是某个应用领域中的一个技术名词,它对于该应用领域中的人群来说表达出了一个完美的抽象,但对于非技术人群来说毫无意义。在其它情况下,对于众所周知的实体(例如"汽车""邮政编码"),其名字也会被普罗大众所认可。

一致性:

从建模者的观点来看,该个抽象应当包含一组有意义的属性和行为。这些属性和行为,必须是在特定设定下必要的且符合预期的。例如,在定义销售人员这个抽象时,让其中包含了属性“成交率”“家庭情况”和“天赋才能”,这就不是一个一致的抽象,因为,在一个要构建销售情况跟踪系统的设计者眼里,它没有意义。

精确:

抽象中,应当仅仅包含那些由被建模实体所呈现出来的属性或行为。抽象中不应当附加包含一些远远超出实际实体能力的东西。尽管这个原则通常会被遵守,但是,也有一些特殊的场合,可以放宽这个原则的限制。例如,在一个虚拟环境中,某个场景里,也许可以穿墙而过,而这种行为显然违背了真实世界中的墙的特性。

最小化:

抽象中,不应当包含那些对于它所要完成的任务来说多余的属性或行为。例如,向销售人员的抽象中加入一个电子邮件地址或电话号码属性的话,可能就是多余的,因为销售情况跟踪系统中可能并不要求提供这些属性。

完整

抽象中,应当包含所有必要的属性和行为,使得能够对该抽象进行操作以完成它的预期目标。假设,销售情况跟踪系统中需要知道每个销售人员的成交率,那么,未在抽象中包含这个属性的话,就是不完整的。

这些特点,显然是主观的,这就意味着,要想搞成好的抽象的话,需要有好的判断力,并且需要练习和经验。

花魔芋

未知美人

未知美人

芯片

未知美人

未知美人

Your opinions
Your name:Email:Website url:Opinion content:
- no title specified

HxLauncher: Launch Android applications by voice commands