【问题标题】:Who likes #regions in Visual Studio? [closed]谁喜欢 Visual Studio 中的#regions? [关闭]
【发布时间】:2011-06-02 05:47:09
【问题描述】:

我个人无法忍受区域标签,但显然它们在组织代码方面具有广泛的吸引力,所以我想测试水的温度以供其他 MS 开发人员接受这个想法。

我个人的感觉是,任何简化代码的愚蠢技巧只会助长糟糕的编码行为,例如缺乏凝聚力、意图不明确以及编码标准差或不完整。

一位程序员告诉我,代码区域有助于鼓励编码标准,因为它明确了其他程序员应该将他或她的贡献放在哪里。

但是,坦率地说,这对我来说听起来像是一大堆马粪。如果您有一个标准,那么程序员的工作就是了解该标准是什么……您不需要在每个单独的类文件中定义它。

而且,没有什么比在打开文件时折叠所有代码更烦人的了。我知道 cntrl + M, L 会打开所有内容,但是您需要阅读可怕的“哈希区域定义”打开和关闭行。

他们只是烦人。

我最坚定的快速编码理念是所有程序员都应该努力创建清晰、简洁和有凝聚力的代码。区域标签只是用来制造噪音和多余的意图。

区域标签在经过深思熟虑和意图明确的课程中没有实际意义。

它们对我来说似乎唯一有意义的地方是自动生成的代码,因为除了个人好奇心之外,您永远不必阅读它。

【问题讨论】:

  • 这是一篇博文,不是问题。
  • 其实我是在问其他人对地区的看法。所以是的,这是一个问题
  • @tvanfosson 我假设一旦我收集到足够的分数,我就可以对过早结束这个讨论提出异议。我不明白为什么应该关闭没有黑白响应的开放式问题。对抗和争论也可以表述为反对和讨论。这通常是编程的精神,提出支持或反对影响我们日常工作的想法的论据似乎是一个非常值得讨论的话题。
  • @Nicholas -- 你读过常见问题解答吗?可能有一种方法不会关闭,但这实际上更像是一种寻找论点的观点,而不是寻求答案的问题。例如,“区域指令有哪些好的用途?”或“区域指令是代码异味吗?” - 并忽略问题本身的意见,尽管您可以提供包含您想法的答案。即便如此,我也不知道我可以保证它不会关闭,尽管如果它真的没有预先假设答案,我可能不会投票关闭它。
  • @tvanfosson 嗯...我想我觉得我有点坚强。很公平...下次我会记住的。

标签: visual-studio coding-style region


【解决方案1】:

StyleCop doesn't like regions:

SA1124:不使用区域

原因

C# 代码包含一个区域。

规则说明

只要将区域放置在代码中的任何位置,就会违反此规则。在包括 Visual Studio 在内的许多编辑器中,默认情况下该区域将显示为折叠状态,从而隐藏该区域内的代码。隐藏代码通常是一种不好的做法,因为随着时间的推移,这可能会导致错误的决策。

如何解决违规问题

要修复违反此规则的行为,请从代码中删除该区域。

some discussion关于这是否是一个合理的规则。

大家的共识似乎是有些人喜欢地区而有些人不喜欢——这取决于各个团队来决定。最重要的是在整个项目中使用一致的风格。

可以接受区域的一个地方是将实现特定接口的所有方法分组。值得注意的是,如果您使用代码生成功能提供实现接口的方法存根,Visual Studio 会自动添加一个区域。

它们对我来说唯一有意义的地方是自动生成的代码,因为除了个人好奇心之外,您永远不必阅读它。

partial class feature 更适合在同一类中将自动生成的代码与手动生成的代码分开。

使用自动生成的源代码时,可以将代码添加到类中,而无需重新创建源文件。 Visual Studio 在创建 Windows 窗体、Web 服务包装代码等时使用此方法。您可以创建使用这些类的代码,而无需修改由 Visual Studio 创建的文件。

【讨论】:

  • 一致性很重要,但同样重要的是凝聚力、清晰性和可读性。如果您的风格违反了这些其他美德,那么您就无法真正隐藏在一致性的背后。
  • 我希望更多的人会投票赞成这个答案
【解决方案2】:

我喜欢区域,并且一直使用它们。我用它们在类中对同类成员进行分组。

