为什么封装是 OOP 语言的一个重要特性? [关闭]

2024-01-11

我遇到过不同的采访,其中有人问我为什么使用封装?封装实际上是谁的需求?是针对程序用户的吗?还是为了同事?或者是为了保护代码免受黑客攻击?


封装有助于将实现细节与暴露给类的客户端(使用此类的其他类/函数)的行为隔离开来,并让您能够更好地控制coupling http://en.wikipedia.org/wiki/Coupling_%28computer_programming%29在你的代码中。考虑这个例子,类似于罗伯特·马丁书中的例子干净的代码 https://rads.stackoverflow.com/amzn/click/com/0132350882:

public class Car
{
//...
public float GetFuelPercentage() { /* ... */ };

//...

private float gasoline;
//...
}

请注意,使用为您提供汽车燃油量的函数的客户端并不关心汽车使用什么类型的燃油。这种抽象将关注点(燃料量)与不重要的(在这种情况下)细节分开:无论是天然气、石油还是其他任何东西。

第二件事是,该类的作者可以自由地对类的内部进行任何他们想做的事情,例如将汽油改为石油,以及其他事情,只要他们不改变其行为。这要归功于这样一个事实:他们可以确定没有人依赖这些细节,因为它们是私有的。代码中的依赖项越少,代码就越灵活且易于维护。

另一件事,正确地注明在被低估的答案 https://stackoverflow.com/a/18301027/2642204 by 乌特纳皮什丁 https://stackoverflow.com/users/186997/utnapistim:低耦合还有助于测试代码并维护这些测试。类的接口越简单,测试就越容易。如果没有封装,所有内容都暴露出来,就很难理解要测试什么以及如何测试。

