你觉得代码折叠怎么样?

时间:2008-08-08 13:38:30

标签: visual-studio folding

对于Visual Studio环境中的那些人,您如何在#regions中包装任何代码? (或者如果任何其他IDE有类似的东西......)

24 个答案:

答案 0 :(得分:34)

10次中的9次,代码折叠意味着您未能使用SoC principle来实现它的价值。
我或多或少对部分课程有同感。如果你有一段你觉得太大的代码需要在可管理(和可重复使用)的部分进行切割,而不是隐藏或拆分它们。
下次有人需要改变它时会咬你,并且无法看到隐藏在方法的250行怪物中的逻辑
无论何时,只需将一些代码从主类中提取出来,然后输入帮助程序或工厂类。

foreach (var item in Items)
{
    //.. 100 lines of validation and data logic..
}

不像

那样可读
foreach (var item in Items)
{
    if (ValidatorClass.Validate(item))
        RepositoryClass.Update(item);
}



我的0.02美元反正。

答案 1 :(得分:14)

这是在Coding Horror上谈到的。

我个人的信念是,它们是有用的,但是过多的东西可能太多了。

我用它来命令我的代码块进入:
枚举
声明
构造
方法
事件处理程序
属性

答案 2 :(得分:10)

有时您可能会发现自己在鼓励或需要#regions的团队中工作。如果你像我一样,你不能忍受折叠代码,你可以关闭C#的概述:

  1. 选项 - >文字编辑器 - > C# - >高级选项卡
  2. 取消选中“在文件打开时输入大纲模式”

答案 3 :(得分:5)

虽然我理解Jeff等人的问题。人。我对 CTRL + M CTRL + L 扩展文件中的所有区域是如此难以处理。

答案 4 :(得分:5)

我使用#Region来隐藏丑陋且无用的自动生成的代码,这些代码实际上属于部分类的自动生成部分。但是,在处理旧项目或升级项目时,您并不总是那么奢侈。

对于其他类型的折叠,我一直折叠功能。如果你很好地命名这个函数,除非你正在测试某些东西或者(重新)编写它,否则你将永远不必向内看。

答案 5 :(得分:3)

我更偏爱部分类而不是区域。

其他人对地区的广泛使用也让我觉得某个人在某个地方违反了单一责任原则,并试图用一个对象做太多事情。

答案 6 :(得分:3)

@ Tom

提供了部分类,以便您可以将工具自动生成的代码与代码生成完成后可能需要进行的任何自定义分开。这意味着您重新运行codegen后代码保持不变,并且不会被覆盖。这是一件好事。

答案 7 :(得分:3)

我使用Textmate(仅限Mac)有代码折叠,我发现它对折叠功能非常有用,我知道我的“getGet”功能有什么用,我不需要它占用10行哦如此宝贵的屏幕空间。

我从不使用它来隐藏for循环,if语句或类似的东西,除非向其他人显示代码,我会隐藏他们看到的代码,以避免两次显示相同的代码。

答案 8 :(得分:2)

区域绝不能在方法内部使用。它们可能用于对方法进行分组,但必须非常谨慎地处理,以便代码的读者不会疯狂。折叠方法的修饰符没有意义。但有时折叠可能会增加可读性。对于例如将使用外部库时用于解决某些问题的一些方法分组,并且您不希望经常访问可能会有所帮助。但编码器必须始终寻求解决方案,例如在此特定示例中使用适当的类包装库。当所有其他方法都失败时,请使用折叠来提高可读性。

答案 9 :(得分:2)

我通常发现在处理像C#中的事件这样的代码时,大约有10行代码实际上只是事件声明的一部分(EventArgs类是委托声明和事件声明)在它们周围放置一个区域然后将它们折叠起来使它更具可读性。

答案 10 :(得分:2)

如果我不必根据语言固有的代码功能手动维护区域分组,那么区域折叠就可以了。例如,编译器已经知道它是构造函数。 IDE的代码模型已经知道它是一个构造函数。但是,如果我想看到构造函数组合在一起的代码视图,由于某种原因,我必须重申这些事情是构造函数的事实,通过将它们物理地放在一起然后围绕它们放置一个组。对于切片类/结构/接口的任何其他方式也是如此。如果我改变主意并希望首先将公共/受保护/私人资料分成小组,然后按成员类别分组,该怎么办?

使用区域标记公共属性(例如)与输入冗余注释一样糟糕,该注释不会对代码本身已经可以识别的内容添加任何内容。

无论如何,为了避免为此目的使用区域,我编写了一个名为Ora的免费开源Visual Studio 2008 IDE加载项。它自动提供分组视图,使得维护物理分组或使用区域的可能性大大降低。 You may find it useful

答案 11 :(得分:2)

这只是导致无处可寻的愚蠢讨论之一。如果您喜欢地区,请使用它们。如果不这样做,请将编辑器配置为关闭它们。在那里,每个人都很开心。

答案 12 :(得分:2)

