下面是一段设计不良的校验投注号码的代码 public boolean validate(String drawNum){ if (type.equals("PL3")) { 已使用完毕的不进行回收 SRP(单一职责) 系统中每一个对象应该具有单一职责,所有对象的服务都应该聚焦在实现该职责上。 应用举例 假设系统中有如下一个简单的Car类,其内部结果如下类图: ? 在组合中,由其他行为组成的对象(本例子中是Unit类)拥有那些行为(本例中指Weapon的attack方法)。 当拥有者对象被销毁时(Unit被销毁),其所有行为也被销毁(Weapon的所有实现也被销毁)。组合中的行为不存在组合之外。 聚合 当一个类被用作另一个类的一部分时,但仍然可以存在于该类之外。 (OCP) 通过将共同之物抽取出来并置于单一地方避免重复的程序代码(DRY) 系统中每一个对象应该具有单一职责,所有对象的服务都应该聚焦在实现该职责上。(SRP) 子类型必须能够替换其基类型。
面向对象设计原则 都是为了高内聚低耦合原则。编程时基本都要遵守 单一职责原则 分类原则:一种人只干一种事。 传统:没有接口而是类与类之间的对象创建。 情况:如果A类里写了想要的方法,为了不在B类不重复编写代码,可以在B类中设置一个方法:将A类的对象作为参数并在设置的方法里通过对象获取到A类中想要的方法。 白话:在设计方法参数的时候,保证不多给方法多余的参数。 例如:方法只需要一个用户的ip地址就可以执行,方法参数就不要写成需要输入用户对象,然后在方法里面通过对象再去调用其ip出来;而是在调用方法前就把用户对象的ip取出来,然后作为参数来调用方法。
常用的面向对象设计原则包括7个,分别是单一职责原则、开闭原则、里氏代换原则、依赖倒转原则、接口隔离原则、合成复用原则和迪米特原则。 面向对象设计的目标之一在于支持可维持性复用,一方面需要实现设计方案或者源代码的复用,另一方面要确保系统能够易于扩展和修改,具有较好的灵活性。 为了满足开闭原则,需要对系统进行抽象化设计,抽象化是开闭原则的关键。 四.依赖倒转原则 ---- Dependency Inversion Principle,DIP 如果说开闭原则是面向对象设计的目标的话,那么依赖倒转原则就是面向对象设计的主要实现机制之一,它是系统抽象化的具体实现 在实现依赖倒转原则时,需要针对抽象层编程,而将具体类的对象通过依赖注入的方式注入到其他对象中。依赖注入是指当一个对象要与其他对象发生依赖关系时,通过抽象来注入所依赖的对象。
我们都知道Python是一门灵活度很高的语言,它可以面向过程,面向对象,那我们今天说说Python中的面向对象设计和面向对象编程的区别 面向对象设计和面向对象编程都提到了“面向对象”, 那么首先我们要搞清楚什么是对象 知道对象的概念之后,我们进入主题 1.面向对象设计 说到设计,我们可以理解为是一种想法,思路,就是把对象的属性,功能(python里用函数表达)糅合在一起形成一个对象,这种思想可以简单的理解为面向对象设计 ,不是说必须用CLASS这种,才叫面向对象设计,下面我们举个例子 def cat(name,gender,type): # 猫的的动作或者叫功能 def cry(cat): 我们用 cat=cat('毛球','公','波斯猫') 来生成一个对象,我们可以调用对象的属性和函数等等,这些都是我们熟悉的面向对象设计,但是我们不能说这种方式叫面向对象编程。 我的理解一方面是面向对象编程的语法需要,二深层次的说是把类的数据属性和函数属性糅合在一起,满足面向对象设计的思想 self在对象实例化的时候,会自动传入,如果函数属性里面不定义self会报错 class
1、面向过程 我开车、我挂档、我踩油门、我过河北、我过山西 2、面向对象 我命令车去新疆 车怎么去我不管 (信息封装在车这个类里面。 我不用去了解整个开动的过程) 当碰到某个问题的时候,把里头的对象抽象 抽象、分类、继承、多态 类是用于描述同一类型的对象的一个抽象的概念,类中定义了这一类对象所具有的动态和静态属性 对象可以看成是类的具体实现 继承关系:一般和特殊(xx是一种xx) 聚合关系:整体和部分(xx是xx的一部分) 每一种继承下来的类都有自己的实现方法,但父类并不知道其实现方法 问题中有哪些类和对象 每个类和对象所具有的属性和方法 类与类之间具有哪些关系 为了解决以下问题: 1、软件重用性差 2、可维护性差 3、无很好的扩展性 面相对象:抽象、封装、共享性 强调对象的结构
1 什么是面向对象?如果有深入学习过Java的同学一定会知道,在Java中,“万物皆对象”,而对象又有各自的属性和方法,在Java中,对象按不同类型又可以分为实体类对象、业务类对象等等。 面向对象是一种传统的软件开发方法,一种编程范式,他区别与面向过程的程序设计语言,我们来打个比方:针对事件:学生小明要去上学面向过程的解决方式:小明->起床->做校车->上学面向对象的解决方式:小明->去上学因此 ,面向对象是相对于面向过程来讲的,面向对象方法,把相关的数据和方法组织为一个整体来看待,从更高的层次来进行系统建模,更贴近事物的自然运行模式。 继承会让人们想到父子关系,在Java面向对象的思想中也是如此,但不同的是在Java中子类拥有其父类的属性和方法,如果没有特殊关键字的约束,子类可以取代父类,并且一个父类能有多个子类。 3 Go语言面向对象设计3.1 封装type Student struct { Peo People Sid int School string}func (stu Student
【三】、面向对象设计原则 面向对象设计原则概述 可维护性:指软件能够被理解、改正、适应及扩展的难易程度。 可复用性:指软件能够被重复使用的难易程度。 面向对象设计的目标之一在于支持可维护性复用,一方面需要实现设计方案或者源代码的复用,另一方面要确保系统能够易于扩展和修改,具有良好的可维护性。 面向对象设计原则为支持可维护性复用而诞生。 每一个设计模式都符合一个或多个面向对象设计原则,面向对象设计原则是用于评价一个设计模式的使用效果的重要指标之一。 ? 单一职责原则 单一职责原则定义 单一职责原则是最简单的面向对象设计原则,用于控制类的粒度大小。 单一职责原则:一个对象应该只包含单一的职责,并且该职责被完整地封装在一个类中。 开闭原则 开闭原则定义 开闭原则是面向对象的可复用设计的第一块基石,是最重要的面向对象设计原则。 开闭原则:软件实体应当对扩展开放,对修改关闭。
面向对象设计原则概述 2. 单一职责原则 3. 开闭原则 4. 里氏代换原则定义 5. 依赖倒转原则 依赖倒转原则分析 6. 接口隔离原则 7. 合成复用原则 8. 迪米特法则 1. 面向对象设计的目标之一在于支持可维护性复用,一方面需要实现设计方案或者源代码的复用,另一方面要确保系统能够易于扩展和修改,具有良好的可维护性 面向对象设计原则为支持可维护性复用而诞生 指导性原则,非强制性原则 每一个设计模式都符合一个或多个面向对象设计原则,面向对象设计原则是用于评价一个设计模式的使用效果的重要指标之一 设计原则名称 定义 使用频率 单一职责原则(Single Responsibility 单一职责原则 “单一职责原则定义:单一职责原则是最简单的面向对象设计原则,用于控制类的粒度大小 单一职责原则:一个对象应该只包含单一的职责,并且该职责被完整地封装在一个类中。 开闭原则 开闭原则定义 “开闭原则是面向对象的可复用设计的第一块基石,是最重要的面向对象设计原则。软件实体应当对扩展开放,对修改关闭。
4,final修饰的变量是一个常量,只能赋值一次。 为什么要用final修饰变量。其实在程序如果一个数据是固定的, 那么直接使用这个数据就可以了,但是这样阅读性差,所以它该数据起个名称。 private 不行 ,private进行了封装 static 不行 ,通过类名.方法调用没有意义 final 不行,final代表最终的,不能被重写 4,抽象类和一般类的异同点。 public abstract 由此得出结论,接口中的成员都是公共的权限. interface Demo{ public static final int NUM = 4; public abstract 一把用于类的设计。 分析事物时,发现该事物描述中还有事物,而且这个事物还在访问被描述事物的内容。 这时就是还有的事物定义成内部类来描述。 +num); } }.show(); //可以调用,也可以不调用 }}class InnerClassDemo4{ public static void main(String[] args) {
数据属性有 4个特性描述它们的行为。 访问器属性有 4 个特性描述它们的行为。 ES6的类旨在完全涵盖之前规范设计的基于原型的继承模式。ES6的类仅仅是封装了ES5.1构造函数加原型继承的语法糖而已。 console.log(p2.friends); // Shelby,Court,Van console.log(p1.friends === p2.friends); // true # 继承 很多面向对象的语言都支持两种继承 ] a.shuffle(); console.log(a); // [5,2,1,3,4] 有些内置类型的方法会返回新实例,默认返回实例的类型与原始实例的类型是一致的。
一、设计原则概述 1.1 面向对象设计原则概述: 单一职责原则(Single Responsibility Principle, SRP) 开闭原则(Open-Closed Principle, OCP Interface Segregation Principle, ISP) 合成复用原则(Composite Reuse Principle, CRP) 迪米特法则(Law of Demeter, LoD) 设计原则名称 设计原则简介 单一职责原则 类的职责要单一,不要将太多的职责放在一个类中 开闭原则 软件实体对拓展是开放的,但对修改是关闭的,即在不修改一个软件实体的基础上拓展其功能 里氏代换原则 在软件系统中,一个可以接受基类对象的地方必然可以一个子类对象 也就是说在设计一个模块的时候,应当使这个模块可以在不被修改的前提下被扩展,即实现在不修改源代码的情况下改变这个模块的行为。 ,用子类对象来替换父类对象。
做了这么多年的面向对象编程还是写出违背SOLID原则的代码,一看都懂、一做就被怼,敏感度不够,如何是好? 难道SOLID原则本身就有错? 难道我不应该涉水OOD? ...... 在软件设计中,OCP 提倡对修改关闭,对扩展开放。 主要原因有两点: 关注的事情太多 关注事情的细节 创业初期,袁Sir这么做问题不大,公司在不断地发展壮大(如同软件的演变),袁Sir就需要琢磨出新的方案,而这些方案的核心观念无非两个: 分离关注点 引入中间人 在面向对象软件设计中 ,关注点分离,其实体现的就是软件设计的精髓 -- 高内聚,低耦合,引入一个中间人 则跟 面向抽象编程 有异曲同工之处。 ---- 参考阅读 让里氏替换原则为你效力 解析简单设计原则 聊聊面向对象设计中的Is-A 写了这么多年代码,你真的了解SOLID吗?
Liskov Substitution Principle 里氏替换原则 特点 继承、多态与封装,属于面向对象编程的几大核心特征。里氏替换原则对继承有指导意义。 使用继承时,子类对象应该可以在程序中替代父类对象使用,而不破坏程序原本的功能。 尽量将可变的行为做为类的一个属性(可变),并提供方法可以修改这个行为。 让客户(调用方)来驱动协议设计。在有多余的依赖时,找出最小类,然后依据不同的依赖关系,继承出更小的类。 通过编写测试反向推动设计改进。 抽象解耦了高层模块和低层模块间的依赖关系,让代码更灵活。但抽象同时也带来了额外的编程与理解成本。而只有对代码中现在或者未来会发生变化的东西进行抽象,才能获得最大的利益。
上面就是面向对象设计的代码结果。 所以,如何设计出完全面向对象的代码? 代码建模 ---- 什么是代码建模? 所以现在,什么是面向对象? 概念 ---- 面向对象的设计原则 对接口编程而不是对实现编程 优先使用对象组合而不是继承 抽象用于不同的事物,而接口用于事物的行为 针对上面的概念,我们再回头看我们上面的代码 对接口编程而不是对实现编程 机器人的创建行为最终依赖于BehaviorOrderCreateInterface接口 是不是完美契合,所以这就是“面向对象的设计过程”。 结论 代码建模过程就是“面向对象的设计过程”的具体实现方式. 预习 设计模式 最后,设计模式又是什么? 同样,我们下结合上面的场景和概念预习下设计模式。
OOP 【面向对象程序设计】(OOP)与【面向过程程序设计】在思维方式上存在着很大的差别。【面向过程程序设计】中,算法是第一位的,数据结构是第二位的,这就明确地表述了程序员的工作方式。 而【面向对象程序设计】却调换了这个次序,【面向对象程序设计】将数据放在第一位,然后再考虑操作数据的算法。 对于一些规模较小的问题,将问题分解为过程的开发方式比较理想。 而面向对象更加适用于解决规模较大的问题。 面向对象程序设计是一种编程范式或编程风格。 面向对象的程序是由类和对象组成的(以类和对象作为组织代码的基本单元),并将封装、抽象、继承、多态这四个特性,作为程序设计和实现的基础。 面向对象程序设计语言是【支持类和对象的语法机制。 对于这四大特性,尽管大部分面向对象程序设计语言都提供了相应的语法机制来支持,但不同的编程语言实现这四大特性的语法机制可能会有所不同。
一、面向对象模型 1、面向对象设计 C++ 语言中 对 面向对象程序设计 的支持有 : 封装 : 封装 静态 / 非静态 成员变量 / 成员函数 继承 : 单继承 , 多继承 , 虚继承 ; 多态 : 函数重载 ; 对象的创建与回收 : 构造函数 , 析构函数 ; 2、面向对象底层实现机制 C 语言中 , 数据 ( 变量 ) 和 行为 ( 函数 ) , 是 分开声明 的 , 数据 和 行为 之间 没有 : C++ 中的 面向对象 设计中 , 将 变量 和 函数 封装到一起 ; C++ 编译器 需要处理 将 " 面向对象封装结构 " 转为 " 计算机实际程序结构 " 的 工作 ; C++ 的 对象模型 和 成员函数 ; 成员变量是对象中的数据 , 成员函数是对象中的行为 ; 4、代码示例 - 对象内存结构测试 执行下面的代码示例 , 所有的类的大小都是 12 字节 , 只有 3 个 int 类型成员变量 class C { public: int a; int b; int c; static int s; public: int fun() { return 4;
是枪类的属性,每把枪都有子弹数,所以子弹数也是一个属性 发生子弹是一个行为,所以是一个方法 装填子弹也是一个行为,也是一个方法 许三多是姓名,是士兵类的属性;士兵拥有枪,所以枪也是一个属性,对应的是枪类【一个对象的属性可以是另外一个类创建的对象 】 开火是士兵类的一个行为,所以是一个方法,开火会发射子弹,所以应该调用枪的发射方法 类图 本次实战采用封装思想,将所有属性私有化,并且每个属性都有 setter、getter 方法 代码实现 面向对象编程的第一步 :将属性和方法封装到一个抽象的类中 外接使用类创建对象,然后让对象调用方法 对象方法的细节都被封装在类的内部 先开发枪类还是士兵类? __bullet_count = 0 # 自定义打印对象方法 def __str__(self): return f"枪名:{self. __gun = None # 自定义打印对象方法 def __str__(self): return f"士兵名字:{self.__name} 拿着一把:{self.
现在一般的语言都支持面向对象,而java更是将其做到很过分的地步,java是强制使用面向对象的写法,简单的写一个Hello Word都必须使用面向对象,这也是当初我很反感它的一点,当然现在也是很不喜欢它这一点 但是不得不说它设计的很优秀也很流行。 面向对象 面向对象一般是将一些独立有相似功能的模块封装起来组成一个类,然后调用者不必关注实现细节而只需要关注调用某个类方法即可。面向对象简化了程序设计。 与之相对应的是面向过程,而C就是典型的面向过程的程序设计语言。 面向对象一般有3种特性:封装、继承、多态。这次主要讲述的是java中的封装型。 只允许同一个包或者同一个类的成员访问,最后的private仅允许同一个类的成员访问,它们的访问权限是递增的,也就是public > protected > friendly > private 封装性 面向对象的封装性就体现在仅仅允许通过类方法访问类成员 而在java中,当垃圾回收器将要释放无用对象的内存时,先调用该对象的finalize()方法。
面向对象设计概述 面向对象程序设计 (Object-Oriented Programming, OOP) 是当今主流的程序设计范型,它取代了 20 世纪 70 年代的 "结构化" 或过程式编程技术。 (上面的列表来自于 1994 年 Grady Booch/Addison-Wesley 出版的《面向对象分析与设计》一书。) 采用面向对象的设计风格,可能只需要大约 100 个类,每个类平均包含 20 个方法。这明显易于程序员掌握,也容易找到 BUG。 因为在 Ivan 的程序设计中,使用了我们现在称为 "对象" 的表现形式来描述现实生活中的几何图形,这些图形对于设计人员来说是完全可以理解的! 面向对象设计的特殊效率从何而来? 部分影响来自于更清晰的表达复杂系统的方式; 也许最重要的原因 (也是从操作系统体系结构派生而来的) 是,当您给某人一个结构时,您很少希望他们拥有无限的特权。
当我们需要再一个类中与另一个类建立关系时,通过命名空间来区别不同的类。所以需要我们这样做:导入命名空间 方式有三