当前位置: 首页 > 编程日记 > 正文

面向对象方法综述(工具<方法<思维<价值观)

在这里插入图片描述
思想起源于上世纪六十年代(和结构化方法一样)
最早的OOPL:Simula67
最纯的OOPL:Smalltalk

smalltalk的贡献:它在系统设计中强调对象概念的统一,引入对象,对象类,方法,实例等概念和术语,采用动态联编和单继承机制。此外,还引入虚拟机(Java的基础);提出了MVC架构;在用户图形界面方面发挥了重要作用。

Alan Kay的名言:预测将来最好的办法就是发明。

面向对象方法没结构化方法发展地那么快,上世纪九十年代才开始流行。

可以从以下4个方面理解:
指导思想:尽可能模拟人类习惯的思维方式(类,继承)就是使软件解空间和现实世界的问题空间保持对应关系。

基本原则:
对象是类的实例,类是将和数据和数据有关操作封装在一起,这是一种局部化,使得维护,复用更加高效,其次通过类成员的访问限制,使得类的使用和实现分离。如果程序设计语言只提供对象和消息通信,它就只是基于对象而不是面向对象。继承是面向对象的重要特征,反映了类之间普遍和特殊的关系,是面向对象实现重用的重要手段之一。极大增加了代码复用的可能性。复用不是调用,调用是全有或全无。继承分为单重继承和多重继承,单重继承每一个子类只有一个父类(Java),多重继承……(c++,python)。继承增加了类之间的耦合性,也就增加了程序的复杂性,因为每一次继承都可能部分重用已有类的成员,继承得越深,子类就越难以理解。所以继承的问题就是增加了程序的耦合性。消息就是对象发送的服务请求,发送消息的对象称为发送者,接收消息并执行指令的对象称为接收者。对象接受到消息才能执行,完成消息指定的服务。由此,对象模型是网状的,不是层次的。消息通信还挺复杂的,同一对象可以接受不同形式的消息,从而产生不同响应(这个对象可以提供很多不同服务);相同形式的消息可以发送给不同对象,产生不同响应(多态性)。使用多态性有三个方面的好处:1.消息发送者不需考虑消息不同。2.增加了消息的可扩展性,如果要新的响应,可将消息发送给不同的对象,增加新的子类,将消息发送给该子类的对象即可。无需修改消息发送者的代码。3.分离实现者和使用者,使得程序更加灵活。最简单的多态是重载,有运算符重载,和函数重载。运算符重载:对已有的运算赋予新的含义,使同一运算符作用于不同的类型时产生不同行为。同一作用域类形参不同(顺序,个数)但函数名相同,称为函数重载。编译器可根据形参实参类型个数等进行匹配。多态性使得程序用以扩展,如有新的数据需要新的处理,简单地追加一个子类,不影响已有的。程序根据数据不同,自动地选择合适的处理方法。对象和消息通信,反映了事物和事物间的联系。类和继承反映了人类的思维方式。

方法论:系统是由一些对象的相互联系,相互作用而形成。同样是成绩管理系统,用OOP看,是由老师,学生等一系列对象相互联系和作用形成的。

UML现在是面向对象技术的标准建模语言。
在这里插入图片描述
与以功能为核心的结构化方法相比,面向对象具有以下优势——

1.对象在现实世界客观存在,比功能更容易理解,计算机上的解空间和现实中的问题空间一致
2.功能带有主观性,不同的人看来不一样,变化频繁
3.面向对象中的概念和表示符号不仅适用于分析阶段,而且设计阶段也用这些符号
4.面向对象分析和设计均使用同意模型,不像结构化方法使用不同模型,分析和设计之间没有鸿沟,设计之后回过头来还可对这个模型进行扩充,对于需求变化或模糊的情况容易处理。(反映了面向对象方法适合于迭代增量式的软件开发)
5.继承机制的存在
在这里插入图片描述
不足——
1.一个功能的完成往往需要若干类共同完成
2.增加了复杂性,耦合性,降低了可维护性
3.数学基础薄弱,导致不能正确设计,繁杂而充满不确定性
4.复杂在哪:通过消息通信,网状结构无法逐步分解(适合迭代增量式地开发)把类封装好往往很麻烦

