站在软件工程的角度重新思考面向对象
一、代码说事
(一)也许你见过Java的下面的这样的代码
public class User { private int age; public int getAge() { return age; } public void setAge(int age) { if (age < 18) { System.out.println("错误!最小年龄应为18岁!"); this.age = 18; // 如果不符合年龄要求,则赋予默认值 } else{ this.age = age; } } public String toString() { return " [age=" + age + "]"; } }
public class TestUser { public static void main(String[] args) { User p1 = new User(); p1.setAge(20); //通过seter、geter、toString来对Adult类的私有属性访问 System.out.println(p1.toString()); //增加了数据访问限制,保证可维护性 } }
(二)也许你见过Python的下面的代码
class User(): """创建用户个人信息""" def __init__(self, first_name, last_name, phone_number = '', email = '', **user_info): # 在这其中我们加入了题目所要求的两种属性,而且还有一般网站都会要求的电话号码与邮箱,我们最后加入了一个字典,可以让用户个性化的定制自己的资料 self.name = first_name +" " + last_name self.phonenumber = phone_number self.email = email self.other = user_info # 新建一个字典来接收user_info字典 def describe_user(self): #打印用户信息摘要的方法 print("This user‘ name is " + self.name) print("This user's phone number is " + self.phonenumber) print("This user's email is " + self.email) print("There are any other imformations below:") print(self.other) def greet_user(self): #向用户发送我们的问候 print("Hello, " + self.name)
AE = User('Albert','Einstein', '123456789', '88888888@qq.com', Major = 'Computer', job = 'physicist' ) AE.describe_user() AE.greet_user()
(三)也许你见过JS的这种代码
<script type="text/javascript"> //新建英雄:刘备 var hero=new Object(); hero.name='刘备'; hero.blood=100; hero.weapon='双股剑'; hero.attack=function(){ return this.name+'使用'+this.weapon+'发起了攻击'; }; alert(hero.attack()); var hero2=new Object(); hero2.name='关羽'; hero2.blood=100; hero2.weapon='青龙偃月刀'; hero2.attack=function(){ return this.name+'使用'+this.weapon+'发起了攻击'; }; alert(hero2.attack()); </script>
(四)也许你见过C++这样的代码
#include <iostream> using namespace std; class Box { public: double length; // 长度 double breadth; // 宽度 double height; // 高度 }; int main( ) { Box Box1; // 声明 Box1,类型为 Box Box Box2; // 声明 Box2,类型为 Box double volume = 0.0; // 用于存储体积 // box 1 详述 Box1.height = 5.0; Box1.length = 6.0; Box1.breadth = 7.0; // box 2 详述 Box2.height = 10.0; Box2.length = 12.0; Box2.breadth = 13.0; // box 1 的体积 volume = Box1.height * Box1.length * Box1.breadth; cout << "Box1 的体积:" << volume <<endl; // box 2 的体积 volume = Box2.height * Box2.length * Box2.breadth; cout << "Box2 的体积:" << volume <<endl; return 0; }
但是你思考过为什么
二、软件工程见真知
(一)闲扯
面向对象技术
是软件工程领域
中的重要技术,面向对象技术是一种对真实世界
的抽象思维方式。如
“一、代码说事”
中的这些代码一样,无论是描述人类,还是一个物体的大小。这些所抽象的属性,都是真实存在的,例如
人
,就可以抽象出来名字、身高、年龄等;例如一个物体,就可以抽象出,它的长、宽、高、颜色等。
这种技术比较自然地模拟了人类认识客观世界的方式;
(二)面向对象方法的基本思想
面向对象方法的基本思想:
面向对象方法的基本思想是从现实世界中客观存在的事物(即对象)出发,尽可能地运用人类的自然思维方式来构造软件系统。它更加强调运用人类在日常逻辑思维中经常采用的思想方法与原则,例如:
抽象
、分类
、聚合
、封装
等,使开发者以现实世界中的事物为中心来思考和认识问题,并以人们易于理解的方式表达出来。
(四)软件工程学家发话了
软件工程学家Codd
和Yourdon
发话了,他们说:
面向对象
=对象
+类
+继承
+通信
如果一个软件系统,采用这些概念来建立模型并实现的话,那么它就是面向对象的。
(五)知识点总结图谱
面向对象的概念看似简单,但是要做到真正理解和掌握还是需要花费时间的,而且需要在软件开发的实践中进行体验。
为了方便理解,和看,我费劲了九牛二虎之力,最终画出了如下成果的图,最终目的就是可以让你看的更清楚,更好,更容易记忆。
图中包括对
对象
、类
、封装
、继承
、消息
、关联
、聚合
、多态性
进行了总结。
下面这张图,就了解到这些知识点:
1、对象
对象(Object)
是系统中描述客观事物的一个实体,它是构成系统的一个基本单位,由一组属性和对这组属性进行操作的一组服务组成。属性:用来描述对象静态特征的一个数据项服务:用来描述对象动态特征(行为)的一个操作序
2、类
类(Class):
具有相同属性和服务的一组对象的集合,它为属于该类的全部对象提供了统一的抽象描述,其内部包括属性和服务两个主要部分。类代表一个抽象的概念或事物,对象是在客观世界中实际存在的类的实例。
类与对象的比较
“同类对象具有相同的属性和服务”是指它们的定义形式相同,而不是说每个对象的属性值都相同。
类是静态的
,类的存在、语义和关系在程序执行前就已经定义好了。
对象是动态的
,对象在程序执行时可以被创建和删除。
在面向对象的系统分析和设计中,并不需要逐个对对象进行说明,而是着重描述代表一批对象共性的类。
3、消息
消息(Message):对象发出的服务请求,一般包含提供服务的对象标识、服务标识、输入信息和应答信息等信息。
说明
一个对象向另一个对象发出消息请求某项服务,接收消息的对象响应该消息,激发所要求的服务操作,并将操作结果返回给请求服务的对象。
4、封装
封装(Encapsulation)
:把对象的属性和服务结合成一个独立的系统单位,并尽可能隐藏对象的内部细节。
封装的作用
使对象形成两个部分:接口(可见)和实现(不可见)信息隐藏将所声明的功能(行为)与内部实现(细节)分离封装可以保护对象,避免用户误用;
也可以保护客户端,其实现过程的改变不会影响到相应客户端的改变。可见性是指对象的属性和服务允许对象外部存取和引用的程度。
5、继承
继承(Inheritance)
:指子类可以自动拥有父类的全部属性和服务
继承的作用
简化了人们对现实世界的认识和描述对于软件复用是十分有益的
继承的类型
单继承
:子类只从一个父类继承
多继承
:子类从多个父类继承
6、多态性
多态性(Polymorphism)
:指在父类中定义的属性或服务被子类继承后,可以具有不同的数据类型或表现出不同的行为
起到的作用:
多态性机制为软件的结构设计勾勒灵活性,减少了信息冗余,明显提高了软件的可复用性和可扩展性
(六)对象之间的联系
- 分类结构:一般与特殊的关系
- 组成结构:部分与整体的关系
- 实例连接:对象之间的静态联系
- 消息连接:对象之间的通信联系
1、分类结构
分类结构表示的是事物的一般与特殊的关系,在面向对象术语中,将一般与特殊的关系称为泛化(Generalization)联系。
如果在分类结构中存在多继承,将形成一个类的网格结构
2、组成结构
组成结构表示对象类之间的组成关系,即部分与整体关系。
组成结构体现了面向对象方法的聚合(Aggregation)原则。组成结构可以表示出复杂的对象层次结构。
3、实例连接
实例连接表示对象之间的静态联系,它是通过对象的属性来表现对象之间的依赖关系。
在面向对象术语中,对象之间的实例连接称为链接(Link),存在实例连接的对象类之间的联系称为关联(Association)。
4、消息连接
消息连接是对象之间的通信联系,它表现了对象行为的动态联系。
一个对象需要另一个对象的服务,便向它发出请求服务的消息,接收消息的对象响应消息,触发所要求的服务操作。
消息连接是在具有交互的对象之间的一种基本联系。如果两个对象之间不存在交互行为,自然没有消息连接。
三、补充:面向对象的软件工程方法
你可能经常看到什么OOP、OOA、OOD之类的。
1、面向对象分析(Object Oriented Analysis,OOA)
分析和理解问题域,找出描述问题域和系统责任所需的类及对象,分析它们的内部构成和外部关系,建立OOA 模型。
2、面向对象设计(Object Oriented Design,OOD)
将OOA 模型直接变成OOD 模型,并且补充与一些实现有关的部分,如人机界面、数据存储、任务管理等。
3、面向对象编程(Object Oriented Programming,OOP)
用一种面向对象的编程语言将OOD 模型中的各个成分编写成程序,由于从OOA→OOD→OOP实现了无缝连接和平滑过渡,因此提高了开发工作的效率和质量。
4、面向对象测试(Object Oriented Testing,OOT)
面向对象测试是指对于运用OO 技术开发的软件,在测试过程中继续运用OO 技术进行以对象概念为中心的软件测试。
以类作为基本测试单位,集中检查在类定义之内的属性、服务和有限的对外接口,大大减少了错误的影响范围。
5、面向对象软件维护(Object Oriented Software Maintenance,OOSM)
在面向对象方法中,各阶段采用的表示是一致的,从而大大降低了理解的难度,无论是从程序中的错误追溯到问题域,还是需求的变化都要从问题域追溯到程序,整个过程都是平坦的。
对象的封装性使得一个对象的修改对其他对象的影响很小,不至于牵一发而动全身。
参考资料:
https://blog.csdn.net/a449559862/article/details/79782154
https://www.cnblogs.com/cainiao-chuanqi/p/11592920.html
https://www.runoob.com/cplusplus/cpp-classes-objects.html