站在软件工程的角度重新思考面向对象(含高清图谱)

简介: 站在软件工程的角度重新思考面向对象(含高清图谱)

站在软件工程的角度重新思考面向对象


一、代码说事

(一)也许你见过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;
}

但是你思考过为什么

二、软件工程见真知

(一)闲扯

面向对象技术软件工程领域中的重要技术,面向对象技术是一种对真实世界的抽象思维方式。

“一、代码说事”中的这些代码一样,无论是描述人类,还是一个物体的大小。

这些所抽象的属性,都是真实存在的,例如,就可以抽象出来名字、身高、年龄等;

例如一个物体,就可以抽象出,它的长、宽、高、颜色等。

这种技术比较自然地模拟了人类认识客观世界的方式;

(二)面向对象方法的基本思想

面向对象方法的基本思想:

面向对象方法的基本思想是从现实世界中客观存在的事物(即对象)出发,尽可能地运用人类的自然思维方式来构造软件系统。它更加强调运用人类在日常逻辑思维中经常采用的思想方法与原则,例如:抽象分类聚合封装等,使开发者以现实世界中的事物为中心来思考和认识问题,并以人们易于理解的方式表达出来。

(四)软件工程学家发话了

软件工程学家CoddYourdon发话了,他们说:

面向对象 = 对象 + +继承+通信

如果一个软件系统,采用这些概念来建立模型并实现的话,那么它就是面向对象的。

(五)知识点总结图谱

面向对象的概念看似简单,但是要做到真正理解和掌握还是需要花费时间的,而且需要在软件开发的实践中进行体验。

为了方便理解,和看,我费劲了九牛二虎之力,最终画出了如下成果的图,最终目的就是可以让你看的更清楚,更好,更容易记忆。

图中包括对对象封装继承消息关联聚合多态性进行了总结。

下面这张图,就了解到这些知识点:

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


目录
相关文章
《认知设计:提升学习体验的艺术》——什么是速度分层
本节书摘来自华章社区《认知设计:提升学习体验的艺术》一书中的什么是速度分层,作者:(美)Julie Dirksen,更多章节内容可以访问云栖社区“华章社区”公众号查看
836 0
《认知设计:提升学习体验的艺术》——以学习者为中心
本节书摘来自华章社区《认知设计:提升学习体验的艺术》一书中的以学习者为中心,作者:(美)Julie Dirksen,更多章节内容可以访问云栖社区“华章社区”公众号查看
1473 0
《认知设计:提升学习体验的艺术》——导读
本节书摘来自华章社区《认知设计:提升学习体验的艺术》一书中的目录,作者:(美)Julie Dirksen,更多章节内容可以访问云栖社区“华章社区”公众号查看
1315 0
《认知设计:提升学习体验的艺术》——小结
本节书摘来自华章社区《认知设计:提升学习体验的艺术》一书中的小结,作者:(美)Julie Dirksen,更多章节内容可以访问云栖社区“华章社区”公众号查看
1410 0
|
测试技术
《认知设计:提升学习体验的艺术》——第2章小结
本节书摘来自华章社区《认知设计:提升学习体验的艺术》一书中的小结,作者:(美)Julie Dirksen,更多章节内容可以访问云栖社区“华章社区”公众号查看
994 0
《认知设计:提升学习体验的艺术》——分解
本节书摘来自华章社区《认知设计:提升学习体验的艺术》一书中的分解,作者:(美)Julie Dirksen,更多章节内容可以访问云栖社区“华章社区”公众号查看
917 0
《认知设计:提升学习体验的艺术》——确定目标
本节书摘来自华章社区《认知设计:提升学习体验的艺术》一书中的确定目标,作者:(美)Julie Dirksen,更多章节内容可以访问云栖社区“华章社区”公众号查看
1176 0
《认知设计:提升学习体验的艺术》——沟通学习目标
本节书摘来自华章社区《认知设计:提升学习体验的艺术》一书中的沟通学习目标,作者:(美)Julie Dirksen,更多章节内容可以访问云栖社区“华章社区”公众号查看
1290 0
《认知设计:提升学习体验的艺术》——第三章小结
本节书摘来自华章社区《认知设计:提升学习体验的艺术》一书中的第三章小结,作者:(美)Julie Dirksen,更多章节内容可以访问云栖社区“华章社区”公众号查看
1130 0
《认知设计:提升学习体验的艺术》——技能 vs 知识
本节书摘来自华章社区《认知设计:提升学习体验的艺术》一书中的技能 vs 知识,作者:(美)Julie Dirksen,更多章节内容可以访问云栖社区“华章社区”公众号查看
1622 0