
结构化程序设计和面向对象的面向对象的三个基本特征: 五个基本原理: 图形设计中一些面向对象的聚集和耦合原理在面向对象设计中
首先,Scala作者Martin Odersky的原始话语:
In principle, the motivation for object-oriented programming is very simple:
all but the most trivial programs need some sort of structure.
The most straightforward way to do this is to put data and operations into
some form of containers. The great idea of object-oriented programming is to
make these containers fully general, so that they can contain operations
as well as data, and that they are themselves values that can be stored
in other containers, or passed as parameters to operations. Such containers are
called objects. Alan Kay, the inventor of Smalltalk, remarked that in this way
the simplest object has the same construction principle as a full computer:
it combines data with operations under a formalized interface. So objects have
a lot to do with language scalability: the same techniques apply to the construction
of small as well as large programs.
另一个非常NP(但非常生动)的图标:

众所周知,有三种主要的面向对象的思想: 封装,继承和多态.
但是面向对象是如何产生的,是什么导致他的?
很久以前,软件开发世界仍然一片混乱. 无论开发什么软件,都面临复杂性的问题. 代码中充满了goto语句,程序的流程随意跳跃. 当人们编写代码时,他们写的越多,对他们正在写的东西的了解就越少. 这时一个巨人出现了,它是结构化编程.
结构化编程的基本思想是:
有序地控制流程,即把程序的执行顺序限制为顺序、分支和循环这三种;
把共通的处理归结为例程(函数)。
结构化编程的好处是:
尽管结构化解决了程序控制流程的复杂问题,但程序不仅包括控制结构,还包括要处理的数据. 随着处理数据的增加,程序的复杂性也随之增加. 这时候,面向对象的编程就在这里!
“分别管理程序的处理内容和处理数据对象的复杂性”的问题是,为了获得正确的结果,必须保持处理和数据的一致性,这是非常困难的结构化编程中的解决方案是数据抽象技术.
数据抽象是数据和处理方法的组合. 这就是“对象”一词的来源. 面向对象的程序起了名字.
然后,根据抽象原理,当多个相同的事物出现时,应将它们组合在一起,即DRY原理(不要重复自己),这导致了类的概念.
根据执行适当处理(调用适当方法)的数据类型,它应该已经是用于编程语言的工具. 这是多态的介绍.

对于继承,大多数观点是“继承是程序结构和抽象的自然进化方式”. 结构化和抽象化意味着提取公共部分以生成父类的自底向上方法. (如果继承是以这种方式产生的,那么最初,具有多个父类的多重继承将成为主流,最初引入继承的Simula语言仅提供单个继承. Matsumoto表示,继承的初衷是逐步完善)
这是面向对象编程的起源.
结构化程序的概念首先是在过去的编程过程中无限次使用传输语句而提出的. 转移语句可以使程序的控制流被强制到程序的任何位置. 在传统流程图中,传递函数由“非常随机”流线描述. 如果这种转移发生在程序的多个位置,则程序流程将变得混乱,程序结构将变得混乱. 这样的程序难以理解和接受,并且容易出错. 特别是在实际软件产品的开发中,更加追求软件可读性和可修改性. 具有这种结构和样式的程序不允许出现. 例如: C,FORTRAN,PASCAL等.
结构化编程方法主要由以下三个逻辑结构组成:
顺序结构: 顺序结构是线性的,有序的结构,可按顺序执行每个语句模块. 循环结构: 循环结构重复执行一个或几个模块,直到满足特定条件为止. 选择结构: 选择结构是根据条件是否成立选择程序执行的方式.
使用结构化程序设计方法,程序结构清晰,易于阅读,测试,调试和修改. 由于每个模块执行一个功能,因此模块之间的连接较少,从而使编程比以前更容易,更可靠,并提高了可维护性. 每个模块都可以独立编译和测试.
面向对象的编程语言支持的对象具有三个鲜明的特征: 封装,继承和多态性. 而且Javascript并未明确区分类别和副本. 实际上,Javascript中的所有变量数据类型都是JS中的对象. JS支持总共4种对象: 内置对象,自定义对象,浏览器程序对象和ActiveX对象. 返回结果只是返回对象,以便可以在其他地方引用它,但这不是多余的对象.
因此,在面向过程的编程中: 程序=算法+数据结构(数据和数据类型). 数据结构和算法是分开的,因此在系统庞大之后,其控制,移植和重用就成为问题.
在面向对象程序设计中:
结构化编程从系统功能开始(某些用户也成为面向过程的设计). 根据工程标准和严格的规范,系统被分解为几个功能模块. 系统是实现模块集功能的过程.
面向对象的编程从要处理的数据开始,并以数据为中心而不是以服务(功能)为中心来描述系统. 他将编程问题视为数据的集合,并且数据比函数更稳定. 面向对象的编程是一种围绕实际概念组织模型的编程方法. 它使用对象来描述问题空间的实例.
封装是对象和类概念的主要特征. 封装,即将目标事物封装到抽象类中oop的概念,并且类只能由受信任的类或对象操作自己的数据和方法,并向不受信任的类或对象隐藏信息.
面向对象编程(OOP)语言的主要功能之一是“继承”. 继承是指使用现有类的所有功能并扩展这些功能而无需重写原始类的能力. 通过继承创建的新类称为“子类”或“派生类”,而继承的类称为“基类”,“父类”或“超类”. 继承的过程是从一般到特殊的过程.
继承可以通过“继承”和“组成”来实现. 在某些OOP语言中,子类可以继承多个基类. 但是通常情况下,一个子类只能有一个基类,要实现多重继承,就可以通过多重继承来实现.
继承概念分为三种: 实现继承,接口继承和可视继承.
实现继承是指使用基类的属性和方法而无需额外编码的能力;
接口继承是指仅使用属性和方法的名称、但是子类必须提供实现的能力;
可视继承是指子窗体(类)使用基窗体(类)的外观和实现代码的能力。

