热门标签 | 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



推荐阅读
  • Explore a common issue encountered when implementing an OAuth 1.0a API, specifically the inability to encode null objects and how to resolve it. ... [详细]
  • 本文详细介绍了Java中org.neo4j.helpers.collection.Iterators.single()方法的功能、使用场景及代码示例,帮助开发者更好地理解和应用该方法。 ... [详细]
  • Explore how Matterverse is redefining the metaverse experience, creating immersive and meaningful virtual environments that foster genuine connections and economic opportunities. ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • 深入解析Spring Cloud Ribbon负载均衡机制
    本文详细介绍了Spring Cloud中的Ribbon组件如何实现服务调用的负载均衡。通过分析其工作原理、源码结构及配置方式,帮助读者理解Ribbon在分布式系统中的重要作用。 ... [详细]
  • DNN Community 和 Professional 版本的主要差异
    本文详细解析了 DotNetNuke (DNN) 的两种主要版本:Community 和 Professional。通过对比两者的功能和附加组件,帮助用户选择最适合其需求的版本。 ... [详细]
  • 2023年京东Android面试真题解析与经验分享
    本文由一位拥有6年Android开发经验的工程师撰写,详细解析了京东面试中常见的技术问题。涵盖引用传递、Handler机制、ListView优化、多线程控制及ANR处理等核心知识点。 ... [详细]
  • 本文详细探讨了JDBC(Java数据库连接)的内部机制,重点分析其作为服务提供者接口(SPI)框架的应用。通过类图和代码示例,展示了JDBC如何注册驱动程序、建立数据库连接以及执行SQL查询的过程。 ... [详细]
  • 使用 Azure Service Principal 和 Microsoft Graph API 获取 AAD 用户列表
    本文介绍了一段通用代码示例,该代码不仅能够操作 Azure Active Directory (AAD),还可以通过 Azure Service Principal 的授权访问和管理 Azure 订阅资源。Azure 的架构可以分为两个层级:AAD 和 Subscription。 ... [详细]
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • 将Web服务部署到Tomcat
    本文介绍了如何在JDeveloper 12c中创建一个Java项目,并将其打包为Web服务,然后部署到Tomcat服务器。内容涵盖从项目创建、编写Web服务代码、配置相关XML文件到最终的本地部署和验证。 ... [详细]
  • MQTT技术周报:硬件连接与协议解析
    本周开发笔记重点介绍了在新项目中使用MQTT协议进行硬件连接的技术细节,涵盖其特性、原理及实现步骤。 ... [详细]
  • UNP 第9章:主机名与地址转换
    本章探讨了用于在主机名和数值地址之间进行转换的函数,如gethostbyname和gethostbyaddr。此外,还介绍了getservbyname和getservbyport函数,用于在服务器名和端口号之间进行转换。 ... [详细]
  • 本文详细介绍了Java中org.w3c.dom.Text类的splitText()方法,通过多个代码示例展示了其实际应用。该方法用于将文本节点在指定位置拆分为两个节点,并保持在文档树中。 ... [详细]
  • 使用Vultr云服务器和Namesilo域名搭建个人网站
    本文详细介绍了如何通过Vultr云服务器和Namesilo域名搭建一个功能齐全的个人网站,包括购买、配置服务器以及绑定域名的具体步骤。文章还提供了详细的命令行操作指南,帮助读者顺利完成建站过程。 ... [详细]
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社区 版权所有