您已经可以在编辑器中折叠方法、类和命名空间。区域为您提供了创建另一个级别的选项,使您可以按照您认为重要的方式排列代码。

【讨论】:

  • 是的,我以前听过这个论点,但善意的透露名称仍然应该使地区没有实际意义。为什么要在结构良好且清晰的课程中产生额外的噪音。折叠的默认行为会折叠你所有善意的分组......这在阅读别人的代码时很烦人。
  • @Nicholas:最好的名字不会让代码从字面上消失。
  • @DeadMG 这可能是真的,但你为什么要让代码人为地消失呢?你需要阅读它才能理解它。如果它存在,我想阅读它,我不希望那些嘈杂的#region 标签妨碍我。
  • @Nicholas:大多数时候,在维护代码时,您只需要查看其中的特定部分。如果你需要一直看到所有代码,那么代码设计得很糟糕。
  • @Guffa 这是一个愚蠢的评论。我当然不是在提倡你所暗示的那种设计。我是说您的代码应该经过深思熟虑和简洁,以至于对区域的需求是多余的,甚至是无用的。当你必须隐藏课堂的某些部分以在概念上适合你的大脑时,你就在玩弄太多的概念了。这是糟糕设计、缺乏凝聚力和总体责任的典型定义。代码中表达的清晰想法和想法不需要隐藏,细节也不需要在维护时完全理解。
【解决方案3】:

我认为#region 非常好。我自己从未使用过它,但如果您有一个大型或复杂的课程,它可以帮助您找到所需的内容。想象一下,如果您正在实施 ID3D10Device1 - 有一百多种方法要实施。你想把它们都扔到一个地方吗?

【讨论】:

  • 我从来不需要实现任何不能分解成更谨慎的可理解代码块的东西。根据我的经验,#region 从来都不是一个好主意,但我承认某些类型的功能不可能以模块化方式实现。
【解决方案4】:

我确实使用区域来组织一个类中更大的结构,即。一个带有回调和方法的依赖属性被调用,例如。您有一个接收IEnumerable<T> 的DP,并且您想使用弱事件模式来响应INotifyCollectionChanged。这可能需要一些代码,并且编码后我不会触摸它,所以我将它放在一个区域中。

但是,如果你使用区域来构建你的逻辑,这是严重的代码异味,这就是 Mark 帖子中的 StyleCop 规则所指的。

【讨论】:

  • 我仍然对这种用法持怀疑态度,但我非常感谢您对结构化逻辑的评论。
  • 人们(和 StyleCop)对区域的问题很简单——它可以隐藏设计失败。将 DP 放入一个区域时,情况并非如此。带有附带方法的完整 DP 可能需要大量代码,并且考虑到您通常不会使用此样板代码,我认为将其与区域组合在一起没有问题。
【解决方案5】:

在我编程时,我经常使用区域,它们帮助我保持我的代码井井有条,并且能够只专注于我关心的部分。我总是在区域上添加 cmets,它们是关于什么的。但是当我完成后,我总是删除它们。它是一个方便的工具,仅此而已。

【讨论】:

  • 所以您在构建代码时使用它们来组织代码?所以我猜你永远不会将代码提交到带有区域标签的存储库?
  • 是的,显然我永远不会使用区域标签提交它。因为我不希望其他人遵循我的地区逻辑。但它在个人层面上很有帮助
  • 好的,我不能不同意这一点。我个人不这样做,因为我喜欢看到我所有的代码都在我面前打开。对我来说,我想努力将一个谨慎的功能设计到可接受的完成水平,并且我希望随时都能看到它的完整形式。
【解决方案6】:

IHMO,如果你在一个类中有#region 部分,这意味着你的类中有两个行为,所以你应该将你的类分成两个对象。

【讨论】:

  • 但是,如果您为私有变量、公共方法、构造函数...等创建区域,该怎么办?
  • 没那么简单。两个对象具有类似的东西,例如,不同的生命周期。并不是所有的多行为类都可以拆分。
  • 类有两种行为是什么意思?区域不会以任何方式改变代码的工作方式,它们只是组织源代码的一种方式。
猜你喜欢
  • 2010-09-11
  • 2011-02-20
  • 2020-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-14
  • 1970-01-01
相关资源
最近更新 更多