设计模式学习笔记 - 面向对象 - 1.面向对象到底讨论的是什么

1.到底什么是面向对象编程和面向对象编程语言?

面向对象编程(OOP)的全称是 Object Oriented Programming
面向对象编程语言(OOPL)的全称是 Object Oriented Programming Language

面向对象编程中有两个非常重要的概念,就是类(Class)和对象(Object)。面向对象编程这个概念第一次使用是在SmallTalk 这种编程语言中,它也被认为是第一个真正意义上的面向对象编程语言。后来C++带动了面向对象编程的流程。到今天,如果不按照严格的定义来说,大部分编程语言都是面向对象编程语言,比如JavaC++GoPythonJavaScript等等。

那么到底什么是面向对象编程?什么语言才算是面向对象编程语言呢?

  • 面向对象编程是一种编程范式或编程风格。它以类或对象作为组织代码的基本单元,并将封装、抽象、继承、多态四个特性,作为代码设计和实现的基石。
  • 面向对象编程语言是支持类或对象的语法机制,能方便地实现面向对象编程四大特性(封装、抽象、继承、多态)的编程语言。

一般来说,面向对象编程都是通过面向对象编程语言来进行的,但是,不用面向对象编程语言也可以进行面向对象编程。反之,即使我们使用面向对象编程语言,写出来的代码也不一定是面向对象编程风格的,也有可能是面向过程编程风格的。

2.如何判定某编程语言是否是面向对象编程语言?

在上面刚刚的讲解中,提到“如果不按照严格的定义来说,大部分编程语言都是面向对象编程语言”。为什么要加上“如果不按照严格的定义”这个前提呢?

这是因为如果严格按照面向编程语言的定义,前面提到的有些编程语言并不是严格意义上的面向对象编程语言。比如 JavaScript,它不支持封装和继承特性。

实际上,面向对象编程从字面上,按照最简单、最原始的方式来理解,就是将类或对象最为代码组织的基本单元,来进行编码的一种编程范式或者编程风格,并不一定需要封装、抽象、继承、多态这四大特性的支持。但是,在进行面向对象编程的过程中,人们不停地总结发现,有了这四大特性,我们就能更容易地实现各种面向对象的代码设计思路。

例如,在面向对象编程的过程中,经常会遇到 is-a 这种类关系(比如狗是一种动物),而继承这个特性就能很好的支持这种 is-a 的代码设计思路,并且解决代码复用的问题。但是随着编程语言的不断迭代、演进,人们发现继承这种特性容易造成层次不清、代码混乱,所以很多编程语言在设计时就摒弃了继承特性,比如 Go。但是,我们不能因为它摒弃了继承特性,就一刀切地认为它不是面向对象编程语言了。

个人觉得,只要某种编程语言支持类或对象的语法概念,并且以此作为组织代码的基本单元,那就可以被粗略地认为它就是要面向对象编程语言了,至于是否完全地支持了面向对象编程的四大特性、是否对四大特性有所取舍,可以不作为判定的标准。基于此,才有了前面的说法:“不按照严格定义来说,现在流行的大部分编程语言都是面向对象编程语言。但是按照严格的定义,很多语言都不能算得上面向对象编程语言”。

3.什么是面向对象分析和面向对象设计?

和面向对象编程经常放到一起讲的,还有面向对象分析(OOA)和面向对象设计(OOD)。OOAOODOOP 三个连在一起就是面向对象分析、设计、编程(实现),正好是面向对象软件开发要经历的三个阶段。

面向对象分析和面向对象设计中的“分析”和“设计”这两个词,完全可以从字面上去理解,不需要过度解读。之所以在前面加上“面向对象”这几个字,是因为我们是围绕着对象来做需求分析和设计的。分析和设计两个阶段的产出是类的设计,包括程序被拆解为哪些类,每个类有哪些属性方法,类与类之间如何交互等等。

面向对象分析就是 要搞清楚做什么,面向对象设计就是要搞清楚怎么做,面向对象编程就是将分析和设计的结果翻译成代码的过程。

