热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

OOP设计:可组合对象支持更改

最好的工作工具我相信“组成继承”是最重要的OOP原则,很少有人用OOP语言编写代码,并且很少有开发人员应用。自从我开始编写第一行代码并于2003年获得报
最好的工作工具

我相信“组成继承”是最重要的OOP原则,很少有人用OOP语言编写代码,并且很少有开发人员应用。 自从我开始编写第一行代码并于2003年获得报酬以来,我一直以我在4家公司担任开发人员和面试官的全部经验为基础。坦白说,它也是基于我所做的阅读在过去的几年中,我还可以告诉您,有很多开发人员都比我说得好。

每当我问这个问题时,我参加的所有采访中都没人知道如何解释“继承而不是继承”。 另一方面,我不经常问这个组成问题,我只是把它放在我认为高于平均水平的开发人员面前。 我知道我们都有偏见,所以也许因为我对“高于平均水平”的开发人员的看法而错过了一个很好的解释。

优秀的开发人员的生产率是普通开发人员的10倍 ,但这并不是打字快几倍,它主要是在做出更好的决策。 这些决定可以为您的客户提供其新的强大功能时为您提供所需的灵活性。

基础一切

我们许多Java / C#开发人员都参与了至少一个项目,在该项目中我们可以找到诸如BaseService或BaseManager或BaseClient或BaseHandler或所有它们之类的类。 这样的类明确表明使用继承是出于错误的原因:放置重复代码的地方。 我相信,如果我们以正确的方式使用继承,继承仍然可以为我们提供帮助,这将意味着可以实现多态设计。 我还看到继承可能是我们代码中使用最广泛的OOP概念,因此也许删除它并将其仅替换为接口,可能会对我们的代码有更大的帮助。 在发生这种情况之前,让我尝试解释为什么最好使用复合对象而不使用派生对象。

当我们在学校(计算机科学学院)学习有关继承的信息时,通常会遇到一个例子,例如“狗是哺乳动物”,因此我们可以进行“哺乳动物”课程,例如生孩子,喂孩子喝牛奶,然后我们继承“狗”课程。来自哺乳动物,我们可以添加特定的狗行为,例如吠叫。 这是一个很好的例子,因为只要我们仅使用Dog的哺乳动物行为,就可以使用基类。 因此,我们正在达到多态状态,因为我们可以拥有从哺乳动物继承的其他对象来代替狗。

遗产

设计学校

现在考虑设计学校系统。 当我们说“学校”时,我们大多数人都想到了建筑物,因此设计的第一步就是创建一个建筑班级,该班级成为学校班级的基础班级。 我们认为这是合理的,因为建筑物具有的任何属性和行为都将由学校继承。 然后,我们发现学校是我们上课,学习新事物,参加考试,举行圣诞节庆祝活动等等的地方。 如果学校继承一栋建筑物,仍然没有矛盾。 您仍然可以使用此继承设计一个工作系统。

学校从建筑继承

让我们以一种更加面向对象的方式提出问题:学校是否有建筑物或建筑物? 就像我们在没有正确答案之前说过的那样,您可以从建筑班级继承下来,或者拥有学校的建筑部分,在两种情况下,您都可以为客户的问题提出可行的解决方案。 它更多地是关于未来的变化,即使您的客户现在也不知道这些变化。

我们可以收到功能请求,以创建在线课程和考试,使学习材料使用其他语言,依此类推。 当您从Building继承学校时,某些请求可能会给您带来麻烦,例如在其他城镇中支持新的分支机构。 在这种情况下,学校需要支持多个建筑物,因此构筑会更好。 因此,对于简单的系统来说,继承可能会起作用,但是对于需要更改的系统(今天可能全部更改),组合将是更好的选择。

学校与建筑组成

School and Building是一个简单的示例,我们通常没有足够的精力在代码中使用这些简单的概念。 狗和哺乳动物也一样。 但是,这些概念是解释更复杂概念的最佳起点。 而且我正在考虑举办有关OOP设计的研讨会,其中主要的讨论重点之一是继承之上的组合。 您可以在这里找到更多有关它的信息 。

From: https://hackernoon.com/oop-design-composible-objects-support-change-336d96a1a60f



