OOP通过对真实世界中的对象建模应用来工作。OOP有三种主要特性:封装、继承和多态。
OOP的好处是很实际的。这也是为什么包括C#在内的大部分现代编程语言都是OO的。我们甚至可以引用为了支持OOP而进行语言转换的两个著名的例子:C语言演变成了C++,而Visual Basic则升级为Visual Basic.NET。
本节介绍OOP的好处并且对学习OOP的难易程度给出一个评估。
OOP的优点包括代码易维护、代码可复用和可扩展性。下面,我们对这些优点作更详尽的介绍。
当前的应用软件往往非常大。很久以前,一个“大”系统包含几千行代码。而现在,甚至100万行代码都不算是大系统。当系统变得更大的时候,就开始产生一些问题。C++之父Bjarne Stroustrup曾经说过类似于下面的话。小程序可以随便写,即使不是很容易,但最终你还是能让它工作。但是,大程序却截然不同。如果你没有使用“好的编程”技术,新的错误会随着你修正老错误的步伐而不断地产生。
原因就在于,一个大程序的不同部分会相互影响。当我们修改程序的某一部分内容时,可能不会意识到这种变化可能会影响到其他部分。OOP使应用程序更容易模块化,而且模块化使得维护不再头疼。模块化在OOP中是内在的,因为类(它是对象的模板)本身就是一个模块。好的设计应该允许一个类包含相似的功能和相关的数据。在OOP中,一个经常用到的重要的相关术语是耦合,它表示两个模块之间有一定程度的交互。各部分之间的松耦合使得代码更容易实现复用,而复用是OOP的另一个优点。
可复用性意味着,如果对于最初编写的代码有相同的功能需求,那么代码的编写者或其他人可以复用它们。一种OOP语言通常带有一套现成的库,这并不奇怪。以C#为例,这门语言是.NET Framework的一部分,它提供了一套详细设计并经过测试的类库。编写和发布自己的库也很容易。编程平台中对可复用性的支持是非常吸引人的,因为它会缩短开发时间。
类的可复用性的最大挑战之一就是为类库创建好的文档。程序员如何才能快速地找到提供了他(或她)想要的功能的那个类?找到这样一个类会比从头编写一个新的类更快吗?好在,.NET Framework类库有大量的文档。
可复用性不仅适用于编码阶段类或其他类型的复用,当我们在OO系统中设计一个应用时,OO设计问题的解决方案也可以复用。这些解决方案叫作设计模式。为了更容易地指明每一种解决方案,人们给每种模式都起了一个名称。在经典的设计模式图书《 Design Patterns:Elements of Reusable Object-Oriented Software 》中,我们可以找到可复用的设计模式的最早的名录,该书作者是Erich Gamma、Richard Helm、Ralph Johnson和John Vlissides。
每个应用都是独一无二的,都有自己的需求和规格。说到可复用性,有时我们无法找到一个已有的类能够提供应用程序所需的确切功能。但是,我们可能会找到一个或两个类,它们提供了这些功能的一部分。可扩展性意味着,我们仍然可以使用这些类,通过扩展它们来满足我们的需求。我们还节省了时间,因为不需要从头编写代码。
在OOP中,可扩展性通过继承来实现。我们可以扩展一个已有的类,为它添加一些方法或数据,或者修改不喜欢的方法行为。如果知道该基本功能会在许多示例中使用,但是又不希望类提供非常具体的功能,那么我们可以提供一个通用的类,以后可以扩展它来为应用程序提供具体的功能。
C#程序员需要熟练掌握OOP。如果你曾经使用过过程式语言,诸如C或Pascal,你会发现有很大的不同。鉴于此,这既是好消息又是坏消息。
我们先说坏消息。
研究人员一直针对在学校教授OOP的最好的方式而争论不休。有些人认为,最好的方法是在介绍OOP前先教授过程式语言。我们发现,在许多学校,OOP课程往往安排在接近大学最后1年。
但是,最新的研究表明,拥有过程式编程技能的人和OO程序员的视角以及解决问题的模式差异迥然。当熟悉过程式编程的人需要学习OOP时,他所面临的最大障碍就是模式的转变。据说,从过程式转变到面向对象模式,这种观念的转变需要6~18个月的时间。其他的研究也表明,没有学习过过程式编程的学生,不会觉得OOP很难。
我们再来说好消息。
C#是学习OOP的最简单的语言之一。例如,我们不需要担心指针,也不需要花费宝贵的时间去解决由于没有释放不用的对象而引起的内存泄漏的问题。最重要的是,.NET Framework有一个非常广泛的类库,在其早期的版本中,bug相对来说很少。一旦我们掌握了OOP的基本要点,用C#编程是很容易的。