当前位置: 首页 > news >正文

面向对象编程的艺术:构建高效可扩展的软件

在这里插入图片描述

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6
🍨 阿珊和她的猫_CSDN个人主页
🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》
🍚 蓝桥云课签约作者、已在蓝桥云课上架的前后端实战课程《Vue.js 和 Egg.js 开发企业级健康管理项目》、《带你从入门到实战全面掌握 uni-app》

文章目录

  • 一、引言
    • 面向对象编程的定义和背景
    • 面向对象编程与其他编程范式的区别
  • 二、面向对象编程的核心概念
    • 对象和类
    • 封装、继承和多态
  • 三、面向对象编程的优势和注意事项
    • 优势
    • 注意事项

一、引言

面向对象编程的定义和背景

面向对象编程(Object-Oriented Programming,OOP)是一种编程范式,它将数据和操作这些数据的代码封装在一起,形成一个对象。对象是一个包含数据和操作这些数据的函数的实体

OOP 的核心概念包括对象、类、封装、继承和多态

  • 对象是一个包含数据和操作这些数据的函数的实体。
  • 类是一个模板,用于创建具有相同属性和方法的对象。
  • 封装是将数据和操作这些数据的函数封装在一起,以保护数据的隐私。
  • 继承是从一个类继承属性和方法,并将其应用于另一个类。
  • 多态是指不同的对象可以对相同的消息做出不同的响应。
    在这里插入图片描述

OOP 起源于 20 世纪 60 年代的计算机科学研究,当时研究人员开始意识到传统的编程方式存在一些问题。传统的编程方式通常将数据和操作这些数据的代码分开,这使得代码难以维护和扩展。OOP 的出现解决了这些问题,因为它将数据和操作这些数据的代码封装在一起,形成一个对象。这种封装使得代码更加模块化,易于维护和扩展。

OOP 已经成为现代编程中的一种主流编程范式,被广泛应用于各种编程语言,如 Java、Python、C++ 等。它的优点包括代码重用性高、易于维护和扩展、代码更加清晰和易于理解等。

面向对象编程与其他编程范式的区别

编程范式面向对象编程(OOP)过程式编程函数式编程
数据和操作的组织方式数据和操作被封装在对象中数据和操作是分开的,通过函数调用进行交互数据和操作通过函数进行处理
数据封装支持不支持支持
继承和多态支持不支持不支持
代码复用通过对象和类实现通过函数和模块实现通过函数和高阶函数实现
代码可维护性较好较好较好

需要注意的是,这些编程范式并不是互斥的,它们可以在同一项目中结合使用。选择哪种编程范式取决于项目的需求和目标。

二、面向对象编程的核心概念

对象和类

对象和类是面向对象编程(Object-Oriented Programming,OOP)中的两个重要概念。

  • 对象是一个包含数据和操作这些数据的函数的实体。它是类的实例,可以被创建、修改和销毁。对象具有属性和方法,属性是对象的数据,方法是对象的操作。例如,在一个学生管理系统中,学生可以被视为一个对象,它具有姓名、年龄、性别等属性,以及注册、选课、查询成绩等方法。
  • 类是一个模板,用于创建具有相同属性和方法的对象。类定义了对象的结构和行为,它包含了对象的属性和方法的声明。类可以被继承和扩展,以创建具有更复杂行为的对象。例如,在学生管理系统中,可以定义一个学生类,它包含了学生的属性和方法的声明。然后,可以通过创建学生类的实例来创建具体的学生对象。

类和对象之间的关系类似于蓝图和实际产品之间的关系。类定义了对象的结构和行为,而对象是类的实例,它具有类中定义的属性和方法。通过创建类的实例,可以创建具有相同结构和行为的多个对象,从而提高代码的复用性和可维护性。

以下是一个简单的 JavaScript 代码示例,展示了如何创建对象和类:

// 创建一个学生对象
var student = {name: "John",age: 18,gender: "Male"
};// 打印学生对象的信息
console.log(student.name + " is " + student.age + " years old and is " + student.gender);// 创建一个学生类
function Student(name, age, gender) {this.name = name;this.age = age;this.gender = gender;
}// 创建一个学生类的实例
var student1 = new Student("Alice", 16, "Female");// 打印学生类实例的信息
console.log(student1.name + " is " + student1.age + " years old and is " + student1.gender);

在上面的示例中,我们首先创建了一个名为 student 的对象,其中包含了学生的姓名、年龄和性别信息。然后,我们使用 console.log 函数打印了学生对象的信息。

接下来,我们创建了一个名为 Student 的类,该类包含了三个属性:nameagegender。我们使用 new 关键字创建了一个 Student 类的实例 student1,并为其属性赋值。最后,我们使用 console.log 函数打印了学生类实例的信息。

封装、继承和多态

封装、继承和多态是面向对象编程(OOP)的三个重要特性,它们可以帮助我们构建更加灵活、可扩展和可维护的代码。

  • 封装(Encapsulation)是指将对象的属性和方法封装在一起,形成一个独立的单元。对象的内部细节对外部世界是隐藏的,只能通过对象的公共接口(属性和方法)来访问对象的内部状态。封装可以保护对象的内部状态不受外部干扰,提高代码的安全性和可靠性。
  • 继承(Inheritance)是指一个类可以从另一个类或多个类中继承属性和方法。继承可以提高代码的复用性,减少代码的重复编写。子类可以继承父类的属性和方法,并可以根据需要进行扩展和修改。
  • 多态(Polymorphism)是指不同的对象可以对同一消息做出不同的响应。多态可以提高代码的灵活性和可扩展性。在面向对象编程中,多态通常通过继承和方法重载来实现。