推荐阅读
  • ZSI.generate.Wsdl2PythonError: unsupported local simpleType restriction ... [详细]
  • 在Kubernetes上部署JupyterHub的步骤和实验依赖
    本文介绍了在Kubernetes上部署JupyterHub的步骤和实验所需的依赖,包括安装Docker和K8s,使用kubeadm进行安装,以及更新下载的镜像等。 ... [详细]
  • 本文详细解析了JavaScript中相称性推断的知识点,包括严厉相称和宽松相称的区别,以及范例转换的规则。针对不同类型的范例值,如差别范例值、统一类的原始范例值和统一类的复合范例值,都给出了具体的比较方法。对于宽松相称的情况,也解释了原始范例值和对象之间的比较规则。通过本文的学习,读者可以更好地理解JavaScript中相称性推断的概念和应用。 ... [详细]
  • Firefox火狐浏览器关闭到http://detectportal.firefox.com的流量问题解决办法
    本文介绍了使用Firefox火狐浏览器时出现关闭到http://detectportal.firefox.com的流量问题,并提供了解决办法。问题的本质是因为火狐默认开启了Captive portal技术,当连接需要认证的WiFi时,火狐会跳出认证界面。通过修改about:config中的network.captive-portal-service.en的值为false,可以解决该问题。 ... [详细]
  • 使用Ubuntu中的Python获取浏览器历史记录原文: ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • 本文介绍了计算机网络的定义和通信流程,包括客户端编译文件、二进制转换、三层路由设备等。同时,还介绍了计算机网络中常用的关键词,如MAC地址和IP地址。 ... [详细]
  • 本文介绍了通过ABAP开发往外网发邮件的需求,并提供了配置和代码整理的资料。其中包括了配置SAP邮件服务器的步骤和ABAP写发送邮件代码的过程。通过RZ10配置参数和icm/server_port_1的设定,可以实现向Sap User和外部邮件发送邮件的功能。希望对需要的开发人员有帮助。摘要长度:184字。 ... [详细]
  • 自动轮播,反转播放的ViewPagerAdapter的使用方法和效果展示
    本文介绍了如何使用自动轮播、反转播放的ViewPagerAdapter,并展示了其效果。该ViewPagerAdapter支持无限循环、触摸暂停、切换缩放等功能。同时提供了使用GIF.gif的示例和github地址。通过LoopFragmentPagerAdapter类的getActualCount、getActualItem和getActualPagerTitle方法可以实现自定义的循环效果和标题展示。 ... [详细]
  • imx6ull开发板驱动MT7601U无线网卡的方法和步骤详解
    本文详细介绍了在imx6ull开发板上驱动MT7601U无线网卡的方法和步骤。首先介绍了开发环境和硬件平台,然后说明了MT7601U驱动已经集成在linux内核的linux-4.x.x/drivers/net/wireless/mediatek/mt7601u文件中。接着介绍了移植mt7601u驱动的过程,包括编译内核和配置设备驱动。最后,列举了关键词和相关信息供读者参考。 ... [详细]
  • flowable工作流 流程变量_信也科技工作流平台的技术实践
    1背景随着公司业务发展及内部业务流程诉求的增长,目前信息化系统不能够很好满足期望,主要体现如下:目前OA流程引擎无法满足企业特定业务流程需求,且移动端体 ... [详细]
  • Linux如何安装Mongodb的详细步骤和注意事项
    本文介绍了Linux如何安装Mongodb的详细步骤和注意事项,同时介绍了Mongodb的特点和优势。Mongodb是一个开源的数据库,适用于各种规模的企业和各类应用程序。它具有灵活的数据模式和高性能的数据读写操作,能够提高企业的敏捷性和可扩展性。文章还提供了Mongodb的下载安装包地址。 ... [详细]
  • Java在运行已编译完成的类时,是通过java虚拟机来装载和执行的,java虚拟机通过操作系统命令JAVA_HOMEbinjava–option来启 ... [详细]
  • 本文介绍了Python爬虫技术基础篇面向对象高级编程(中)中的多重继承概念。通过继承,子类可以扩展父类的功能。文章以动物类层次的设计为例,讨论了按照不同分类方式设计类层次的复杂性和多重继承的优势。最后给出了哺乳动物和鸟类的设计示例,以及能跑、能飞、宠物类和非宠物类的增加对类数量的影响。 ... [详细]
  • 解决nginx启动报错epoll_wait() reported that client prematurely closed connection的方法
    本文介绍了解决nginx启动报错epoll_wait() reported that client prematurely closed connection的方法,包括检查location配置是否正确、pass_proxy是否需要加“/”等。同时,还介绍了修改nginx的error.log日志级别为debug,以便查看详细日志信息。 ... [详细]
author-avatar
拍友2702933273
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有