4.什么是 UML?是否需要 UML?

降到面向对象分析、设计、编程,那就不得不提到 UML(Unified Model Language),统一建模语言。很多书籍中,常用它来画图表达面向对象或设计模式的设计思路。

实际上,UML 是一种非常复杂的东西。它不仅仅包含类图,还包括用例图、顺序图、活动图、状态图、组件图等等。即使使用类图的学习成本也是很高的,比如说类之间的关系,UML就定义了很多种,比如泛华、实现、关联、聚合、组合、依赖等。

要完全掌握,并且熟练运用这些类之间的关系,来画 UML 类图,肯定要花很多的学习经理,而且即使你按照 UML 画出类图,可对于不熟悉的人来说,看懂的成本还是很高的。

一般在互联网公司的项目开发中,UML 用处可能不大。为了文档化软件设计或者方便讨论软件设计,大部分情况下会画一个不是那么规范的草图,能够达意,方便沟通就够了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/692860.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第3.1章:StarRocks数据导入——Insert into 同步模式

一、概述 在StarRocks中,insert的语法和mysql等数据库的语法类似,并且每次insert into操作都是一次完整的导入事务。 主要的 insertInto 命令包含以下两种: insert into tbl select ...insert into tbl (col1, col2, ...) values (1, 2, ...…

利用ChatGPT提升工作效率

随着科技的飞速发展,人工智能逐渐成为我们生活的一部分。ChatGPT作为一种先进的自然语言处理技术,已经在各个领域取得了显著的成果。本文将探讨如何利用ChatGPT提升工作效率,让我们的生活变得更加便捷。 一、什么是ChatGPT? ChatG…

day02_java基础_变量_数据类型等

零、今日内容 1 HelloWorld程序 2 idea使用 3 变量 4 数据类型 5 String 一、复习 班规班纪。。。。。 安装jdk JDK 是开发工具 JRE 是运行代码 JDK包含JRE 配置环境变量 二、HelloWorld程序 前提:JDK已经安装配置完毕,有了这些环境就敲代码 代码…

WSL Arch使用及配置

下载、解压 ArchWSL # wsl配置 cat ~/.wslconfig [experimental] # 未生效可尝试修改为wsl2 autoMemoryReclaimdisabled # 可以在 gradual/dropcache/disabled 之间选择 networkingModemirrored dnsTunnelingtrue firewallfalse autoProxytrue sparseVhdtrue# wsl导入 cd D:\w…

Python进程创建方式

方法一 from multiprocessing import Process def worker_function(name): print(f"Worker {name} is working") if __name__ "__main__": # 创建进程实例 p1 Process(targetworker_function, args("Process 1",)) p2 Process(targetw…

Vue路由组件练习

Vue 路由组件练习 1. 演示效果 2. 代码分析 2.1. 安装 vue-router 命令:npm i vue-router 应用插件:Vue.use(VueRouter) 2.2. 创建路由文件 在 src 文件夹下,创建router文件夹,并在该文件夹创建index.js文件 2.3. 导入依赖…

普中51单片机学习(定时器和计数器)

定时器和计数器 51单片机有两组定时器/计数器,因为既可以定时,又可以计数,故称之为定时器/计数器。定时器/计数器和单片机的CPU是相互独立的。定时器/计数器工作的过程是自动完成的,不需要CPU的参与。51单片机中的定时器/计数器是…

<网络安全>《43 网络攻防专业课<第九课 - 跨站脚本攻击及防范>》

1 什么是XSS XSS(cross site script)或者说跨站脚本是一种Web应用程序的漏洞,恶意攻击者往Web页面里插入恶意Script代码,当用户浏览该页之时,嵌入其中Web里面的Script代码会被执行,从而达到恶意攻击用户的目的。 2 XSS脚本实例 …

城市智能交通指挥中心系统方案

二、方案设计 1.简介 公路治安卡口子系统实现对交通流信息的及时采集和各类嫌疑车辆的查控与处置,扼制并打击一些显见性违规违法行为。其主要功能包括:车辆图像记录、速度测定、车辆号牌识别、自动报警、数据检索、流量统计、图像存贮、数据传输和远程…

在前后端分离项目中如何设置统一返回格式

目录 一、步骤一 二、步骤二 在前后端分离的项目中,为了方便前后端交互,后端往往需要给前端返回固定的数据格式,但不同的实体类返回格式不同,所以在真实开发中,我们将所有API接口设置返回统一的格式。基本上包括的有…

【vue3】手动实现md在线编辑

1.背景 由于知识库的一些.md格式的文件的文件内容可能会有变动,如果频繁下载修改后,再进行上传,会让用户操作不方便,为此接入md在线编辑功能 2 md在线编辑具体实现 2.1 搭建项目 搭建项目下载和引入bytemd和fflate相关依赖&…

【深度优先搜索】【树】【状态压缩】2791. 树中可以形成回文的路径数

作者推荐 【深度优先搜索】【树】【有向图】【推荐】685. 冗余连接 II 本文涉及知识点 深度优先搜索 树 图论 状态压缩 LeetCode:2791. 树中可以形成回文的路径数 给你一棵 树(即,一个连通、无向且无环的图),根 节点为 0 &am…

lv15 I2C背景知识(裸机I2C、linux对I2C支持、MPU6050)4

一、I2C总线背景知识 SOC芯片平台的外设分为: 一级外设:外设控制器集成在SOC芯片内部 二级外设:外设控制器由另一块芯片负责,通过一些通讯总线与SOC芯片相连 Inter-Integrated Circuit: 字面意思是用于“集成电路之…

css实现悬浮卡片

结果展示 html代码 <!doctype html> <html lang"zh"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge,chrome1"> <meta name"viewport" content"…

Android Studio创建项目时gradle下载慢

先停止当前Sync&#xff0c;找到gradle-wrapper.properties文件&#xff0c;将distributionUrl修改为腾讯镜像源&#xff1a; distributionUrlhttps\://mirrors.cloud.tencent.com/gradle/gradle-6.5-bin.zip

Vue 使用 v-bind 动态绑定 CSS 样式

在 Vue3 中&#xff0c;可以通过 v-bind 动态绑定 CSS 样式。 语法格式&#xff1a; color: v-bind(数据); 基础使用&#xff1a; <template><h3 class"title">我是父组件</h3><button click"state !state">按钮</button&…

【Spring】IoC容器 控制反转 与 DI依赖注入 XML实现版本 第二期

文章目录 基于 XML 配置方式组件管理前置 准备项目一、 组件&#xff08;Bean&#xff09;信息声明配置&#xff08;IoC&#xff09;&#xff1a;1.1 基于无参构造1.2 基于静态 工厂方法实例化1.3 基于非静态 工厂方法实例化 二、 组件&#xff08;Bean&#xff09;依赖注入配置…

C++ bfs 的状态表示(六十二)【第九篇】

今天我们来学习一下bfs的复杂状态表示 1.bfs状态表示 无论是深度优先搜索还是广度优先搜索&#xff0c;搜索的过程均会建立一棵 搜索树&#xff0c;搜索树上的每一个结点都是一个 状态&#xff0c;而搜索的过程又可以看作是 状态的转移。 对于 BFS&#xff0c;搜索过程中产生…

计算机设计大赛 深度学习人体跌倒检测 -yolo 机器视觉 opencv python

0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; **基于深度学习的人体跌倒检测算法研究与实现 ** 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0c;学长非常推荐&#xff01; &#x1f947;学长这里给一个题目综合评分(每项满…

P6354 [COCI2007-2008#3] TAJNA

题目传送门 题目描述 使用一种加密算法。 设字符串的长度为 n&#xff0c;则构造一个矩阵&#xff0c;使得 rcn 且在 r≤c 的情况下使得 r 尽量大。 然后把给定的明文按照由上到下&#xff0c;从左到右的顺序填充这个 rc 的矩阵。 得到的密文就是把矩阵按照从左到右&#…