如何防止向一个类中添加方法?

5

我想了解是否有一种方法可以阻止其他开发人员向类中添加函数/方法(编辑:其他开发人员),对于对象是模型或DTO的情况,这些对象不应包含方法(以防止他人“滥用”模型/DTO,可能会尝试添加“助手”方法等)。

有没有办法实现这一点?


4
编写自定义的CodeAnalysis(FxCop)或“Roslyn”规则,将其添加到构建过程中,如果违反则产生错误。 - Christian.K
2
@NickG 我的意思是,听起来很轻率,但类型系统能为你做的事情只有那么多。比如说,我想确保我的团队中的其他开发人员不会把所有变量都命名为著名的 Monty Python 段子。除了添加一个注释 /* 嘿,你,别这样做 */ 并打耳光给那些这样做的人之外,没有办法让编译器强制执行这一点。 - Asad Saeeduddin
1
@PanagiotisKanavos,其实我没有意识到在C#中结构体可以有方法。 - NickG
1
@NickG 这听起来像是一个“XY问题”的情况 - 即有一个问题,但询问的是尝试解决方案,而不是实际问题。你真正想要解决的是什么实际问题?例如,让创建数据传输对象(DTO)更容易反而会减少人们尝试创建一个大的DTO整体 - 因为他们不需要这样做!将DTOs放在一个单独的DLL中是另一个选项,可以帮助在层之间或项目之间进行通信。 - Panagiotis Kanavos
1
你也可以使用像AutoMapper这样的映射库,通过约定方式非常轻松地将一个DTO映射到另一个DTO,使人们更喜欢创建自己的DTO和方法,而不是试图搞乱一个大型的DTO。 - Panagiotis Kanavos
显示剩余3条评论
5个回答

5

使用反射并编写一个单元测试,如果模型类具有方法,则该单元测试将失败。

使用自定义属性标记所有模型类。然后编写一个单元测试,使用反射加载给定程序集,迭代该程序集中的所有类,并检查标记有模型属性的类是否没有方法。这应该是相当简单的使用反射来实现。


1
不要忘记构建继承图并检查所有派生类型,以确保它们没有方法。如果您不能信任某人不添加方法,那么肯定不能信任他们添加您的属性。 - Asad Saeeduddin
@Asad 不用担心 - 我主要是出于好奇而问的 :) 我们对此没有太大问题,我甚至可能不会实施建议的解决方案。我只是想知道是否有一个“快速修复”。 - NickG

3
我相信您正在尝试使用代码来解决一个流程问题,而应该使用沟通。

您的同事(我假设)正在以“完全信任”的权限操作代码文件。如果他们破坏了这个权限,您应该开展对话。利用这次变更的机会向他们介绍预期的设计并教育他们。也许他们是正确的,您将从中受益!

我建议在类名中明确表明预期的设计,并使用注释说明其预期的性质。可以引用为这个类提供信息的设计文档。


2
您无法阻止有完全写权限的人这样做。您可以采取的两个措施是创建一些CodeAnalysis规则以避免此问题,如评论中所述,或编写DTO类,使其毫无疑问地成为不应具有任何方法的DTO,并使用明确的类名,如果这还不足够,请提供一些代码注释来通知编码者不要这样做。
但是,如果使用集合等,您可能需要某种方法,例如在需要比较两个DTO实例是否相等时,因此您必须至少提供一个Equals和GetHashCode方法。

0

你不需要使用结构体来防止对类的添加。你可以使用 sealed 关键字。

public sealed class MyDTOObject { ... }

现在,你不能继承一个类并且同时阻止继承(这基本上就是你所要求的)。事实上,继承MyDTOObject就是创建了一个新的类,它不等于、受限于或以任何方式由MyDTOObject的实现定义。
你可以使用一个abstract类来强制派生类实现某些方法,但反过来则不行。
如果你想阻止其他人从你的类派生并实现辅助方法,你必须使用sealed关键字,或将类标记为internal。

2
我认为OP想知道如何防止“任何”方法,即使是在“MyDTOObject”自身中也不能被调用。 - Christian.K
1
我认为OP的要求是希望能够继承和添加属性,但不需要方法。 - Asad Saeeduddin
1
@Christian.K:我是在说除了将类设为密封以防止继承之外,其他方式都是不可能的。(他指定了“由其他开发人员进行的添加”) - caesay
我并不想阻止继承(或任何类似的东西)。我认为你误解了我的问题。 - NickG

0

你可以通过将类标记为final来防止该类被扩展或继承,这样就没有人能够扩展你的类,因此也无法添加任何行为。但是请停下来问问自己是否要这样做,因为那样你就签署了一个隐形合同,即该类所需的所有内容都已写入该类中,而且该类不需要进一步添加。

明确一点,我是在Java上下文中谈论的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接