在考虑使用继承时,要注意的一件事是,两个类之间的关系应为“属属”关系. 例如,Employee是一个人,Manager是一个人,因此这两个类都可以继承Person类. 但是Leg类不能继承Person类,因为leg不是人.
抽象类仅定义将由子类创建的常规属性和方法. OO开发范式大致是: 将对象→抽象类→将类组织成分层结构(继承和综合)→使用类和实例的设计和实现几个阶段.
多态性(polymorphism)是一项允许您将父对象设置为其子对象中一个或多个子对象的技术. 分配后,父对象可以根据当前分配给它的子对象的特性而有所不同. 简而言之,这是一句话: 允许将子类类型的指针分配给超类类型的指针.
有两种方法可以实现多态: 覆盖和重载.
重写是指重新定义父类虚函数的子类.
重载意味着允许使用多个具有相同名称的功能,并且这些功能的参数表不同(也许参数数量不同,参数类型不同或两者都不同).
实际上,重载的概念不属于“面向对象编程”. 重载的实现方式是,编译器根据功能的不同参数列表修改同名功能的名称,然后这些同名功能变得不同. 函数(至少对于编译器而言). 例如,有两个具有相同名称的函数: function func(p: integer): integer;和函数func(p: string): integer;. 然后,编译器的修改后的函数名称可能如下所示: int_func,str_func. 对于这两个函数的调用,它是在编译器之间确定的,并且是静态的(请记住: 它是静态的). 换句话说,它们的地址是在编译时绑定的(早期绑定),所以重载与多态无关!与多态性真正相关的是“覆盖率”. 当子类重新定义父类的虚函数时,父类指针将根据分配给它的不同子类指针动态地(记住: 它是动态的!)调用属于该子类的函数. 它不能在编译期间确定(无法提供被调用子类的虚函数的地址). 因此,此类功能地址在运行时绑定(后期绑定). 结论是: 重载只是一种语言功能,与多态无关,与面向对象无关!引用布鲁斯·埃克尔(Bruce Eckel)的话: “不要傻,如果不是后期绑定的话,它就不是多态的. ”
那么,多态性的作用是什么?我们知道封装可以隐藏实现细节并使代码模块化. 继承可以扩展现有的代码模块(类);它们的目的是对重用进行编码. 而多态是实现接口复用的另一目的!多态性的作用是确保当类继承和派生时,在使用“族树”中任何类的实例的某个属性时,正确使用它.
SRP(单一责任原则)
类别的功能应该像杂货店一样是单一的,而不是全包的. 开闭原理OCP(Open-Close Principle)
模块已打开以进行扩展,模块已关闭以进行修改. 如果您想添加功能,欢迎您. 如果要修改,哼,10,000不高兴. Liskov替代原理LSP(Liskov替代原理LSP)
子类可以替换出现在任何地方的父类. 例如,您可以代表父亲去奶奶家. 哈哈~~依赖反转原理DIP(Dependency Inversion Principle DIP)
高级模块不应依赖于低级模块,而应全部依赖于抽象. 抽象不应依赖于具体实现,具体实现应依赖于抽象. 也就是说,出国时必须说自己是中国人,但是不能说自己属于哪个村庄. 例如,中文是抽象的. 以下是特定的xx个省,xx个城市和xx个县. 您是依靠抽象的中文,而不是您来自xx村. ISP(接口隔离原理ISP)
设计时,最好使用与特定客户类别相关的多个接口,而不是使用公共接口. 例如,手机具有拨打电话,观看视频,玩游戏等功能. 将这些功能拆分为不同的接口比拥有一个接口要好得多.
在面向对象的设计中,我们经常听到或使用聚合和耦合的概念. 面向对象的目标是设计具有高聚合和低耦合的程序. 但是,究竟什么是聚合,什么是耦合,恐怕每个人都有自己的答案. 换句话说,大多数人对聚集和耦合的概念含糊不清.
因为聚合和耦合这两个概念一直以“高聚合和低耦合”的形式出现,所以当我第一次接触面向对象的设计时,我一直认为聚合和耦合是一对相反的概念也就是说,只要实现高聚集,自然就会产生低耦合. 尽管这种理解没有错,但我没有考虑原因.

让我们首先看一下聚合的定义: 内聚性是对模块中各个组件之间的相关程度的一种度量.
这里有几个含义值得考虑. 首先,聚合是对模块内部的一种度量,这就是为什么我们在许多情况下将聚合称为内聚的原因. 其次,此处出现的模块是通用模块,可以是子系统,功能模块或特定类别的功能模块. 从不同的级别来看,聚合的程度将有所不同. 至于为什么不同,稍后将进行解释. 第三,模块的组件包括模块的行为和状态. 为了实现高度聚合,模块的内部行为必须与模块的内部状态紧密相关. 一般来说,一个模块仅完成一个独立的功能,而模块内部没有与该功能无关的操作或状态.
以生活为例.
有两个城市,西德敦和弗雷德伯勒,连接这两个城市的道路整日总是很拥挤. 经“有关部门”调查,发现这两个城市有两家公司Better Mousetrap和Zokko Soda. Better Mousetrap工厂建在Sidtown,该工厂的员工住在弗雷德伯勒,因此每天早上都有大量员工从弗雷德伯勒出发. 到西德敦,晚上返回;同样,Zokko Soda的运输卡车需要在日常工作时间内在制瓶厂和灌装厂之间穿梭.
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-239444-1.html
猪乸也会上树
全系统的可靠性
可采取撞击战术对付美军舰的风声起了作用
笑起来很好声音也很好一句话咯加油