下面是一个简单的 JavaScript 代码示例,展示了封装、继承和多态的使用:

// 创建一个父类 Person
function Person(name, age) {this.name = name;this.age = age;
}// 创建一个子类 Student,继承自 Person
function Student(name, age, major) {Person.call(this, name, age);this.major = major;
}// 继承 Person 的属性和方法
Student.prototype = Object.create(Person.prototype);
Student.prototype.constructor = Student;// 重写 Person 的方法
Student.prototype.introduce = function() {return "我是" + this.name + ",今年" + this.age + "岁,我的专业是" + this.major;
};// 创建两个子类的实例
var student1 = new Student("Alice", 18, "计算机科学");
var student2 = new Student("Bob", 20, "物理学");// 打印子类实例的信息
console.log(student1.introduce()); // 输出:我是Alice,今年18岁,我的专业是计算机科学
console.log(student2.introduce()); // 输出:我是Bob,今年20岁,我的专业是物理学

在上面的示例中,我们创建了一个名为 Person 的父类和一个名为 Student 的子类。子类 Student 继承了父类 Person 的属性和方法,并通过 Person.call 方法将父类的构造函数应用于子类的实例。然后,我们使用 Object.create 方法创建了一个新的 Student 原型对象,并将其赋值给 Student.prototype,以实现继承。

接下来,我们重写了父类的 introduce 方法,使其能够根据子类的实例属性返回不同的介绍信息。最后,我们创建了两个子类的实例 student1student2,并调用它们的 introduce 方法来打印介绍信息。

通过这个示例,我们可以看到封装、继承和多态的使用。封装通过将对象的属性和方法封装在一起,保护了对象的内部状态。继承通过子类继承父类的属性和方法,实现了代码的复用。多态通过不同的对象对同一消息做出不同的响应,提高了代码的灵活性和可扩展性。

三、面向对象编程的优势和注意事项

优势

  • 代码复用
  • 可维护性
  • 扩展性
    在这里插入图片描述

注意事项

  • 对象设计的复杂性
  • 性能考虑
  • 代码可读性

在这里插入图片描述

相关文章:

  • java基于Spring Boot+vue的民宿客房租赁预订系统的设计与实现含源码数据库
  • LangChain的函数,工具和代理(三):LangChain中轻松实现OpenAI函数调用
  • 深度学习中的注意力机制:原理、应用与实践
  • CentOS系统环境搭建(二十二)——Git进阶
  • 爬虫从入门到精通(21) |字体加密通杀方案
  • Qt实现图片旋转的几种方式(全)
  • 快速了解ChatGPT(大语言模型)
  • 从PDF和图像中提取文本,以供大型语言模型使用
  • avue页面布局 api 引用
  • 二叉树展开为链表的三种写法
  • 系统部署安装-Centos7-Kafka
  • mysql数据库如何处理多线程并发修改
  • Java-- 日期的运算
  • 解决 Idea 下 Tomcat 乱码 问题
  • 电商店铺搬家API接口,轻松搬运淘宝1688京东拼多多等平台全站商品丨商品详情业数据接口丨搜索商品列表数据接口
  • [nginx文档翻译系列] 控制nginx
  • 《Javascript高级程序设计 (第三版)》第五章 引用类型
  • 30秒的PHP代码片段(1)数组 - Array
  • Android路由框架AnnoRouter:使用Java接口来定义路由跳转
  • canvas绘制圆角头像
  • Hibernate最全面试题
  • HTML5新特性总结
  • java架构面试锦集:开源框架+并发+数据结构+大企必备面试题
  • KMP算法及优化
  • niucms就是以城市为分割单位,在上面 小区/乡村/同城论坛+58+团购
  • nodejs:开发并发布一个nodejs包
  • spark本地环境的搭建到运行第一个spark程序
  • Webpack入门之遇到的那些坑,系列示例Demo
  • 编写符合Python风格的对象
  • 后端_ThinkPHP5
  • 警报:线上事故之CountDownLatch的威力
  • 开源中国专访:Chameleon原理首发,其它跨多端统一框架都是假的?
  • 吐槽Javascript系列二:数组中的splice和slice方法
  • 无服务器化是企业 IT 架构的未来吗?
  • 学习HTTP相关知识笔记
  • 主流的CSS水平和垂直居中技术大全
  • 好程序员web前端教程分享CSS不同元素margin的计算 ...
  • #[Composer学习笔记]Part1:安装composer并通过composer创建一个项目
  • $().each和$.each的区别
  • ()、[]、{}、(())、[[]]命令替换
  • (2)STL算法之元素计数
  • (C++17) optional的使用
  • (floyd+补集) poj 3275
  • (翻译)terry crowley: 写给程序员
  • (更新)A股上市公司华证ESG评级得分稳健性校验ESG得分年均值中位数(2009-2023年.12)
  • (实战)静默dbca安装创建数据库 --参数说明+举例
  • (学习日记)2024.01.09
  • (转)c++ std::pair 与 std::make
  • (转)淘淘商城系列——使用Spring来管理Redis单机版和集群版
  • ****** 二 ******、软设笔记【数据结构】-KMP算法、树、二叉树
  • *2 echo、printf、mkdir命令的应用
  • .NET Framework 服务实现监控可观测性最佳实践
  • .NET MVC第三章、三种传值方式
  • .net 获取url的方法
  • .NET/C# 利用 Walterlv.WeakEvents 高性能地中转一个自定义的弱事件(可让任意 CLR 事件成为弱事件)