要真正体会面向对象的优秀,还是有难度的。此外,面向对象的多态性要用得好很麻烦。

Why OO Sucks(网址见图)

相关文章:

第二章例2-2

#include<stdio.h>int main(void){ printf("Programming is fun.\n"); printf("And programming in C is even morn fun!\n"); return 0;}转载于:https://www.cnblogs.com/jiangjiali/p/3352576.html

【组队学习】十二月微信图文索引

十二月微信图文索引 一、组队学习相关 周报&#xff1a; Datawhale组队学习周报&#xff08;第042周&#xff09;Datawhale组队学习周报&#xff08;第043周&#xff09;Datawhale组队学习周报&#xff08;第044周&#xff09;Datawhale组队学习周报&#xff08;第045周&…

shell编程--case判断

case基础语法&#xff1a;格式 case 变量名 invalue1)command;;value2)command;;*)commond;;esac在case程序中&#xff0c;可以在条件中使用|&#xff0c;表示或的意思&#xff0c; 比如 2|3)command;;脚本 [rootlynn-04 shell]# vim case.sh#!/bin/bash read -p "Ple…

【delphi】Byte数组与String类型的转换

string string AnsiString 长字符串&#xff0c;理论上长度不受限制&#xff0c;但其实受限于最大寻址范围2的32次方4G字节&#xff1b; 变量Str名字是一个指针&#xff0c;指向位于堆内存的字符序列&#xff0c;字符序列起始于Str[1]&#xff0c;Str[1]偏移负16个字节的空间…

VC解析XML--使用CMarkup类解析XML

经过今天尝试MFC解析XML串&#xff0c;也算有了不少收获&#xff0c;总结一下。 我是使用的CMarkup类对XML进行操作。 CMarkup好象都是先从一个xml文件里面把内容读出来&#xff0c;再进行解析&#xff0c;搞得我恨不得要把我的CString写到xml文件…

Spring原理总结

写在前面&#xff1a;技术常新&#xff0c;思想常存。 Spring全家桶过于庞大&#xff0c;学习时难以抓住重点&#xff0c;希望通过此文章&#xff0c;让大家更好地去学习这一框架技术。 Spring有两大内功&#xff1a;IoC容器和AOP。这两个东西是不管什么时候都不会改变的。即便…

尚国栋:金融风控贷款违约预测(天池学习赛)

尚国栋是华北电力大学数理系大三的学生&#xff0c;LSGO软件技术团队&#xff08;Dreamtech算法组&#xff09;成员&#xff0c;参加了多期Datawhale的组队学习&#xff0c;荣获多期优秀队长的称号。 希望参与我们线下组队学习的同学&#xff0c;可以在微信公众号后台回复 线下…

树莓派修改密码(有单独屏幕)

在树莓派终端输入 sudo passwd pi改的是派的密码。 注意&#xff1a;和 sudo passwd root区分 Linux有密码保护&#xff0c;输入了看上去和没输入一样&#xff0c;其实已经输入了

Python每日一练0023

问题 如何判断一个文件是否存在 解决方案 这个问题可以分成几类问题 如果这里的文件指的是文件或目录&#xff0c;我们可以用os.path.exists()方法 >>> import os >>> os.path.exists(test) True 如果这里的文件指的是普通的文件&#xff0c;我们可以用os.pa…

火狐拓展开发 基础知识

平时经常碰到一些零碎的知识&#xff0c;或者其他什么好文章/知识点/插件/库等等&#xff0c;因为实在太多书签已插乱...于是想着干脆写个火狐小add-on。 首先找到了这里ADD-ON SDK&#xff1a; Using the Add-on SDK you can create Firefox add-ons using standard Web techn…

尚育鹏:Leetcode刷题总结(数组)

