首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >站在软件工程的角度重新思考面向对象(含高清图谱)

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

作者头像
手撕代码八百里
发布2020-07-28 23:13:20
2900
发布2020-07-28 23:13:20
举报
文章被收录于专栏:猿计划猿计划

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

文章目录

  • 站在软件工程的角度重新思考面向对象
  • 一、代码说事
    • (一)也许你见过Java的下面的这样的代码
    • (二)也许你见过Python的下面的代码
    • (三)也许你见过JS的这种代码
    • (四)也许你见过C++这样的代码
  • 二、软件工程见真知
    • (一)闲扯
    • (二)面向对象方法的基本思想
    • (四)软件工程学家发话了
    • (五)知识点总结图谱
      • 1、对象
      • 2、类
      • 3、消息
      • 4、封装
      • 5、继承
      • 6、多态性
    • (六)对象之间的联系
      • 1、分类结构
      • 2、组成结构
      • 3、实例连接
      • 4、消息连接
  • 三、补充:面向对象的软件工程方法

一、代码说事

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

如果对你有帮助,可以分享给你身边的朋友。 水平有限,难免会有疏漏或者书写不合理的地方,欢迎交流讨论。 作者:TrueDei

如果喜欢我的文章,还没看够可以关注我,我会用心写好每一篇文章。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-05-27 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 站在软件工程的角度重新思考面向对象
    • 文章目录
    • 一、代码说事
      • (一)也许你见过Java的下面的这样的代码
        • (二)也许你见过Python的下面的代码
          • (三)也许你见过JS的这种代码
            • (四)也许你见过C++这样的代码
            • 二、软件工程见真知
              • (一)闲扯
                • (二)面向对象方法的基本思想
                  • (四)软件工程学家发话了
                    • (五)知识点总结图谱
                      • 1、对象
                      • 2、类
                      • 3、消息
                      • 4、封装
                      • 5、继承
                      • 6、多态性
                    • (六)对象之间的联系
                      • 1、分类结构
                      • 2、组成结构
                      • 3、实例连接
                      • 4、消息连接
                  • 三、补充:面向对象的软件工程方法
                  相关产品与服务
                  数据保险箱
                  数据保险箱(Cloud Data Coffer Service,CDCS)为您提供更高安全系数的企业核心数据存储服务。您可以通过自定义过期天数的方法删除数据,避免误删带来的损害,还可以将数据跨地域存储,防止一些不可抗因素导致的数据丢失。数据保险箱支持通过控制台、API 等多样化方式快速简单接入,实现海量数据的存储管理。您可以使用数据保险箱对文件数据进行上传、下载,最终实现数据的安全存储和提取。
                  领券
                  问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档