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

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

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


一、代码说事

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


目录
相关文章
|
2月前
|
测试技术 UED 开发者
软件测试的艺术:从代码审查到用户反馈的全景探索在软件开发的宇宙中,测试是那颗确保星系正常运转的暗物质。它或许不总是站在聚光灯下,但无疑是支撑整个系统稳定性与可靠性的基石。《软件测试的艺术:从代码审查到用户反馈的全景探索》一文,旨在揭开软件测试这一神秘面纱,通过深入浅出的方式,引领读者穿梭于测试的各个环节,从细微处着眼,至宏观视角俯瞰,全方位解析如何打造无懈可击的软件产品。
本文以“软件测试的艺术”为核心,创新性地将技术深度与通俗易懂的语言风格相结合,绘制了一幅从代码审查到用户反馈全过程的测试蓝图。不同于常规摘要的枯燥概述,这里更像是一段旅程的预告片,承诺带领读者经历一场从微观世界到宏观视野的探索之旅,揭示每一个测试环节背后的哲学与实践智慧,让即便是非专业人士也能领略到软件测试的魅力所在,并从中获取实用的启示。
|
SQL 监控 数据可视化
数据之美 - 为你揭秘数据体验技术
数据体验技术团队从一开始建立就致力于打造数据领域体验技术的标杆。经过多年的深耕,形成了一整套面向两个阶段的用户产品的体验技术架构。
数据之美 - 为你揭秘数据体验技术
|
数据挖掘
产品经理第九章:用户需求分析
用户的需求多种多样,如何分析出更合理的需求呢?是不是每一个用户提出的需求都要一一满足呢?这一章里可以解答这些问题。 首先,要获取用户的需求,获取需求有以下几种方式: 1、主动收集用户反馈; 2、做最挑剔的用户; 3、开展系统的调研; 4、让数据替用户说话。
1240 0
《认知设计:提升学习体验的艺术》——沟通学习目标
本节书摘来自华章社区《认知设计:提升学习体验的艺术》一书中的沟通学习目标,作者:(美)Julie Dirksen,更多章节内容可以访问云栖社区“华章社区”公众号查看
1337 0
《认知设计:提升学习体验的艺术》——确定目标
本节书摘来自华章社区《认知设计:提升学习体验的艺术》一书中的确定目标,作者:(美)Julie Dirksen,更多章节内容可以访问云栖社区“华章社区”公众号查看
1247 0
《认知设计:提升学习体验的艺术》——第三章小结
本节书摘来自华章社区《认知设计:提升学习体验的艺术》一书中的第三章小结,作者:(美)Julie Dirksen,更多章节内容可以访问云栖社区“华章社区”公众号查看
1182 0
《认知设计:提升学习体验的艺术》——以学习者为中心
本节书摘来自华章社区《认知设计:提升学习体验的艺术》一书中的以学习者为中心,作者:(美)Julie Dirksen,更多章节内容可以访问云栖社区“华章社区”公众号查看
1552 0
《认知设计:提升学习体验的艺术》——什么是速度分层
本节书摘来自华章社区《认知设计:提升学习体验的艺术》一书中的什么是速度分层,作者:(美)Julie Dirksen,更多章节内容可以访问云栖社区“华章社区”公众号查看
892 0
《认知设计:提升学习体验的艺术》——如何面对不同的学习风格
本节书摘来自华章社区《认知设计:提升学习体验的艺术》一书中的如何面对不同的学习风格,作者:(美)Julie Dirksen,更多章节内容可以访问云栖社区“华章社区”公众号查看
989 0
下一篇
无影云桌面