《vtk9 book》 官方web版 第2章 - 面向对象设计

 备注:本篇偏向面向对象基础知识,可以略过。
      

       面向对象的系统因为很好的原因在计算机行业变得越来越普遍。面向对象的系统比传统的过程式系统更模块化、更易于维护,也更容易描述。由于可视化工具包是使用面向对象设计进行设计和实现的,我们在本章中致力于总结面向对象设计和实现的概念和实践。

2.1 介绍


        当今的软件系统试图解决复杂的现实世界问题。严格的软件设计和实现方法可以减轻这种复杂性带来的负担。没有这样的方法论,软件开发人员可能会发现很难满足系统的规格要求。此外,随着规格的变化和增长,一个没有坚实的基础架构和设计的软件系统将难以适应这些不断增加的要求。

        我们的可视化系统是需要考虑可扩展性的复杂软件的一个很好的例子。数据可视化是一个快速扩展的领域,每年都会推出可视化技术。任何希望整合未来创新的系统必须具有支持添加新内容而对现有系统影响不大的基础设计。

        面向对象设计是一种软件工程方法,它能够舒适地处理复杂性,并为以后的变化和添加提供框架。面向对象设计过程试图将一个复杂的任务分解成称为对象的小而简单的部分。对象是计算机抽象,用来模拟系统中被模拟的物理或抽象部分。面向对象设计方法提供机制来识别系统中存在的抽象,并对对象的行为进行建模。

2.2 良好软件设计的目标


        软件设计的质量很难衡量,但一些定性方面可以指导我们。良好的软件设计应该是健壮的、可理解的、可扩展的、模块化的、可维护的和可重用的。

        健壮的系统能够优雅地处理异常情况,并且行为一致。健壮性给软件开发人员带来信心,即系统的基本组件将如预期般地行为,即使在比原始实现者预期的情况下使用系统时也是如此。

        可理解的系统可以被除了原始实现者以外的其他人使用。系统的使用应该是合乎逻辑和合理的。系统组件的名称应该来自问题领域。

        可扩展的系统在执行原始预期的任务的同时接受新的任务。系统应该接受新形式的数据和新的算法,而不会破坏现有的软件。向系统添加一个新的基本部分不应该导致系统的大部分被修改。经验表明,在系统中修改的现有代码越多,引入错误的可能性就越大。

        模块化的软件系统最小化系统组件之间的关系数量。紧密耦合的系统组件应该在逻辑上分组,并遵守共同的命名约定和协议。

        软件维护在系统设计过程中经常被忽视。然而,系统的总成本包括维护和原始开发。如果问题很容易被隔离,并且修复一个问题不会在系统的无关部分引入问题,那么软件系统就是可维护的。

        最后,软件开发的经济性要求我们尽可能地利用过去的工作。在理想的情况下,在现有系统中实现新技术应该是一项简单的任务。这在软件系统中很少见。创建可重用的软件组件可以减少工作的重复,并在系统内促进一致的接口。然而,正如我们在本书中所看到的,创建可重用的软件通常需要额外的努力。一个人的短期生产力观念与软件开发组织的长期生产力观念存在冲突。

2.3 面向对象的概念


        对象是面向对象系统中的主导概念。对象是抽象,它封装了系统中实体的属性和行为。每个对象都有一个标识,用来区分它和系统中的其他对象。通常,对象的可区分方面是显而易见的。例如,在计算机桌面上,一个窗口与另一个窗口的区别可能是颜色、位置、大小或内容。但是,外表可能具有欺骗性,即使两个对象具有完全相同的特征,它们仍然可能具有不同的标识。两辆汽车可能具有相同的制造商、型号、选项和颜色,但仍然是两辆不同的车。现实世界通过车辆识别号来区分这两辆车。同样,处理多个实体的编程系统需要一个标识机制。在数据库系统中,一组标识键(称为 n-元组)标识系统中的实体。

        但是,面向对象系统与传统的过程式编程系统有何不同呢?主要的区别在于这两种方法处理数据抽象的方式。传统系统将抽象限制为数据类型,而面向对象系统为数据和可以应用于数据的操作创建了抽象。事实上,面向对象系统将数据和操作一起保存在一个编程构造体中,称为对象。数据和操作共同构成了对象的属性。当对对象应用操作时,编程语言的动态绑定机制执行适用于该对象的过程。这在过程式系统中并不是这样。程序员必须提供逻辑来决定调用哪个过程。处理多种类型的系统通常充斥着用于选择操作适当过程的 case 语句。随着这些系统添加新类型,调度基于数据类型的操作的代码必须扩展以处理新类型。例如,在一个用于显示不同类型基本部件的程序中,以下伪代码显示了过程式系统与面向对象系统的不同之处。

        过程式(用 C 语言):
 

Primitive *aPrim;
...
DrawPrimitive (aPrim)
...
procedure DrawPrimitive (aPrim)
  {
  if (aPrim->type == TRIANGLE) then DrawTriangle (aPrim)
  else if (aPrim->type == SQUARE) then DrawSquare (aPrim)
  else if (aPrim->type == CIRCLE) then DrawCircle (aPrim)
  ...
  }

    Object-oriented (in C++):

...
aPrim->Draw ();
...

        在项目的后期,有人可能想要添加一个新的基元,比如说一个二次方程。负责这项艰巨任务的人必须搜索现有系统,找到第一个示例中所有 if 语句的出现,并为新的二次方程类型添加一个测试。当然,一个优秀的程序员会将代码隔离到一个位置,就像我们在这里做的一样,所以任务会更容易一些。然而,那个程序员必须首先意识到原始程序员足够有技

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小道士写程序

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值