数据隐藏的含义是什么?

use*_*432 4 c# oop

OOP最重要的一个方面是数据隐藏.有人可以使用一段简单的代码解释数据隐藏的确切原因以及我们需要它的原因吗?

Unm*_*kar 6

数据或信息隐藏David Paranas提出的设计原则.

它表示你应该在程序的一个部分中隐藏设计决策,这些部分可能会从程序的其他部分发生变化,从而保护其他部分不受第一部分变化的影响.

封装是编程语言功能,可以实现数据隐藏.但请注意,即使没有封装,您也可以隐藏数据\信息.例如,使用非面向对象编程语言中的模块或函数.因此封装不是数据隐藏,而只是实现它的手段.

在进行封装时,如果忽略底层主体,那么你将没有一个好的设计.例如,考虑这个类 -

public class ActionHistory
{
    private string[] _actionHistory;

    public string[] HistoryItems
    {
        get{return _actionHistory; }
        set{ _actionHistory = value; }
    }
}
Run Code Online (Sandbox Code Playgroud)

这个调用封装了一个数组.但它并没有隐藏使用string []作为内部存储的设计决策.如果我们想稍后更改内部存储,它也会影响使用此类的代码.

更好的设计将是 -

public class ActionHistory
{
    private string[] _actionHistory;

    public IEnumerable<string> HistoryItems
    {
        get{return _actionHistory; }
    }
}
Run Code Online (Sandbox Code Playgroud)


djd*_*d87 5

我猜数据隐藏你的意思是封装或在对象中有一个变量,只有通过get和modify方法暴露它,通常当你想强制设置一个值的某些逻辑时?

public class Customer
{
    private decimal _accountBalance;

    public decimal GetBalance()
    {
        return _accountBalance;
    }

    public void AddCharge(decimal charge)
    {
        _accountBalance += charge;
        if (_accountBalance < 0)
        {
            throw new ArgumentException(
                "The charge cannot put the customer in credit");
        }
    }    
}
Run Code Online (Sandbox Code Playgroud)

即在这个例子中,我允许消费类获得平衡Customer,但我不允许他们直接设置它.但是我暴露了一种方法,允许我_accountBalance通过在AddCharge方法中通过添加来修改类实例中的内容.

这是一篇你可能会觉得有用的文章.