我不是部分课程的粉丝 - 我尝试开发我的课程,这样每个课程都有一个非常明确的单一问题,对此负责。为此,我不认为具有明确责任的事情应该分成多个文件。这就是为什么我不喜欢部分课程。

话虽如此,我仍然关注地区。在大多数情况下,我不使用它们;然而,我每天都在使用包含区域的代码 - 有些人对它们非常重视(将私有方法折叠成一个区域,然后将每个方法折叠到自己的区域),有些人对它们有所了解(折叠枚举,折叠属性等)。我现在的一般经验法则是,如果(a)数据可能保持静态或不经常触摸(如枚举),或者(b)如果有方法,我只将代码放在区域中由于子类化或抽象方法实现而实现的必要性,但同样不会经常触及。

答案 13 :(得分:1)

我个人经常使用#Regions。我发现它可以帮助我保持属性,声明等彼此分离的东西。

这也许是一个很好的答案!

Coding Horror

编辑:Dang,Pat打败了我!

答案 14 :(得分:1)

我认为如果使用得当,它是一个有用的工具。在许多情况下,我觉得经常折叠的方法和枚举以及其他东西应该是小黑盒子。除非你出于某种原因必须看它们,否则它们的内容无关紧要,应尽可能隐藏。但是,我从不折叠私有方法,注释或内部类。方法和枚举是我折叠的唯一内容。

答案 15 :(得分:1)

我的方法类似于其他一些方法,使用区域将代码块组织成构造函数,属性,事件等。

Roland Weigelt在他的博客文章Better Keyboard Support for #region ... #endregion中提供了一套出色的VS.NET宏。我多年来一直在使用这些,映射ctrl +。折叠当前区域和ctrl ++以展开它。发现它比使用折叠/展开所有内容的默认VS.NET功能更好。

答案 16 :(得分:0)

Eclipse在Java(或带有插件的PHP)中自己完成了一些。允许您折叠功能等。我倾向于喜欢它。如果我知道一个函数是做什么的,而我不是在做它,我不需要看它。

答案 17 :(得分:0)

Coding Horror文章实际上让我也想到了这一点。

通常,我是大类我会在成员变量,常量和属性周围放置一个区域,以减少我必须滚动的文本数量,并将其他所有内容保留在区域之外。在表单上,​​我通常将事物分组为“成员变量,常量和属性”,表单函数和事件处理程序。再一次,这更是如此,当我只想查看一些事件处理程序时,我不必滚动浏览大量文本。

答案 18 :(得分:0)

Emacs有一个折叠次要模式,但我偶尔会点燃它。大多数情况下,当我正在研究从另一位物理学家那里继承的一些怪物,这些物理学家显然没有更少的指导或更少关心他/她的编码实践。

答案 19 :(得分:0)

使用#region组织代码我真的没有问题。就个人而言,我通常会为属性,事件处理程序和公共/私有方法设置不同的区域。

答案 20 :(得分:0)

使用区域(或其他折叠代码) 应该与代码气味(或隐藏它们)无关,或隐藏代码的任何其他想法,您不希望人们“轻易”看到。

区域和代码折叠实际上就是提供一种方法,可以轻松地对可折叠/折叠/隐藏的代码段进行分组,以最大限度地减少您当前正在处理的无关“噪音”。如果你正确设置(意味着实际上将你的区域命名为有用的东西,比如包含方法的名称)那么你可以折叠除了你正在编辑的函数之外的所有东西,并且仍然保持某种程度的上下文而不必实际看到其他代码行。

关于这些想法可能应该有一些最佳实践类型指南,但是我广泛使用区域来为我的代码文件提供标准结构(我将事件,类范围字段,私有属性/方法,公共属性/方法分组) 。每个方法或属性也有一个区域,其中区域名称是方法/属性名称。如果我有一堆重载方法,则区域名称是完整签名,然后整个组包装在一个只是函数名称的区域中。

答案 21 :(得分:0)

我自己更喜欢#regions,但是一位老同事无法忍受隐藏的东西。一旦我在一个包含7个#regions的页面上工作,我理解了他的观点,其中至少有3个是自动生成的,并且具有相同的名称,但总的来说,我认为它们是一种有用的方式来分解并保持一切杂乱。

答案 22 :(得分:0)

我个人讨厌地区。在我看来,应该在区域中的唯一代码是生成代码。 当我打开文件时,我总是以Ctrl + M + O开头。这折叠到方法级别。如果您有区域,则只能看到区域名称。

在签入之前,我在逻辑上分组方法/字段,以便在Ctrl + M + O之后看起来没问题。 如果你需要地区,你的班级必须有很多行。我也发现这很常见。

region ThisLooksLikeWellOrganizedCodeBecauseIUseRegions

//总垃圾,这里没有结构

endregion

答案 23 :(得分:0)

枚举

属性

.ctors

方法

事件处理程序

这就是我使用的所有区域。我不知道你可以在方法中使用它们。

听起来很糟糕:)