尚育鹏是华北电力大学数理系大二的学生&#xff0c;LSGO软件技术团队&#xff08;Dreamtech算法组&#xff09;成员&#xff0c;参加了多期Datawhale的组队学习。 希望参与我们线下组队学习的同学&#xff0c;可以在微信公众号后台回复 线下组队学习&#xff0c;进入线下组队学…

树莓派实现人脸识别需要做的那些事

1.连接数据库&#xff0c;建表&#xff0c;用来存放图像转码后的字符 2.用Pycharm连接上树莓派 3.下载安装face_recognition需要的依赖 4.配置好环境后运行代码

spring boot 实战 / 可执行war启动参数详解

概述 上一篇文章《spring boot 实战 / mvn spring-boot:run 参数详解》主要讲解了spring boot 项目基于maven插件启动过程中借助profiles的切换工作环境的问题。  这里我们讲一下spring boot项目基于可执行war包启动过程中借助profiles切换工作环境的问题。 配置 这里我们修改…

1476. Lunar Code

http://acm.timus.ru/problem.aspx?space1&num1476 由于前一列对后一列有影响&#xff0c;所以需要保持前一列的状态&#xff0c; 但无需用状态压缩来保存&#xff08;也保存不了&#xff09; 只需要保存前一列以 k 个0结尾的个数就可以 代码&#xff1a; import java.mat…

【组队学习】【33期】吃瓜教程——西瓜书+南瓜书

吃瓜教程——西瓜书南瓜书 航路开辟者&#xff1a;谢文睿、秦州领航员&#xff1a;潘磊航海士&#xff1a;谢文睿、秦州 基本信息 开源内容&#xff1a;https://github.com/datawhalechina/pumpkin-bookB 站视频&#xff1a;https://www.bilibili.com/video/BV1Mh411e7VU内容…

FIRST集与FOLLOW集构造步骤

首先&#xff0c;这两个集主语是候选式&#xff0c;是V*中的一个终结符/非终结符。 由于FOLLOW集的定义和构造步骤里面都涉及FIRST集&#xff0c;故先介绍FIRST集。 一.FIRST集的定义如下&#xff1a; FIRST(α){a|α>aβ, a∈Vt, α, β∈V*},若α>(*)ε则规定ε∈FRIS…

Bossie Awards 2013:最佳开源数据中心和云软件

当Facebook 的开源计算项目&#xff08;OCP&#xff09;酝酿着设计更好的服务器和网络时&#xff0c;其他开源项目也纷纷重塑数据库&#xff0c;应用平台以及下一代应用程序的虚拟化层。你还不知道吧&#xff0c;下一代的“云”基础设施管理工具终将来自开源产品。 近日&#x…

Laravel开启跨域的方法

1、建立中间件Cors.php 命令&#xff1a;php artisan make:middleware Cors 在/app/Http/Middleware/ 目录下会出现一个Cors.php 文件。 内容如下&#xff1a; <?phpnamespace App\Http\Middleware;use Closure;class Cors {/*** Handle an incoming request.** param \Il…

【组队学习】【33期】动手学数据分析

动手学数据分析 航路开辟者&#xff1a;陈安东、金娟娟、杨佳达、老表、李玲、张文涛、高立业领航员&#xff1a;张文恺航海士&#xff1a;武帅、戴治旭、初晓宇 基本信息 内容属性&#xff1a;精品入门课系列开源内容&#xff1a;https://github.com/datawhalechina/hands-…

LL(1)预测分析表的构造

LL(1)分析法&#xff08;即预测分析法&#xff09;是自上而下文法中的一种&#xff0c;使用这种方法需要用到LL(1)预测分析表。 前提&#xff1a;掌握了FIRST集和FOLLOW集的构造。 步骤&#xff1a;对于每一个产生式A→α &#xff08;1&#xff09; 对每个终结符a∈FIRST(α)…

新的sublime text已经上传网盘,地址写在下面

