源代码中的类成员顺序

时间:2009-01-21 10:32:20

标签: language-agnostic refactoring

这已经是asked before (question no. 308581),但是这个特定问题和答案有点特定于C ++,并且很多东西与Java或C#等语言并不相关。

问题是,即使在重构之后,我发现我的源代码文件中有一些混乱。我的意思是,函数体是正常的,但我对函数本身的排序方式并不满意。当然,在像Visual Studio这样的IDE中,如果你记得它是如何被调用的话,找到一个成员是相对容易的,但情况并非总是如此。

我尝试了几种方法,比如首先放置公共方法,但这种方法的缺点是文件顶部的函数最终调用文件底部的其他私有函数,所以我最终一直滚动。

另一种方法是尝试将相关方法组合在一起(可能放入区域),但显然这有其局限性,好像在同一个类中有许多非相关方法那么可能是时候将类分解为两个或更多小班。

因此请考虑一下:您的代码已经过适当重构,以便满足代码完成中提到的所有要求,但您仍然希望为符合人体工程学的目的重新排序方法。你的方法是什么?

(实际上,虽然这不是一个技术问题,但这个问题确实让我感到很生气,所以如果有人能提出一个好的方法,我会非常感激)

8 个答案:

答案 0 :(得分:4)

实际上我完全依赖IDE的导航功能,即Visual Studio。大多数时候我使用F12跳转到声明(或Shift-F12以查找所有引用)和Ctrl + - 跳回。

原因是我大部分时间都在处理我自己没有写过的代码,而且我不想花时间重新订购方法和字段。

P.S。:我还使用RockScroll,这是一个VS插件,可以很容易地导航和滚动大文件

答案 1 :(得分:3)

如果你在滚动和寻找时遇到问题,你可能会患上神级综合症。

Fwiw,我个人倾向于选择:

class
{
  #statics (if any)

  #constructor

  #destructor (if any)

  #member variables

  #properties (if any)

  #public methods (overrides, etc, first then extensions)

  #private (aka helper) methods (if any)
}

我对区域块没有厌恶,也没有评论,所以可以自由地使用两者来表示关系。

答案 2 :(得分:1)

从我的(Java)角度来看,我会按顺序说构造函数,公共方法,私有方法。我总是试图将实现某个接口的方法组合在一起。

我最喜欢的武器是IntelliJ IDEA,它有一些很好的折叠方法体的可能性,因此即使它们在源文件中的实际位置相距700行,也很容易直接在彼此之上显示两种方法。

我会小心处理实际来源中方法的位置。您的IDE应该能够以您希望的方式查看源。在开发可以使用他们选择的IDE的项目时,这尤其重要。

答案 3 :(得分:1)

我的订单,来了。

  • 我通常先放置静力学。

  • 接下来是成员变量和属性,访问一个特定成员的属性与该成员一起分组。我尝试将相关信息组合在一起,例如包含路径信息的所有字符串。

  • 第三个是构造函数(或构造函数,如果你有几个)。

  • 之后按照方法进行操作。这些是按照特定类别的逻辑顺序排列的。我经常按照访问级别对方法进行分组:私有,受保护,公共。但是我最近有一个类需要从它的基类覆盖很多方法。由于我在那里做了很多工作,所以无论访问级别如何,我都将它们放在一个组中。

我的建议:订购课程,以便它有助​​于您的工作流程。不要只是订购它们,只是为了订购。订购所花费的时间应该是一项投资,可以帮助您节省更多的时间,否则您需要向上和向下滚动。

在C#中,我使用#region将这些群体彼此分开,但这是一个品味问题。有很多人不喜欢地区。我做。

答案 4 :(得分:1)

我将刚刚创建的最新方法放在类的顶部。那样,当我打开项目时,我又回到了我正在开发的最后一种方法。我更容易回到“区域内”。

它还反映了我刚刚创建的方法(使用其他方法)是其他方法的最顶层。

将相关功能组合在一起,不要难以将所有私有功能放在最底层。同样,模仿C#属性的设计原理,相关函数应该彼此非常接近,C#语言构造的属性强化了这个想法。


<小时/> 附:
如果只有C#可以嵌套像Pascal或Delphi这样的函数。也许Anders Hejlsberg可以把它放在C#中,他还发明了Turbo Pascal和Delphi :-) D语言有嵌套函数。

答案 5 :(得分:0)

几年前,我花了太多时间思考这个问题,并提出了一个非常复杂的系统来排序一个类中的声明。顺序取决于访问说明符,方法或字段是静态的,瞬态的,易失性的等等。

这不值得。恕我直言,你从这么复杂的安排中得不到真正的好处。

我现在所做的事情要简单得多:

  1. 构造函数(首先是默认构造函数,否则顺序无关紧要。)
  2. 方法,按名称排序(静态与非静态无关,抽象与具体,虚拟与最终等)。
  3. 内部类,按名称排序(界面与类等无关)
  4. 按名称排序的字段(静态与非静态无关。)可选择常量(public static final),但这不是必需的。

答案 6 :(得分:0)

我非常确定有一个可视化工作室插件可以在代码中重新排序类成员。

因此,在类顶部的ctors然后静态方法然后实例方法... 类似的东西

不幸的是我不记得这个插件的名字了!我也认为这个插件是免费的! 也许其他人可以帮助我们?

答案 7 :(得分:0)

我个人对构建课程的看法如下:

我严格要求

    首先是
  • 常量和静态字段,按字母顺序排列
  • 按字母顺序排列的非私有内部类和枚举
  • 字段(以及适用的属性),按字母顺序
  • ctors(和适用的dtors)
  • 静态方法和工厂方法
  • 以下方法,按字母顺序排列,无论可见性如何。

我始终使用IDE的自动格式化功能。所以当我工作的时候,我经常打Ctrl+Shift+F。我在xml文件中导出自动格式化功能,随身携带。

在进行合并和重组时,它有助于缩小范围。它是你可以在IDE或构建过程中自动化的类型,这样你就不必让脑细胞出汗了。

我没有声称 MY WAY 就是这样。但是选择一些东西,配置它,一直使用它直到它变成反射,然后忘掉它。