`
langyu
  • 浏览: 888234 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

我所认识的软件开发原则:封装

阅读更多

      在Google搜索封装,给出信息隐藏这样的一个概念。把复杂度隐藏于实体内部,对外提供简单,精练的访问接口。这个原则普遍存在于现实生活中,在软件开发领域也始终提倡着。Java向来倡导程序封装,面向接口编程,以提高工程开发和维护效率。

      说到封装,让我想起大四的一次面试经历。面试官抛出的惟一与技术有关的一个问题是:你觉着面向对象思想的特点中,哪个特点是最重要的? 以当时熟背面向对象思想,写过两三天Java程序的经验,我很郑重地回答:封装。之后这次不成功的面试经历留给我最大的疑问就是,难道封装不是最重要的么?

      当然什么是面向对象思想最重要的特点,以当年浅显的认识是不敢再去探究的。时至今日,也不敢对当初的问题做出肯定的回答,但这个简单有效的原则在软件设计和开发过程中所使用的频度,很明显地确立着它的重要性。

      日常开发中,频繁使用接口对调用者隐藏逻辑实现。就是在自己的具体实现中,模块与模块之间做到有序封装,这种思想可以体现在最基础的那个方法或是那行代码上。例如提供时间格式转换的类,与调用者之间的联系就是你给我时间等参数,我给你正确的时间格式。至于具体怎样实现,调用者不需要关注。

      从最底层的逻辑实现到中层的数据包装,再到高层的服务,层与层之间的关系变得简单明了。OSI七层协议是最好的例子,每层只关注自己在数据交换中所扮演的角色:包装上层传入的数据;对从下层接收到的数据做解包装。研究网络不同领域的技术人员只专注于不同的处理层,对于每层逻辑实现的变更,不会影响与其它层的数据传输接口。
     

      对于这样的成功的例子可以列举出很多,但它们遵循的封装原则是类似的。这些例子的殊途同归预示着我们可以总结出运用封装原则的一些基本点。下面就我最关心的一个问题做初步的分析。

什么时候开始封装
   
  • 模块之间逻辑纠缠不清:这种纠缠小到底层实现,大到系统与系统,网络与网络的交互。 在代码实现层面,我们一般使用代码结构化封装,如类与方法。类处理自己分摊到的系统职责,管理一系列与职责相关的具体实现。方法独立或与其它方法配合完成任务,方法间做到责任明确,协作简单。在模块层面,各模块管理众多类来完成较大任务,也需要保持独立,简洁的数据传递。当然正常情况下这种模块间的交互不是很复杂。在这里就可以采用很多设计模式提高代码的结构与表达能力。在更高层,系统或网络之间,我们必须保证不能有复杂的逻辑交互,因为有网络带宽,系统负载等条件的影响。系统之间可以传输简单有效的数据。可以在响应时间,处理效率上做出让步。
  • 责任划分:正常情况下,系统或模块有众多人员开发维护。对模块的封装,有利于每个人理清自己的责任。
  • 安全考量:对于有些涉及安全问题的模块,如权限或机密业务数据,单独开发维护,只对外提供基本的服务。
  • 发挥专业性:每个人所擅长的领域不一样,在模块封装时就可以考虑把合适的事情交给最擅长的人去做。比如项目需考虑业务处理时效率,就可以编程语言来划分不同的模块达到有效交互的目的。
  • 降低使用复杂度:用户始终需要最简洁方便的交互。一个只会QQ聊天的用户只应该觉着上网如此简单,而不在乎这个东西到底是多么的纷繁复杂。程序与程序之间,暴露过多内部实现细节,会让调用者无比困惑。
      上面说了太多封装原则的好处,至少让我觉的,这个简单的原则可以适用于任何地方。就是非要找它的缺点,以我的理解应该有这样一些方面:
  
  • 增加学习成本:对于想了解系统或模块具体业务实现的人来说,层层封装显得过于封闭。爱因斯坦拆闹钟的时候也许非常急躁吧。
  • 封装的异常情况:把台灯插到插座上没亮,经过很多测试,得出是插座的问题。那到底是插座里面的线断掉了还是插座的接线断掉了,无从得知。模块接收到调用者的请求后如果没法处理数据,应该怎么办?把任务抛弃什么也不做,还是返回错误状态告诉调用者这里出错了。这些错误情况的处理方式 对于调用者来说有着很大的区别。如果能返回正确有错误状态,那么调用者就可以做相应的异常处理机制。否则会很莫名,只有千万百计深入到模块内部查看问题。
      其实呢,对于这样一个普遍的原则,过多的解释和定义是不恰当的,有引简为繁的误解。但归根结底,我想表述的是这种原则的重要性。无论在是生活还是在编码中,处处可见它的身影,让我体会到很多益处。物极必反,过多使用封装也有增加程序的复杂度。




我所认识的软件开发原则:权衡
我所认识的软件开发原则:简单表述
我所认识的软件开发原则:二八原则
我所认识的软件开发原则:减少等待时间

1
0
分享到:
评论

相关推荐

    da06抽象继承封装多态接口.zip

    在编程领域,面向对象编程(OOP)是设计和...这个案例有助于提升对Flutter开发的理解,同时也能加深对面向对象编程原则的认识。在实践中,这样的设计模式能帮助我们编写出更灵活、可维护的代码,适应不断变化的需求。

    软件开发工具复习资料(自考)汇编.pdf

    软件开发工具的功能可以分为两方面:一是定性功能,包括认识与描述客观系统,存储管理开发过程中的信息,代码的编写生成,文档的编制生成,软件项目的管理等;二是定量功能,包括表达能力或描述能力,保持信息一致性...

    Java软件开发实战 Java基础与案例开发详解 1-2 认识java语言 共10页.pdf

    ### Java软件开发实战:Java基础与...综上所述,Java语言凭借其强大的功能集、跨平台特性以及丰富的类库支持,在软件开发领域占据着不可动摇的地位。无论是初学者还是经验丰富的开发者,都能够从Java的强大功能中受益。

    自考软件开发工具复习资料

    "自考软件开发工具复习资料" 软件开发工具是一种在高级程序设计语言(第三代语言)的基础上,为提高软件开发的质量和效率,从规划、分析、设计、测试、成文和管理各方面,对软件开发者提供各种不同程度的帮助的一类...

    企业级应用软件架构开发过程与实践4

    软件工程,作为一种学科,旨在借鉴传统工程学的组织管理原则,解决现代软件开发面临的复杂性和团队协作需求。它强调将软件开发视为一个有序的过程,包括需求分析、设计、编码、测试、维护等多个阶段。这一过程不仅...

    02-软件设计原则 模式深度解析和案例分析

    ### 软件设计原则与模式深度解析及案例分析 #### 一、软件设计原则的重要性与深度解析 软件设计原则是构建高质量软件的基础。遵循良好的设计原则可以帮助开发者编写出易于维护、扩展性强、且具有良好性能的软件...

    03. 控制软件复杂度的原则1

    软件系统的复杂度是软件开发中最大的挑战之一,如何控制软件复杂度是软件开发者最关心的问题。控制软件复杂度的原则可以分为三个方面:规模、结构和变化。首先,我们需要认识到软件系统的复杂本性,并寻找到简化系统...

    软件开发人员实习日记.docx

    通过这段实习经历,实习生不仅提升了编程技能,还深入理解了软件开发中的设计原则和最佳实践,如设计模式的应用、XML配置的处理以及面向对象编程思想。同时,也体验了团队协作和项目管理,对于软件开发的整个流程有...

    C#版得墨忒耳定律重新认识面向对象的封装属性和方法

    遵循LoD,我们可以更好地理解和设计面向对象的封装属性和方法,从而创建出更健壮的软件系统。 在C#中,面向对象的核心概念包括类、对象、封装、继承和多态。封装是面向对象的核心特性之一,它将数据和操作这些数据...

    江西农业大学《软件工程》期末考试复习资料.pdf

    江西农业大学《软件工程》课程所包含的知识点广泛,涉及软件开发的各个阶段以及方法论和工具。以下是一些从文件内容中提取的知识点,涵盖了软件工程的基础理论和实践应用。 1. 软件工程的基本概念 - 软件危机:指...

    软件工程-1.软件工程概述测试题

    1. **定义**:软件工程是一门指导计算机软件开发和维护的工程学科,旨在采用工程的原则、方法和技术来提高软件开发的效率和质量。 2. **研究内容**: - **方法与技术**:包括需求分析、设计、编码、测试等方面的...

    中小型水利工程CAD软件开发及应用.pdf

    在软件开发指导思想的指导下,需要进行详细且必要的分析和设计工作,从而确保软件能够适应中小型水利工程的特殊要求。 本文通过探讨中小型水利工程CAD软件的开发与应用,旨在帮助读者理解和认识CAD技术在水利工程中...

    Java软件开发实战 Java基础与案例开发详解 20-1 项目实战2-网络五子棋与网络版JQ的开发 共17页.pdf

    根据提供的文档信息,我们可以归纳出该文档主要涵盖了Java软件开发的基础知识及项目实战案例,特别是针对网络五子棋和网络版JQ(类似QQ的聊天工具)的开发过程进行了详细介绍。接下来,我们将从文档的标题、描述以及...

    61条面向对象设计的经验原则

    - **原则描述**:适时引入框架以提高开发效率。 - **实践建议**:评估项目规模和需求后决定是否采用现成框架。 #### 22. 避免过度设计 - **原则描述**:不要过度规划未发生的事情。 - **实践建议**:专注于当前的...

    电子科技大学软件开发环境实验报告.docx

    【电子科技大学软件开发环境实验报告】 本实验报告主要围绕软件开发环境中的编程实践,特别是针对互联网领域的技术应用。实验的核心任务是实现Huffman编码算法,用于文件的压缩和解压,以此来锻炼和巩固学生对分割...

    软件工程考试题库完整.doc

    软件工程是指在软件开发、维护和更新过程中,为了提高软件的质量、可靠性和效率,遵循一定的原则、方法和技术来规划、设计、实施和管理的活动。软件工程考试题库完整.doc涵盖了软件工程的各个方面,包括软件定义、...

    SE_softwareengineering_engineering_

    6. 原则6:强调文档的重要性,记录软件开发的全过程,方便后期维护。 7. 原则7:通过系统测试确保软件的可靠性,采用自动化工具进行回归测试和性能评估。 四、软件工程方法学 1. 结构化方法:以自顶向下、逐步细化...

    软件工程简答题(东南复试)

    1. **封装:**将数据和操作数据的方法封装在一起。 2. **继承:**允许类之间的继承关系,提高代码重用性。 3. **多态:**同一接口可以表示不同的实现方式。 4. **模块化:**通过类和对象来实现高度模块化的系统。 *...

    软件开发概要设计说明书.pdf

    在这个过程中,我们将基于数据流图来转化成软件结构和数据结构,构建出目标系统的逻辑模型,确保软件开发人员对系统有统一的认识。 本项目是待开发的“宿舍管理系统”,旨在服务校园内的全体师生及相关工作人员。...

Global site tag (gtag.js) - Google Analytics