精华内容
下载资源
问答
  • 常见的几种编程思想

    2017-07-13 16:29:20
    链式编程思想:是将多个操作(多行代码)通过点号(.)链接在一起成为一句代码,使代码可读性好。a(1).b(2).c(3) 链式编程特点:方法的返回值是block,block必须返回值(本身对象),block参数(需要操作的值)代表:...
    1. 面向过程:处理事情以过程为核心,一步一步的实现。

    2. 面向对象:万物皆对象

    3. 链式编程思想:是将多个操作(多行代码)通过点号(.)链接在一起成为一句代码,使代码可读性好。a(1).b(2).c(3)
      链式编程特点:方法的返回值是block,block必须有返回值(本身对象),block参数(需要操作的值)

      代表:Masonry框架。

    4. 响应式编程思想:不需要考虑调用顺序,只需要知道考虑结果,类似于蝴蝶效应,产生一个事件,会影响很多东西,这些事件像流一样的传播出去,然后影响结果,借用面向对象的一句话,万物皆是流。

      代表:KVO运用。

    5. 函数式编程思想:是把操作尽量写成一系列嵌套的函数或者方法调用。
      函数式编程特点:每个方法必须有返回值(本身对象),把函数或者Block当做参数,block参数(需要操作的值)block返回值(操作结果)

      代表:ReactiveCocoa。

    展开全文
  • 本文将从访问限制,属性,继承,方法重写这个方面继续介绍面向对象的编程思想和Python类的继承。一、访问权限:Python中在类的内部定义属性和方法,在类的外部是可以直接调用或进行访问的。例如:from selenium ...

    本文将从访问限制,属性,继承,方法重写这几个方面继续介绍面向对象的编程思想和Python类的继承。

    一、访问权限:

    Python中在类的内部定义属性和方法,在类的外部是可以直接调用或进行访问的。例如:

    from selenium import webdriver

    import time

    class Commonshare:

    url = 'https://mail.126.com/'

    def __init__(self):#初始化浏览器

    self.driver=webdriver.Chrome()

    self.driver.maximize_window()

    if __name__ == '__main__':

    com = Commonshare()

    com.driver.get(com.url)

    url就是在类中定义的属性,在类的外部通过com的对象可以直接进行使用。因此Python中没有对属性和方法设置访问权限。为了保证类内部的某些属性不被外部访问,可以进行如下的访问限制:

    1.__open__ :收尾双下划线表示定义特殊方法,一般是系统定义的方法

    2._open: 在开头加单下划线表示保护类型的成员,仅允许类本身和子类进行访问。

    from selenium import webdriver

    import time

    class Commonshare:

    _url = 'https://mail.126.com/'

    def __init__(self):#初始化浏览器

    self.driver=webdriver.Chrome()

    self.driver.maximize_window()

    if __name__ == '__main__':

    com = Commonshare()

    com.driver.get(com._url)

    从以上的运行结果可以得出:保护属性可以通过实例名访问

    3.__foo:双下划线表示(私有)类型的成员,只允许定义该方法的类本身进行访问,不能通过类的实例进行访问

    from selenium import webdriver

    class Commonshare:

    __url = 'https://mail.126.com/'

    def __init__(self):#初始化浏览器

    self.driver=webdriver.Chrome()

    self.driver.maximize_window()

    print('类内部的',Commonshare._url)

    if __name__ == '__main__':

    com = Commonshare()

    com.driver.get(com._Commonshare__url)#可以访问

    com.driver.get(com.__url)#不能访问

    从以上的结果可以看出:私有属性可以通过“类名.属性名”的方式访问,也可以通过"实例名.类名__url"访问。不能直接通过“实例名.属性名”访问

    上文中介绍实例属性,实例属性在方法体外,是无法访问的,但是我们又想访问怎么办呢?

    二、属性

    (一)Python中,可通过@property(装饰器)将一个方法转为属性。转换后,可通过方法名来访问,不需要再加()访问。

    class Avg_Score():# 平均成绩类

    def __init__(self,num1,num2,num3):

    self.num1=num1 #英语成绩

    self.num2=num2 #语文成绩

    self.num3=num3 #数学成绩

    @property#将方法转换为属性

    def num_avg(self): #计算机求平均数的方法

    return (self.num3+self.num2+self.num1)/3 #返回平均成绩

    avg=Avg_Score(60,50,90)#创建类的实例

    print('三科成绩之和为:',avg.num_avg)#类的实例,调用属性,得到属性值

    不将方法转换成属性,如下,调用方法

    class Avg_Score():# 平均成绩类

    def __init__(self,num1,num2,num3):

    self.num1=num1 #英语成绩

    self.num2=num2 #语文成绩

    self.num3=num3 #数学成绩

    def num_avg(self): #计算机求平均数的方法

    return (self.num3+self.num2+self.num1)/3 #返回平均成绩

    avg=Avg_Score(60,50,90)#创建类的实例

    print('三科成绩之和为:',avg.num_avg())#调用实例方法,得到平均值

    (二)在Python中,类的属性或者实例,是可以在类体外修改的。@property将一个方法转为属性为只读属性,不能更改。如图

    class Avg_Score():# 平均成绩类

    def __init__(self,num1,num2,num3):

    self.num1=num1 #英语成绩

    self.num2=num2 #语文成绩

    self.num3=num3 #数学成绩

    @property#将方法转换为属性

    def num_avg(self): #计算机求平均数的方法

    return (self.num3+self.num2+self.num1)/3 #返回平均成绩

    avg=Avg_Score(60,50,90)#创建类的实例

    print('三科成绩之和为:',avg.num_avg)#类的实例,调用属性,得到属性值

    avg.num1=3

    print(avg.num_avg)

    avg.num_avg='55'#不能更改,出错

    print(avg.num_avg)

    三、继承

    继承是面向对象编程思想的重要特征之一,继承可以实现代码的重用,同时还可以进行类之间关系的梳理。

    (一)继承的语法

    class 类名(父类的类名)

    (二)子类调用父类的方法实现如下:

    class Avg_Score():# 平均成绩类

    def __init__(self,num1,num2,num3):

    self.num1=num1 #英语成绩

    self.num2=num2 #语文成绩

    self.num3=num3 #数学成绩

    # @property#将方法转换为属性

    def num_avg(self): #计算机求平均数的方法

    return (self.num3+self.num2+self.num1)/3 #返回平均成绩

    class Student_Sort(Avg_Score):#Student_Sort类继承了Avg_Score类,,

    pass

    if __name__ == '__main__':

    stu=Student_Sort(99,100,80)

    print(stu.num_avg())# Student_Sort可以直接调用Avg_Score类的方法

    (三)子类可以重写父类的方法

    class Avg_Score():# 平均成绩类

    def __init__(self,num1,num2,num3):

    self.num1=num1 #英语成绩

    self.num2=num2 #语文成绩

    self.num3=num3 #数学成绩

    # @property#将方法转换为属性

    def num_avg(self): #计算机求平均数的方法

    print((self.num3+self.num2+self.num1)/3 ) #返回平均成绩

    class Student_Sort(Avg_Score):

    def num_avg(self):#重写父类的方法

    print(self.num1+self.num2)

    if __name__ == '__main__':

    stu=Student_Sort(99,100,80)

    stu.num_avg()#仅打印子类方法的结果

    注意重写的方法,调用该方法时不会再进行父类方法的调用和结果显示

    四、子类调用父类的__init__()方法

    class Avg_Score():# 平均成绩类

    def __init__(self,num1,num2,num3):

    self.num1=num1 #英语成绩

    self.num2=num2 #语文成绩

    self.num3=num3 #数学成绩

    # @property#将方法转换为属性

    def num_avg(self): #计算机求平均数的方法

    print((self.num3+self.num2+self.num1)/3 ) #返回平均成绩

    class Student_Sort(Avg_Score):

    def __init__(self):

    print("结果")

    # def num_avg(self):#重写父类的方法

    #    print(self.num1+self.num2)

    if __name__ == '__main__':

    stu=Student_Sort()

    stu.num_avg()

    当我们定义的属性在__init__()方法中时,子类同时改写了__init__()时,那么父类定义的方法中的属性就会找不到,出现程序错误。

    (二)不重写__init__()方法,子类中的方法是可以直接使用父类的属性,例如:

    class Avg_Score():# 平均成绩类

    def __init__(self,num1,num2,num3):

    self.num1=num1 #英语成绩

    self.num2=num2 #语文成绩

    self.num3=num3 #数学成绩

    # @property#将方法转换为属性

    def num_avg(self): #计算机求平均数的方法

    print((self.num3+self.num2+self.num1)/3 ) #返回平均成绩

    class Student_Sort(Avg_Score):

    def sum(self):

    print(self.num1+self.num2)#可以使用父类的属性。

    if __name__ == '__main__':

    stu=Student_Sort(78,89,58)

    stu.num_avg()

    (三)通过super()函数调用父类中的__init()方法

    class Avg_Score():# 平均成绩类

    def __init__(self,num1,num2,num3):

    self.num1=num1 #英语成绩

    self.num2=num2 #语文成绩

    self.num3=num3 #数学成绩

    def num_avg(self): #计算机求平均数的方法

    print((self.num3+self.num2+self.num1)/3 ) #返回平均成绩

    class Student_Sort(Avg_Score):

    def __init__(self):

    print("结果")

    super().__init__(58,58,59)#调用父类的__init__()方法

    if __name__ == '__main__':

    stu=Student_Sort()

    stu.num_avg()

    展开全文
  • 在java中三种编程思想:OOA,OOD,OOPOOA一、OOA的主要原则。二、面向对象分析产生三种分析模型三、OOA的主要优点四、OOA方法的基本步骤OOD一、OOD背景知识二、OOD到底从哪儿来?三、OOD和传统方法什么区别?四、OOD...

    OOA

    Object-Oriented Analysis:面向对象分析方法

    是在一个系统的开发过程中进行了系统业务调查以后,按照面向对象的思想来分析问题。OOA与结构化分析有较大的区别。OOA所强调的是在系统调查资料的基础上,针对OO方法所需要的素材进行的归类分析和整理,而不是对管理业务现状和方法的分析。

    OOA(面向对象的分析)模型由5个层次(主题层、对象类层、结构层、属性层和服务层)和5个活动(标识对象类、标识结构、定义主题、定义属性和定义服务)组成。在这种方法中定义了两种对象类之间的结构,一种称为分类结构,一种称为组装结构。分类结构就是所谓的一般与特殊的关系。组装结构则反映了对象之间的整体与部分的关系。

    OOA在定义属性的同时,要识别实例连接。实例连接是一个实例与另一个实例的映射关系。

    OOA在定义服务的同时要识别消息连接。当一个对象需要向另一对象发送消息时,它们之间就存在消息连接。

    OOA 中的5个层次和5个活动继续贯穿在OOD(画向对象的设计)过程中。OOD模型由4个部分组成。它们分别是设计问题域部分、设计人机交互部分、设计任务管理部分和设计数据管理部分。

    一、OOA的主要原则。

    (1)抽象:从许多事物中舍弃个别的、非本质的特征,抽取共同的、本质性的特征,就叫作抽象。抽象是形成概念的必须手段。

    抽象原则有两方面的意义:第一,尽管问题域中的事物是很复杂的,但是分析员并不需要了解和描述它们的一切,只需要分析研究其中与系统目标有关的事物及其本质性特征。第二,通过舍弃个体事物在细节上的差异,抽取其共同特征而得到一批事物的抽象概念。

    抽象是面向对象方法中使用最为广泛的原则。抽象原则包括过程抽象和数据抽象两个方面。

    过程抽象是指,任何一个完成确定功能的操作序列,其使用者都可以把它看作一个单一的实体,尽管实际上它可能是由一系列更低级的操作完成的。

    数据抽象是根据施加于数据之上的操作来定义数据类型,并限定数据的值只能由这些操作来修改和观察。数据抽象是OOA的核心原则。它强调把数据(属性)和操作(服务)结合为一个不可分的系统单位(即对象),对象的外部只需要知道它做什么,而不必知道它如何做。

    (2)封装就是把对象的属性和服务结合为一个不可分的系统单位,并尽可能隐蔽对象的内部细节。

    (3)继承:特殊类的对象拥有的其一般类的全部属性与服务,称作特殊类对一般类的继承。

    在OOA中运用继承原则,就是在每个由一般类和特殊类形成的一般—特殊结构中,把一般类的对象实例和所有特殊类的对象实例都共同具有的属性和服务,一次性地在一般类中进行显式的定义。在特殊类中不再重复地定义一般类中已定义的东西,但是在语义上,特殊类却自动地、隐含地拥有它的一般类(以及所有更上层的一般类)中定义的全部属性和服务。继承原则的好处是:使系统模型比较简练也比较清晰。

    (4)分类:就是把具有相同属性和服务的对象划分为一类,用类作为这些对象的抽象描述。分类原则实际上是抽象原则运用于对象描述时的一种表现形式。

    (5)聚合:又称组装,其原则是:把一个复杂的事物看成若干比较简单的事物的组装体,从而简化对复杂事物的描述。

    (6)关联:是人类思考问题时经常运用的思想方法:通过一个事物联想到另外的事物。能使人发生联想的原因是事物之间确实存在着某些联系。

    (7)消息通信:这一原则要求对象之间只能通过消息进行通信,而不允许在对象之外直接地存取对象内部的属性。通过消息进行通信是由于封装原则而引起的。在OOA中要求用消息连接表示出对象之间的动态联系。

    (8)粒度控制:一般来讲,人在面对一个复杂的问题域时,不可能在同一时刻既能纵观全局,又能洞察秋毫。因此需要控制自己的视野:考虑全局时,注意其大的组成部分,暂时不详察每一部分的具体的细节;考虑某部分的细节时则暂时撇开其余的部分。这就是粒度控制原则。

    (9)行为分析:现实世界中事物的行为是复杂的。由大量的事物所构成的问题域中各种行为往往相互依赖、相互交织。

    二、面向对象分析产生三种分析模型

    1、对象模型:对用例模型进行分析,把系统分解成互相协作的分析类,通过类图/对象图描述对象/对象的属性/对象间的关系,是系统的静态模型

    2、动态模型:描述系统的动态行为,通过时序图/协作图描述对象的交互,以揭示对象间如何协作来完成每个具体的用例,单个对象的状态变化/动态行为可以通过状态图来表达

    3、功能模型(即用例模型à作为输入)。

    三、OOA的主要优点

    (1)加强了对问题域和系统责任的理解;

    (2)改进与分析有关的各类人员之间的交流;

    (3)对需求的变化具有较强的适应性;

    (4)支持软件复用。

    (5)贯穿软件生命周期全过程的一致性。

    (6)实用性;

    (7)有利于用户参与。

    四、OOA方法的基本步骤

    在用OOA具体地分析一个事物时,大致上遵循如下五个基本步骤:

    第一步,确定对象和类。这里所说的对象是对数据及其处理方式的抽象,它反映了系统保存和处理现实世界中某些事物的信息的能力。类是多个对象的共同属性和方法集合的描述,它包括如何在一个类中建立一个新对象的描述。

    第二步,确定结构(structure)。结构是指问题域的复杂性和连接关系。类成员结构反映了泛化-特化关系,整体-部分结构反映整体和局部之间的关系。

    第三步,确定主题(subject)。主题是指事物的总体概貌和总体分析模型。

    第四步,确定属性(attribute)。属性就是数据元素,可用来描述对象或分类结构的实例,可在图中给出,并在对象的存储中指定。

    第五步,确定方法(method)。方法是在收到消息后必须进行的一些处理方法:方法要在图中定义,并在对象的存储中指定。对于每个对象和结构来说,那些用来增加、修改、删除和选择一个方法本身都是隐含的(虽然它们是要在对象的存储中定义的,但并不在图上给出),而有些则是显示的。

    OOD

    面向对象设计(Object-Oriented Design,OOD)方法是OO方法中一个中间过渡环节。其主要作用是对OOA分析的结果作进一步的规范化整理,以便能够被OOP直接接受。

    面向对象设计(OOD)是一种软件设计方法,是一种工程化规范。这是毫无疑问的。按照Bjarne Stroustrup的说法,面向对象的编程范式(paradigm)是[Stroustrup, 97]:

    l 决定你要的类;

    l 给每个类提供完整的一组操作;

    l 明确地使用继承来表现共同点。

    由这个定义,我们可以看出:OOD就是“根据需求决定所需的类、类的操作以及类之间关联的过程”。

    OOD的目标是管理程序内部各部分的相互依赖。为了达到这个目标,OOD要求将程序分成块,每个块的规模应该小到可以管理的程度,然后分别将各个块隐藏在接口(interface)的后面,让它们只通过接口相互交流。比如说,如果用OOD的方法来设计一个服务器-客户端(client-server)应用,那么服务器和客户端之间不应该有直接的依赖,而是应该让服务器的接口和客户端的接口相互依赖。

    这种依赖关系的转换使得系统的各部分具有了可复用性。还是拿上面那个例子来说,客户端就不必依赖于特定的服务器,所以就可以复用到其他的环境下。如果要复用某一个程序块,只要实现必须的接口就行了。

    OOD是一种解决软件问题的设计范式(paradigm),一种抽象的范式。使用OOD这种设计范式,我们可以用对象(object)来表现问题领域(problem domain)的实体,每个对象都有相应的状态和行为。我们刚才说到:OOD是一种抽象的范式。抽象可以分成很多层次,从非常概括的到非常特殊的都有,而对象可能处于任何一个抽象层次上。另外,彼此不同但又互有关联的对象可以共同构成抽象:只要这些对象之间有相似性,就可以把它们当成同一类的对象来处理。

    一、OOD背景知识

    计算机硬件技术却在飞速发展。从几十年前神秘的庞然大物,到现在随身携带的移动芯片;从每秒数千次运算到每秒上百亿次运算。当软件开发者们还在寻找能让软件开发生产力提高一个数量级的“银弹”[Brooks, 95]时,硬件开发的生产力早已提升了百倍千倍。

    硬件工程师们能够如此高效,是因为他们都很懒惰。他们永远恪守“不要去重新发明轮子”的古训。Grady Booch把这些黑箱称为类属(class category),现在我们则通常把它们称为“组件(component)”。

    类属是由被称为类(class)的实体组成的,类与类之间通过关联(relationship)结合在一起。一个类可以把大量的细节隐藏起来,只露出一个简单的接口,这正好符合人们喜欢抽象的心理。所以,这是一个非常伟大的概念,因为它给我们提供了封装和复用的基础,让我们可以从问题的角度来看问题,而不是从机器的角度来看问题。

    软件的复用最初是从函数库和类库开始的,这两种复用形式实际上都是白箱复用。到90年代,开始有人开发并出售真正的黑箱软件模块:框架(framework)和控件(control)。框架和控件往往还受平台和语言的限制,现在软件技术的新潮流是用SOAP作为传输介质的Web Service,它可以使软件模块脱离平台和语言的束缚,实现更高程度的复用。但是想一想,其实Web Service也是面向对象,只不过是把类与类之间的关联用XML来描述而已[Li, 02]。

    在过去的十多年里,面向对象技术对软件行业起到了极大的推动作用。在可以预测的将来,它仍将是软件设计的主要技术——至少我看不到有什么技术可以取代它的。

    二、OOD到底从哪儿来?

    有很多人都认为:OOD是对结构化设计(Structured Design,SD)的扩展,其实这是不对的。OOD的软件设计观念和SD完全不同。SD注重的是数据结构和处理数据结构的过程。而在OOD中,过程和数据结构都被对象隐藏起来,两者几乎是互不相关的。不过,追根溯源,OOD和SD有着非常深的渊源。

    1967年前后,OOD和SD 的概念几乎同时诞生,它们分别以不同的方式来表现数据结构和算法。当时,围绕着这两个概念,很多科学家写了大量的论文。其中,由Dijkstra和 Hoare两人所写的一些论文讲到了“恰当的程序控制结构”这个话题,声称goto语句是有害的,应该用顺序、循环、分支这三种控制结构来构成整个程序流程。这些概念发展构成了结构化程序设计方法;而由Ole-Johan Dahl所写的另一些论文则主要讨论编程语言中的单位划分,其中的一种程序单位就是类,它已经拥有了面向对象程序设计的主要特征。

    这两种概念立刻就分道扬镳了。在结构化这边的历史大家都很熟悉:NATO会议采纳了Dijkstra的思想,整个软件产业都同意goto语句的确是有害的,结构化方法、瀑布模型从70年代开始大行其道。同时,无数的科学家和软件工程师也帮助结构化方法不断发展完善,其中有很多今天足以使我们振聋发聩的名字,例如Constantine、Yourdon、DeMarco和Dijkstra。有很长一段时间,整个世界都相信:结构化方法就是拯救软件工业的 “银弹”。当然,时间最后证明了一切。

    而此时,面向对象则在研究和教育领域缓慢发展。结构化程序设计几乎可以应用于任何编程语言之上,而面向对象程序设计则需要语言的支持[1],这也妨碍了面向对象技术的发展。实际上,在60年代后期,支持面向对象特性的语言只有Simula-67这一种。到70年代,施乐帕洛阿尔托研究中心(PARC)的 Alan Key等人又发明了另一种基于面向对象方法的语言,那就是大名鼎鼎的Smalltalk。但是,直到80年代中期,Smalltalk和另外几种面向对象语言仍然只停留在实验室里。

    到90年代,OOD突然就风靡了整个软件行业,这绝对是软件开发史上的一次革命。不过,登高才能望远,新事物总是站在旧事物的基础之上的。70年代和80年代的设计方法揭示出许多有价值的概念,谁都不能也不敢忽视它们,OOD也一样。

    三、OOD和传统方法有什么区别?

    还记得结构化设计方法吗?程序被划分成许多个模块,这些模块被组织成一个树型结构。这棵树的根就是主模块,叶子就是工具模块和最低级的功能模块。同时,这棵树也表示调用结构:每个模块都调用自己的直接下级模块,并被自己的直接上级模块调用。

    那么,哪个模块负责收集应用程序最重要的那些策略?当然是最顶端的那些。在底下的那些模块只管实现最小的细节,最顶端的模块关心规模最大的问题。所以,在这个体系结构中越靠上,概念的抽象层次就越高,也越接近问题领域;体系结构中位置越低,概念就越接近细节,与问题领域的关系就越少,而与解决方案领域的关系就越多。

    但是,由于上方的模块需要调用下方的模块,所以这些上方的模块就依赖于下方的细节。换句话说,与问题领域相关的抽象要依赖于与问题领域无关的细节!这也就是说,当实现细节发生变化时,抽象也会受到影响。而且,如果我们想复用某一个抽象的话,就必须把它依赖的细节都一起拖过去。

    而在OOD中,我们希望倒转这种依赖关系:我们创建的抽象不依赖于任何细节,而细节则高度依赖于上面的抽象。这种依赖关系的倒转正是OOD和传统技术之间根本的差异,也正是OOD思想的精华所在。

    四、OOD步骤

    细化重组类

    细化和实现类间关系,明确其可见性

    增加属性,指定属性的类型与可见性

    分配职责,定义执行每个职责的方法

    对消息驱动的系统,明确消息传递方式

    利用设计模式进行局部设计

    画出详细的类图与时序图

    五、OOD设计过程中要展开的主要几项工作

    (一)对象定义规格的求精过程

    对于OOA所抽象出来的对象-&-类以及汇集的分析文档,OOD需要有一个根据设计要求整理和求精的过程,使之更能符合OOP的需要。这个整理和求精过程主要有两个方面:一是要根据面向对象的概念

    模型整理分析所确定的对象结构、属性、方法等内容,改正错误的内容,删去不必要和重复的内容等。二是进行分类整理,以便于下一步数据库设计和程序处理模块设计的需要。整理的方法主要是进行归

    类,对类一&一对象、属性、方法和结构、主题进行归类。

    (二)数据模型和数据库设计

    数据模型的设计需要确定类-&-对象属性的内容、消息连接的方式、系统访问、数据模型的方法等。最后每个对象实例的数据都必须落实到面向对象的库结构模型中。

    (三)优化

    OOD的优化设计过程是从另一个角度对分析结果和处理业务过程的整理归纳,优化包括对象和结构的优化、抽象、集成。

    对象和结构的模块化表示OOD提供了一种范式,这种范式支持对类和结构的模块化。这种模块符合一般模块化所要求的所有特点,如信息隐蔽性好,内部聚合度强和模块之间耦合度弱等。

    集成化使得单个构件有机地结合在一起,相互支持。

    六、OOD方法的特点和面临的问题

    OOD方法以对象为基础,利用特定的软件工具直接完成从对象客体的描述到软件结构之间的转换。这是OO方法最主要的特点和成就。OOD方法的应用解决了传统结构化开发方法中客观世界描述工具与软

    件结构的不一致性问题,缩短了开发周期,解决了从分析和设计到软件模块结构之间多次转换映射的繁杂过程,是一种很有发展前途的系统开发方法。

    但是同原型方法一样,OOD方法需要一定的软件基础支持才可以应用,另外在大型的MIS开发中如果不经自顶向下的整体划分,而是一开始就自底向上的采用OOD 方法开发系统,同样也会造成系统结构不合理、各部分关系失调等问题。所以OOD方法和结构化方法目前仍是两种在系统开发领域相互依存的、不可替代的方法。

    七、OOD能给我带来什么?

    问这个问题的人,脑子里通常是在想“OOD能解决所有的设计问题吗?”没有银弹。OOD也不是解决一切设计问题、避免软件危机、捍卫世界和平……的银弹。OOD只是一种技术。但是,它是一种优秀的技术,它可以很好地解决目前的大多数软件设计问题——当然,这要求设计者有足够的能力。

    OOD可能会让你头疼,因为要学会它、掌握它是很困难的;OOD甚至会让你失望,因为它也并不成熟、并不完美。OOD也会给你带来欣喜,它让你可以专注于设计,而不必操心那些细枝末节;OOD也会使你成为一个更好的设计师,它能提供给你很好的工具,让你能开发出更坚固、更可维护、更可复用的软件。

    OOP

    面向对象编程(Object Oriented Programming,OOP,面向对象程序设计)是一种计算机编程架构。OOP 的一条基本原则是计算机程序是由单个能够起到子程序作用的单元或对象组合而成。OOP 达到了软件工程的三个主要目标:重用性、灵活性和扩展性。为了实现整体运算,每个对象都能够接收信息、处理数据和向其它对象发送信息。OOP 主要有以下的概念和组件:

    组件 - 数据和功能一起在运行着的计算机程序中形成的单元,组件在 OOP 计算机程序中是模块和结构化的基础。

    抽象性 - 程序有能力忽略正在处理中信息的某些方面,即对信息主要方面关注的能力。

    封装 - 也叫做信息封装:确保组件不会以不可预期的方式改变其它组件的内部状态;只有在那些提供了内部状态改变方法的组件中,才可以访问其内部状态。每类组件都提供了一个与其它组件联系的接口,并规定了其它组件进行调用的方法。

    多态性 - 组件的引用和类集会涉及到其它许多不同类型的组件,而且引用组件所产生的结果得依据实际调用的类型。

    继承性 - 允许在现存的组件基础上创建子类组件,这统一并增强了多态性和封装性。典型地来说就是用类来对组件进行分组,而且还可以定义新类为现存的类的扩展,这样就可以将类组织成树形或网状结构,这体现了动作的通用性。

    由于抽象性、封装性、重用性以及便于使用等方面的原因,以组件为基础的编程在脚本语言中已经变得特别流行。Python 和 Ruby 是最近才出现的语言,在开发时完全采用了 OOP 的思想,而流行的 Perl 脚本语言从版本5开始也慢慢地加入了新的面向对象的功能组件。用组件代替“现实”上的实体成为 JavaScript(ECMAScript) 得以流行的原因,有论证表明对组件进行适当的组合就可以在英特网上代替 HTML 和 XML 的文档对象模型(DOM)。

    设计模式、技术和直觉构成严峻的挑战。这是选择编程语言之前必须认识到的,尽管不同语言的设计特性可能促进或者阻碍这一转化。

    在网络应用的增长中,一个很重要的部分是小型移动设备和特殊Internet设备的爆炸性增长。这些设备各有各的操作系统,或者只在某种特定的设备领域内有共同的操作系统。我们现在还可以一一列举出这些设备——家庭接入设备、蜂窝电话、电子报纸、PDA、自动网络设备等等。但是这些设备领域的数量和深入程度将会很快变得难以估量。我们都知道这个市场大得惊人,PC的兴起与之相比不过小菜一碟。因此在这些设备的应用程序市场上,竞争将会相当残酷。获胜的重要手段之一,就是尽快进入市场。开发人员需要优秀的工具,迅速高效地撰写和调试他们的软件。平台无关性也是制胜秘诀之一,它使得程序员能够开发出支持多种设备平台的软件。

    我预期的另一个变化是,我们对于代码(Java)和数据(XML)协同型应用程序的开发能力将会不断提高。这种协同是开发强大应用程序的核心目标之一。我们从XML的迅速流行和ebXML规范的进展中,已经看到了这个趋势。ebXML是一个针对电子商务和国际贸易的,基于XML的开放式基础构架,由联合国贸易促进和电子商务中心(UN/CEFACT)与结构性信息标准推进组织(OASIS)共同开发。

    我们能否期望出现一个真正的面向组件(component-oriented)的语言?它的创造者会是谁呢?

    Stroustrup: 我怀疑,这个领域中之所以缺乏成果,正是因为人们——主要是那些非程序员们——对“组件”这个意义含糊的字眼寄予了太多的期望。这些人士梦想,有朝一日,组件会以某种方式把程序员赶出历史舞台。以后那些称职的“设计员”只需利用预先调整好的组件,把鼠标拖一拖放一放,就把系统组合出来。对于软件工具厂商来说,这种想法还有另一层意义,他们认为,到时候只有他们才保留有必要的技术,有能力编写这样的组件。

    这种想法有一个最基本的谬误:这种组件很难获得广泛欢迎。一个单独的组件或框架(framework),如果能够满足一个应用程序或者一个产业领域对所提出的大部分要求的话,对于其制造者来说就是划算的产品,而且技术上也不是很困难。可是该产业内的几个竞争者很快就会发现,如果所有人都采用这些组件,那么彼此之间的产品就会变得天下大同,没什么区别,他们将沦为简单的办事员,主要利润都将钻进那些组件/框架供应商的腰包里!
      
      小“组件”很有用,不过产生不了预期的杠杆效应。中型的、更通用的组件非常有用,但是构造时需要非同寻常的弹性。

    展开全文
  • 最近又在思考一些底层的又很基础的问题,想把他们全部整理出来。...面向对象是一种编程思想为什么要用这种编程思想呢,肯定是符合人类思考的逻辑的。首先我给大家普及一下下面个问题?1)数据是存在哪里?大家...

    最近又在思考一些底层的又很基础的问题,想把他们全部整理出来。供自己查阅,方便大家一起学习。

    我们在学代码的时候,学python,java老师会跟你说,他们是面向对象的语言。那么何为面向对象,为什么要面向对象呢?你们有思考这个问题吗?要想吧一个东西学好,你得知道为什么。

    面向对象是一种编程思想为什么要用这种编程思想呢,肯定是符合人类思考的逻辑的。

    首先我给大家普及一下下面几个问题?

    1)数据是存在哪里?

    大家的答案估计都是存在内存里,内存分外内盘,外盘等

    2)数据是以什么方式储存?

    有点计算机基础的都知道,数据是以二进制的方式存在内存里,关于二进制大家可以百度查阅资料二进制_百度百科​baike.baidu.com

    弄清了上面几个,我们把它形象化,把二进制的组成的0和1的数字比做成制作砖头的材料,我们把二进制存储的数据封装成一个对象。我们建造房子的时候,我们就直接拿对象来组成一间间房子或其他建筑物。

    面向对象和面向过程的理解:

    1、面向过程:所有的工作都是现写现用。思维方式是分析综合。面向对象的思维方式是构造。

    2、面向对象:是一种编程思想,许多功能事先已经编写好了,在使用时,只需要关注功能的运用,而不需要这个功能的具体实现过程。

    有点懵,没关系,我们举例一个通俗易懂的例子

    我们要吃啤酒鸭!!

    面向过程

    1:养鸭子

    2:等鸭子长大

    3:杀了鸭子

    4:买作料,自己做

    5:然后吃 (这种过程称为面向过程,比较复杂)

    面向对象

    1:找一个卖啤酒鸭的人

    2:给钱,交易

    3:吃,然后胖几斤(对比一下是不是面向对象简单了很多呢?)

    详细讲一下面向对象:

    面向对象编程是一种解决软件复用的设计和编程方法。 这种方法把软件系统中相近相似的操作逻辑和操作 应用数据、状态,以类的型式描述出来,以对象实例的形式在软件系统中复用,以达到提高软件开发效率的作用。

    面向对象的理解:

    面向对象是一种设计思想

    1.符合人们的思考习惯

    2.把执行者变成指挥者

    3.简化功能,把复杂的事情简单化面向对象有三大特征:1.封装2.继承3.多态

    什么是封装?

    类是一种封装,将属性和方法封装。

    函数也是一种封装,将具有一定共的逻辑代码封装到一个函数中,使用的时候调用即可

    提高代码的扩展性。

    什么是继承?

    将公共的(共性的)属性和方法放在父类中,子类只关注自己特有的属性和方法。

    提高代码的扩展性。

    展开全文
  • 在网上看了很多关于编程思想的博客,感觉的和我的理解不太一样,这里写下我对几种编程思想的理解,同时对链式编程进行代码分析及demo练习。 目录 一、定义 二、关于Masonry 三、链式编程 1、链式单元 2、...
  • MAS&链式编程思想

    2018-11-09 13:08:00
    比如说接口分离解耦合,再比如说我们最常用的delegate都是面向协议的思想,还有就是基于ReactiveCocoa框架也就是平时听到的RAC提供的响应式编程思想,今天主要分析下另一种编程思想,链式编程。...
  • 面向对象编程思想

    2017-11-28 20:47:38
    当我们打开招聘网站时,通常看到职位要求的第一条便是“面向对象编程思想”,但往往这一条会被大多数人忽视,心想“不就是写个类吗,我将具体的事物抽象一下就是喽!”,对,你说的一点都没错,但我要说,你对...
  • Spring中编程思想总结

    2020-01-15 11:36:07
    动态代理只是AOP的一种技术实现手段,AOP 是一种编程思想,Aspect切面:由某个本来不相干的东西,组到一块去形成已给到新的产品,切面最关键的就是解耦。 切面不仅仅增强功能,还有解耦功能,指定规则的功能...
  • 比如说接口分离解耦合,再比如说我们最常用的delegate都是面向协议的思想,还有就是基于ReactiveCocoa框架也就是平时听到的RAC提供的响应式编程思想,今天主要分析下另一种编程思想,链式编程。...
  • 编程思想--程序人生

    2019-09-27 02:51:40
    编程思想可以分为以下几个大类: 原则(Principles) 范式(Paradigms) ...我认识(或者说现在想得起来的)的原则主要以下几种: DRY (Don't Repeat Yourself) OCP (Open...
  • 本文实例分析了Javascript编程几种继承方式比较。分享给大家供大家参考,具体如下: 开篇 从’严格’意义上说,javascript并不是一门真正的面向对象语言。这种说法原因一般都是觉得javascript作为一门弱类型语言与...
  • 编程思想-解耦

    千次阅读 2016-09-02 00:45:27
    解耦方法但不限如下几种:(百度解释前三种) (a)采用现有设计模式实现解耦,如事件驱动模式、观察者模式、责任链模式等都可以达到解耦的目的; (b)采用面向接口的方式编程,而不是用直接的类型引用,除非在...
  • 相比直接反复阅读更效益(当然这本书后续仍需反复阅读十遍甚至百遍以上都不为过),而另一个原因就是这样也能够在阅读中通过博客来记录自己的学习历程,博客记录的不只是图文,它们记录的正是自己的成
  • 1、数据交换  用XML在应用程序和公司之间作数据交换已不是什么秘密了,...个应用程序  可以共享和解析同一个XML文件,不必使用传统的字符串解析或拆解过程。  相反,普通文件不对每个数据段做描述(除了在头文件
  • C#之浅析面向对象编程思想(一)

    千次阅读 2015-02-02 14:49:11
    纵观MicroSoft公司的几种主流语言,C是面向过程,VB既面向过程也面向对象的特性,而C#则是纯粹的面向对象的编程语言。在UML的学习过程中,画类图、对象图的时候面向对象的思想就已经用到了具体的学习中,而C#的...
  • AOP(Aspect-Oriented Programming)面向切面编程思想已经多年历史了,但是在.Net里面一直没有得到重视,不过这在MVC框架后被变革了,AOP思想开始在.Net流行起来,各种框架组件里面,面向切面已经是标配了,各种笔试...
  • 编程算法思想小结

    2019-05-09 11:17:59
    1.0,1思想:在某些编程问题需要表示事物两不同的状态,这时候就需要用到0,1思想。 例1:n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第号的那位?...
  • 可能我有点小偏见,但考虑到我一直在做的应用是在浏览器中实现Photoshop类型的编辑器,它呈现相同的数据有几种完全不一样的方式。 图层以图形化的形式呈现,占据了屏幕的大部份。它们列于一个面板内,你可以删除...
  • java是一面向对象的编程思想 这里我们要区分于c语言的,面向过程的编程思想。 面向过程的编程思想 解决问题按照一定的步骤(过程) 大象装冰箱总共分步? 1.开门 2.大象装冰箱 3.关门 特点:容易想到的过程,...
  • java编程思想读书笔记1

    千次阅读 2019-03-04 14:15:37
    经典的书再读一遍,虽然1.8很多新特性,java12都出来了,但是真的写的不错的书,还是这本。 一、抽象过程 所有编程语言都提供抽象机制,可以认为,人们能够解决问题的复杂性直接取决于抽象的类型和质量。C、...
  • 本博客是争对Java编程思想内部类一章所做记录,内部类在Java随处可见,比如集合框架中,Android源码以及开源框架中等等。理清内部类的使用是很,虽然这一章内容之前已经看过遍,但是还是不如整理来的好。...
  • 花了十天看完了《java编程思想》,我似乎能够体会到当时c++程序员看到java时那种兴奋的感觉了,相比c++而言这确实是一比较现代的语言——当然这不是说c++不好,C++还是我心中最强大的语言。  虽然十天的时间基本...
  • 俄罗斯方块编程思想

    千次阅读 2013-11-16 20:38:23
    我们都知道俄罗斯方块7图形,分别为:S、Z、L、J、I、O、T这个字母的形状。每图形经过4个方向的旋转又可以得到4图形(的可能是1或2,因为的旋转过之后跟以前的图形还是一样的)。我们将这些图形做...
  • 一,不要拘泥于一种编程语言,就像篇文章里说的,一个程序员至少要会三种语言,一种自己喜欢的,一种是功能强大的,一种是可以帮你赚面包的。对于我来说这三种语言分别是DELPHI,C++,c#或JAVA。编程语言...
  • 关于达到这个目的的方法:一是只需在新的类中产生现有类的对象。由于新的类是现有类的对象所组成,这种方法称之为组合;第二方法是按照现有类的类型来创建新类。无需改变现有类的形式,采用现有类的形式并在...
  • 在如今的Java领域,各种新技术、新...《java面向对象编程 (第2版)》以6条主线贯穿全书:面向对象编程思想、Java语言的语法、Java 虚拟机执行Java程序的原理、在实际项目中的运用、设计模式和性能优化技巧。书的每一章
  • Java编程思想 -- 异常

    2017-03-23 17:05:23
    如果一个用户在运行期间,由于程序的错误或一些外部环境的影响造成用户数据的丢失,用户就可能不在使用这个程序了。为了必选这类事情的发生,至少应该做到以下点: 向用户通告错误 返回到一安全的状态,并能够...
  • 为什么需要异步? 操作系统可以看作是个虚拟机(VM),进程生活在...基于这个思想,线程(Thread)的个数并不受硬件限制:你的程序可以只有一个线程、也可以成百上千个。操作系统会默默做好调度# 学习目标: ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 797
精华内容 318
关键字:

有几种编程思想