封装和数据安全

Encapsulation and data security

我正在尝试理解面向对象编程。关于封装,我是这样理解的

"封装,指的是一个对象隐藏其他classes&程序集不需要的数据和行为的能力。

借助封装,class 可以在不损害系统整体功能的情况下更改内部实现。

防止代码(数据)因编程错误而意外损坏

封装使一组属性、方法和其他成员被视为一个单元或对象。"

因此,当涉及到数据 hiding/security 封装时,我理解它就像保护团队中其他程序员的数据一样,因为数据有可能因编程错误而损坏

我的问题是,"Is my understanding about data security/data hiding with respect to encapsulation is correct? Or, whether it is not limited to securing data from programmers alone and it enables securing data from hackers as well ?"

封装更多的是写代码的逻辑角度,而不是人的角度。封装是隐藏不相关细节的行为。

例如,您使用电脑。但是你看不到 CPU 是什么样子的。它有点封装或隐藏在所有塑料材料后面。

在面向对象编程中,通常会有这样的代码:

CLASS {
  METHOD { 
    // some code
  }
}

"encapsulation" 的一个示例是拥有普通用户看不到的方法(示例:私有)。

封装:- 信息隐藏。

封装的真实例子:

  1. 胶囊
  2. 钱包
  3. 盒子

封装与外界黑客无关,不是数据安全概念,更多的是编程模型。这是一个例子:

    class Engine
    {
        public bool Running { get; private set; }

        public void Start()
        {
            this.Running = true;
        }

        public void Stop()
        {
            this.Running = false;
        }
    }

这是一个简单的模型,Engine可以通过它的实例方法Start/Stop,本质上改变了Running属性。如果你想start/stop一个Engine,调用相应的方法即可。我们可以说 Engine 的行为被很好地封装了。

让我们更改代码

    class Engine
    {
        public bool Running { get; set; }    //set is changed to public
    }

现在代码更短更简单,如果我们想启动一个引擎,只需将 Running 设置为 true(如果您想停止,则设置为 false)。随着项目的增长,您将有几种方法可以更改 Running 属性 来启动引擎。

又来了一个新的案例1:有时候发动机失控了那不可能started/stopped。如果您使用的是旧版本,很容易将代码更改为:

    class Engine
    {
        public bool Running { get; private set; }

        public bool OutOfControl { get; private set; }

        public void Start()
        {
            if (this.OutOfControl) return;
            this.Running = true;
        }

        public void Stop()
        {
            if (this.OutOfControl) return;
            this.Running = false;
        }

        public void SomeOperation()
        {
            //inside the method sometimes OutOfControl is set to true
        }
    }

Engine.StartEngine.Stop的来电者不会受到影响。 "simpler" 版本呢?您需要更改 10+(或 100+)个呼叫者,在更改 Running 属性.

之前检查 OutOfControl 属性

然后出现了新的 case2、case3..."simpler" 版本变得越来越难维护。因为它向调用者公开了实现细节。每次 start/stop 实现发生变化时,第一个版本(封装良好的版本)只需要更改 start/stop 方法,因为它是唯一执行行为的地方。