Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/367.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么许多开发者反对使用;“受保护”;OOP中的修饰符?_C#_Java_Language Agnostic_Oop - Fatal编程技术网

C# 为什么许多开发者反对使用;“受保护”;OOP中的修饰符?

C# 为什么许多开发者反对使用;“受保护”;OOP中的修饰符?,c#,java,language-agnostic,oop,C#,Java,Language Agnostic,Oop,我的一位同事正在上面向对象编程入门课,他的教授向他提出了一个讨论问题: 为什么许多开发人员反对在类上/类内使用“受保护”修改器? 当这个问题在午餐时被提出时,我的同事和我都想不出为什么有人会反对在类中使用protected修饰符。把问题的前提放在一边(假设许多开发人员实际上反对受保护的修饰符;是吗?),我们试图找出原因 就个人而言,我在类上使用protectedaccess修饰符的唯一次数是在编写代码时,我可能希望在测试环境中补充这些代码。例如,我可能编写一个没有调试信息的基类,然后创建一个新类

我的一位同事正在上面向对象编程入门课,他的教授向他提出了一个讨论问题:

为什么许多开发人员反对在类上/类内使用“受保护”修改器?

当这个问题在午餐时被提出时,我的同事和我都想不出为什么有人会反对在类中使用
protected
修饰符。把问题的前提放在一边(假设许多开发人员实际上反对
受保护的
修饰符;是吗?),我们试图找出原因

就个人而言,我在类上使用
protected
access修饰符的唯一次数是在编写代码时,我可能希望在测试环境中补充这些代码。例如,我可能编写一个没有调试信息的基类,然后创建一个新类进行测试,从基类继承并覆盖其方法,以便在基类方法调用之前/之后添加调试输出代码。我想我可以同样轻松地使用一个包含接口和依赖项注入的设计来实现相同的目标,但我对
protected
的唯一体验是出于测试目的。在这种情况下,避免
protected
的唯一原因是您可以用更好的方式完成同样的事情

为什么开发人员会反对在OOP设计中使用
protected
修饰符


注意:因为教授提出的是一个通用的OOP问题,不是特定于任何一种语言,我不确定答案的权重是否会因为C#、Java等中受保护的
的不同实现而有所不同,您破坏了封装,因为子类可以直接修改变量。

在不进行大量轮询的情况下,我只是猜测一下,这里主要讨论应用于成员函数的受保护修饰符

我怀疑这是因为类成员上的
protected:
明确允许未来用户修改类行为。一般来说,这是很难计划的。问题在于你需要处理和记录多少未知数

如果您的库允许子类重写受保护的方法,那么您必须小心,对于不熟悉库的特定要求的程序员来说,受保护方法的每次调用都是安全的。这需要仔细的文档记录,而且目前还没有一种很好的方法来限制流行语言的使用


例如,假设您有一个相当完整的接口库,它提供了一个CImage类。您的屏幕光栅机制在绘图期间“锁定”此CImage类。但是您的CImage类提供了一个受保护的“getPixel()”函数。您库的用户为了在其他地方自己使用而重写了该函数,并试图锁定该图像。这类问题对于文档中的通信非常重要,对于每个受保护的成员函数或一点功能来说,都是一个棘手的问题。

就我个人而言,我几乎从不使用受保护的字段。这可能很危险,简单的访问器可以避免任何不必要的更改

对于受保护的字段/方法,子类依赖于父类的内部结构,这对耦合非常不利。这是一种说“我有一个‘private’方法/字段,但是我的子类可以使用它”,更糟糕的是“可以重写/修改它”

这不是我的观点,但我可以理解一些开发人员觉得
受保护的
修饰符使用起来很难看


资源:


    • 开发人员不会抱怨保护措施,直到他们阻止开发人员获得他们想要使用的东西。对于创建子类的开发人员来说,受保护并不是什么大问题,因为他们可以从子类中访问商品

      对于使用给定类(而不是扩展它)的开发人员来说,受保护的模块会阻止访问潜在的丰富的内部实现细节。这就是他们会抱怨的

      可以说,一些框架设计师在隐私方面犯了太多的错误——拒绝访问所有内容,只允许访问特定的文档化、受支持的功能。当你知道里面有一些好的东西可以用来解决你眼前的问题时,这会令人沮丧,但是考虑一下反面:如果你的框架是由那些免费访问所有东西的人设计的,那么所有的内部细节都会被实现,在将来某个时候更新框架时,您很可能会遇到以下两种情况之一:

    • 更新后的框架更改了代码所依赖的实现细节,代码中断
    • 设计者意识到他们不能在不破坏大量代码的情况下更改实现,因此他们选择不实现有用的功能或错误修复。这被称为代码瘫痪
    • 尽管看到您无法访问的内容令人沮丧,但与许可模式相比,在限制(拒绝所有、允许例外)模式下操作代码寿命和更低的修订成本更好

      我曾经在(不,是书面的)框架上工作过,在这些框架中,使用该框架的开发人员抱怨该框架对内部细节不够宽容。这些人抱怨说,即使修复了bug,添加了功能,并在各种平台迁移中重写了实现,但公共的、受支持的接口、代码契约仍然保持稳定,他们的代码基本上没有受到影响

      因此,简而言之,开发人员会抱怨受保护(和私有)的访问修饰符,因为它妨碍了开发人员的工作