访问修饰符如何抑制年轻专业人员的发展

最受欢迎的OO语言提供了诸如修饰符之类的工具来访问方法或字段。 这对经验丰富的程序员来说是好的,但这并不是封装入门的起点。 下面我将解释原因。



免责声明 本文不是呼吁采取行动,也没有说明隐藏数据是唯一合理的正确方法。 本文旨在为读者提供有关封装的新观点。 在许多情况下,最好使用访问修饰符,但这并不是对接口保持沉默的原因。

通常,封装被定义为对客户端隐藏对象的内部实现的一种方法,以保持对象的完整性并隐藏此内部实现的复杂性。

有几种方法可以实现这种隐藏。 一种是使用访问修饰符,另一种是使用接口(协议,头文件等)。 还有其他棘手的功能,但本文与之无关。

乍一看,访问修饰符在隐藏实现方面似乎更强大,因为它们可以分别控制每个字段并提供更多访问选项。 实际上,这在某种程度上只是创建类的多个接口的捷径。 访问修饰符提供的机会不比接口广泛,因为它们表达自己的只是一个细节。 关于她下面。


Java中不同的访问修饰符指示的字段可见性。

下面的代码片段显示了一个类,该类具有对方法的访问修饰符以及接口形式的等效表示形式。

public class ConsistentObject { public void methodA() { /* ... */ } protected void methodB() { /* ... */ } void methodC() { /* ... */ } private void methodD() { /* ... */ } } public interface IPublicConsistentObject { void methodA() { /* ... */ } } public interface IProtectedConsistentObject: IPublicConsistentObject { void methodB() { /* ... */ } } public interface IDefaultConsistentObject: IProtectedConsistentObject { void methodC() { /* ... */ } } 

协议具有几个优点。 值得一提的是,这是在OOP中实现多态的主要手段,这种新方式比新方法要晚得多。

使用协议的唯一困难是您需要控制创建对象的过程。 精确地需要生成模板,以保护包含特定类型的危险代码免受与接口配合使用的纯代码的侵害。 遵循这个简单的规则,我们得到与使用限定符相同的封装,但是同时我们获得了更大的灵活性。

这样的代码在C#中

 public class DataAccessObject { private void readDataFromFixedSource() { // ... } public byte[] getData() { // ... } } 

等同于客户端的功能。

 public class DataAccessObjectFactory { public IDataAccessObject createNew() { return new DataAccessObject(); } } public interface IDataAccessObject { byte[] getData(); } class DataAccessObject: IDataAccessObject { void readDataFromFixedSource() { // ... } public byte[] getData() { // ... } } 

由于存在访问修饰符,因此初学者很长时间不会了解接口。 因此,他们没有使用PLO的真正功能。 也就是说,存在一些概念替代。 毫无疑问,访问修饰符是OOP的一个属性,但它们也从打开OOP的界面中拉开了覆辙。

此外,界面使您可以自觉地选择客户端可以从对象接收的功能。 也就是说,我们有机会为不同的客户端提供完全不相关的协议,而修饰符则不能区分客户端。 这是支持接口的一大优势。

Source: https://habr.com/ru/post/zh-CN477142/


All Articles