注&#xff1a;新网盘地址&#xff0c;之前的关于sublime text的网盘地址已效 网盘地址&#xff1a;http://pan.baidu.com/s/1oVHAm 压缩文件结构 从上到下依次是&#xff1a; 1.sublime text3 32bit便携版本的压缩包&#xff0c;解压可用. 64bit的用户可以将&#xff1a;http:…

WebAssembly Studio:Mozilla提供的WASM工具

\看新闻很累&#xff1f;看技术新闻更累&#xff1f;试试下载InfoQ手机客户端&#xff0c;每天上下班路上听新闻&#xff0c;有趣还有料&#xff01;\\\WebAssembly Studio是Mozilla开发的一款在线工具&#xff0c;用于将C/C和Rust代码编译为WASM格式。\\WebAssembly Studio是M…

【组队学习】【33期】3. 李宏毅机器学习(含深度学习)

李宏毅机器学习&#xff08;含深度学习&#xff09; 航路开辟者&#xff1a;王茂霖、陈安东&#xff0c;刘峥嵘&#xff0c;李玲领航员&#xff1a;宋泽山航海士&#xff1a;汪健麟、叶梁 基本信息 开源内容&#xff1a;https://github.com/datawhalechina/leeml-notes开源内…

Linux 引导和系统启动

bootstrap 引导程序;鞋带 -> 简称 boot 启动 pull oneself up by one’s bootstraps.&#xff08;体现计算机系统启动的难处&#xff09; Linux系统启动分为两大部分&#xff1a; 一&#xff0e; 第一部分&#xff1a;机器启动&#xff08;BIOS到 加载内核 &#xff0c;…

【数据结构】支持四则混合运算的计算器(转)

1.给出两个数&#xff0c;用户再指定操作符&#xff0c;要求计算结果&#xff0c;这实现起来很容易&#xff1b; 2.多个数&#xff0c;但只涉及同一优先级的操作符&#xff0c;做起来也很容易&#xff1b; 3.多个数&#xff0c;不同优先级的操作符&#xff0c;怎么办呢&#xf…

TypeScript学习笔记之 接口(Interface)

在java中&#xff0c;接口是用来定义一些规范&#xff0c;使用这些接口&#xff0c;就必须实现接口中的方法&#xff0c;而且接口中的属性必须是常量。javascript中是没有接口的概念的。所以TypeScript在编译成 JavaScript 的时候&#xff0c;所有的接口都会被擦除掉。 而TypeS…

【组队学习】【33期】数据可视化(Matplotlib)

数据可视化&#xff08;Matplotlib&#xff09; 航路开辟者&#xff1a;杨剑砺、杨煜、耿远昊、李运佳、居凤霞领航员&#xff1a;王森航海士&#xff1a;肖明远、郭棉昇 基本信息 开源内容&#xff1a;https://github.com/datawhalechina/fantastic-matplotlib开源内容&…

布尔定理及证明(完整版)

这篇文章的目的是以布尔代数公理证明定理。 对偶原理&#xff1a;0with1, with 互换以后&#xff0c;公理&#xff08;定理&#xff09;任然成立。 布尔代数的公理如下 单变量的布尔代数定理如下 单变量的布尔代数定理很容易用真值表证明。 多变量的布尔定理如下 交换律&…

创建DLL动态链接库——声明导出法

DLL声明导出法&#xff1a;是通过使用__declspec(dllexport)&#xff0c;添加到需要导出的函数前&#xff0c;进行声明。 头文件定义如下(OPdll.h)&#xff1a; 源文件定义如下(OPdll.cpp)&#xff1a; 通过以上两个文件&#xff0c;编译过后即可生成OPdll.lib和OPdll.dll两个库…

【组队学习】【33期】Scratch(一级)

Scratch一级 航路开辟者&#xff1a;王思齐、马燕鹏领航员&#xff1a;马燕鹏航海士&#xff1a;马燕鹏 基本信息 开源内容&#xff1a;https://github.com/datawhalechina/team-learning-program/tree/master/Scratch内容属性&#xff1a;公测课程内容说明&#xff1a;抽取…