重申评论中的一些讨论:

  • 不,封装不是最重要的OOP 中的事情。我什至敢说这不是很重要。重要的事情是封装所鼓励的——比如松散耦合。但这不是必需的 - 细心的开发人员可以在不封装变量等的情况下保持松散耦合。正如所指出的弗拉斯塔丘 https://stackoverflow.com/users/1796835/vlastachuPython 是一种没有强制封装机制的语言的一个很好的例子,但它对于 OOP 仍然是可行的。

  • 不,将您的字段隐藏在访问器后面不是封装。如果您所做的唯一一件事就是在变量前面写“private”,然后无意识地为每个变量提供 get/set 对,那么实际上它们没有被封装。代码中远处的某个人仍然可以干预你的类的内部,并且仍然可以depend在他们身上(当然,这是a bit最好它们依赖于方法,而不是字段)。

  • 不,封装的主要目标不是避免错误。主要目标至少与上面列出的目标相似,并且认为封装可以防止您犯错误是天真的。除了更改私有变量之外,还有很多其他方法会导致错误。更改私有变量并不难查找和修复。再说一遍 - Python 是这个论点的一个很好的例子,因为它可以在不强制执行的情况下进行封装。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么封装是 OOP 语言的一个重要特性? [关闭] 的相关文章

  • 在 Javascript 构造函数中引用实例变量

    我试图通过执行以下操作来维护对象的状态 obj function this foo undefined this changeState function function this foo bar This is contrived bu
  • 添加类方法后如何更新类的实例?

    我发现自己陷入了困境 我开发了一个类 然后创建了该类的一个实例 这些类通常会执行数据和统计操作 这些操作需要很长时间 有时需要 20 分钟 我将继续开发我的类 并向其中添加其他方法 现在 如何使用新方法更新以前的类实例而不重新初始化该类的旧
  • php oop 如何使用属性和方法形成类

    我是 php oop 的新手 我对类有一些想法 但我仍然不知道如何在创建的对象中使用它的属性和方法 我需要了解下面报告的代码是否正确 如果不正确我做错了什么 我假设我有一个可以为我做任何事情的课程 我们称之为 Class myClass 现
  • 这叫什么类型的建筑?

    对于我当前正在开发的 Web 应用程序 ASP NET MVC 我们采用以下架构 Data Access Layer 将数据持久保存到任意数据库的逻辑 Domain 数据模型 Service Layer 业务逻辑 例如订单处理 账户管理等
  • 为什么要分离接口和实现?

    在生产代码中 我经常看到定义如下的类 public interface SomeComponent Some methods public class SomeComponentImpl implements SomeComponent S
  • 如何动态构造方法?

    我设计了一个类 它非常标准 具有一些方法属性 class foo def f1 self print f1 def f2 self print f2 def fn self print fn 现在我想创建一个包含一组 foo 实例的类 cl
  • UserDict 类的优点?

    使用有什么好处UserDict class 我的意思是 我真正得到的不是 class MyClass object def init self self a 0 self b 0 m MyClass m a 5 m b 7 我将写下以下内容
  • 泛化和专业化——有什么区别

    我很难真正找到泛化和专业化之间的区别 以及何时使用其中之一 谁能启发我吗 最后还有一个使用 UML 的插图 Animal是一个概括 Dog是专业化 您的超类是一个通用类 但您的子类将是您的超类的专门继承者 当您沿着继承层次结构向下移动时 它
  • 不在对象上下文中时使用 $this php

    我刚刚开始学习 php 中的 OOPS 我写了一个简单的程序来实现继承 当不在对象上下文中时 我收到 this 的致命错误 谁能解释一下这个错误 它是什么意思 这是我的代码
  • 用于生成 C++ 代码轮廓/图的工具 - 有这样的东西吗? [复制]

    这个问题在这里已经有答案了 我需要深入研究用 C 编写的软件组件并对其进行一些修改 我幻想生成一些代码映射 它将显示类之间的关系并引导我完成方法的流程 调用图 有这个工具吗 几年前 我使用 Rational Rose 建模工具 该工具具有对
  • 预期设备类型为 cuda 的对象,但在 Pytorch 中获得了设备类型 cpu

    我有以下计算损失函数的代码 class MSE loss nn Module metric L1 L2 norms or cosine similarity mode training or evaluation mode def init
  • Java中的引用变量到底是什么?它与其他变量有何不同?

    我一直在研究 Java 中的继承 作者声明 被引用的对象类型 而不是引用变量的类型 决定了将执行哪个版本的重写方法 这种说法非常令人困惑 这本书所指的是多态性 更具体地通过动态调度 简而言之 想象一下以下类 public class Per
  • 如何让枚举存储每个条目的额外信息

    我有一组包含相关信息的项目 这些项目是由我 程序员 定义的 用户不需要更改它们 它们永远不需要根据配置进行更改 并且它们唯一可能更改的时间是在我的应用程序的未来版本中 我事先知道这些项目应该有多少 以及它们的确切数据是什么 枚举是一种很棒的
  • 如何使用类中的常量作为 php 函数中的参数定义?

    我有一堂课 class FetchMode const FetchAll 0 const FetchOne 1 const FetchRow 2 和一个函数 function getRecordSet FetchMode FetchMode
  • PHP 中可以动态添加数据成员吗?

    我想知道是否可以在 PHP 运行时添加新的类数据成员 Yes prop newname obj gt prop 42 会做同样的事情 obj gt newname 42 如果 obj 尚不存在 则任一者都会将 newname 添加为属性
  • 如何获取MATLAB句柄对象的ID?

    当我尝试使用时出现问题MATLAB 句柄对象 http www mathworks com help techdoc ref handle html作为关键值MATLAB 容器 Map http www mathworks com help
  • 覆盖Java中的属性[重复]

    这个问题在这里已经有答案了 在 Java 中 我最近有几个项目 我使用了这样的设计模式 public abstract class A public abstract int getProperty public class B exten
  • 定时任务应该放在哪一层?

    我正在尝试使用分层架构来实现 DDD 应用程序 我有 基础设施层 实现应用程序的技术特定部分的层 领域层 包含领域模型的层 应用层 包含与领域模型交互的干扰的层 接口层 从外部接收事件的层 经典的 3 层 基础设施 架构非常清晰 但我的应用
  • 工厂模式和策略模式

    我需要创建一个类来负责结果集处理 但可能会发生应该使用不同的算法来处理该结果集的情况 我知道以下选项 1 使用策略模式 伪代码如下 interface Strategy processResultSet ResultSet rs class
  • 关于多客户端和可定制 Web 应用程序的架构所需的建议[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi

随机推荐