我试图了解面向对象的编程。关于封装,我是这样理解的。
“封装”是指对象隐藏其他类和程序集不必要的数据和行为的能力。
在封装的帮助下,类可以更改内部实现,而不会损害系统的整体功能。
防止由于编程错误而导致代码(数据)意外损坏
封装使一组属性,方法和其他成员被视为单个单元或对象。”
因此,对于封装的数据隐藏/安全性,我理解它就像从团队中其他程序员那里保护数据一样,因为有可能由于编程错误而损坏数据
我的问题是,“我对封装的数据安全性/数据隐藏的理解是正确的吗?或者,它是否不仅限于保护程序员的数据,还使黑客也能保护数据?吗?”
答案 0 :(得分:0)
封装更像是逻辑,而不是人员。封装是隐藏不相关的细节的行为。
例如,您使用计算机。但是您看不到CPU的外观。它被封装或隐藏在所有塑料物品后面。
在面向对象的编程中,通常有这样一种代码:
CLASS {
METHOD {
// some code
}
}
“封装”的示例将具有普通用户看不见的“方法”(示例:私有)。
封装:信息隐藏。
现实生活中的封装示例:
答案 1 :(得分:0)
封装与外部黑客无关,它不是数据安全概念,而是更多关于编程模型的信息。这是一个示例:
class Engine
{
public bool Running { get; private set; }
public void Start()
{
this.Running = true;
}
public void Stop()
{
this.Running = false;
}
}
这是一个简单的模型,Engine
可以通过其实例方法来Start
/ Stop
,这实际上改变了Running
属性。如果要启动/停止Engine
,只需调用相应的方法。我们可以说Engine
的行为被很好地封装了。
让我们更改代码
class Engine
{
public bool Running { get; set; } //set is changed to public
}
现在,代码更短,更简单,如果我们要启动引擎,只需将Running
设置为true
(或在要停止时为false)即可。随着项目的发展,您将有几种方法可以更改Running
属性来启动引擎。
这是一个新情况1:有时引擎失控,然后无法启动/停止。如果您使用的是旧版本,则可以轻松地将代码更改为:
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.Start
和Engine.Stop
的呼叫者不会受到影响。那“简单”版本呢?您需要更改10个(或100个以上)呼叫者,并在更改OutOfControl
属性之前检查Running
属性。
然后是一个新的case2,case3 ...“更简单”的版本变得越来越难维护。因为它向调用者公开了实现细节。每次启动/停止实现更改时,第一个版本(封装良好的版本)只需要更改启动/停止方法,因为它是执行该行为的唯一位置。