数据或信息隐藏是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)
我猜数据隐藏你的意思是封装或在对象中有一个变量,只有通过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方法中通过添加来修改类实例中的内容.