任何类别中的方法顺序

时间:2009-05-30 23:04:36

标签: refactoring conventions

我仍然是编程的新手,我想尽可能编写最干净的代码。

这可能听起来像个愚蠢的问题,但是我应该把我的方法放在哪个顺序?功能上当然没关系,但布局它会产生巨大的差异。所以说我们在一个类中有以下代码:

-(void)testCreateProjectWithStartDate {
    [self setUpTestCreateProjectWithStartDate];
    ...
}

-(void)setUpTestCreateProjectWithStartDate {
    testMOC = [self setUpInMemoryStore];
    [self mockOutXMLStoreForInMemoryStore];
}

- (NSManagedObjectContext *)setUpInMemoryStore {
    ...
    NSPersistentStoreCoordinator *coordMock = [self pscMock];
    ...
}

- (NSPersistentStoreCoordinator *)pscMock {
    ...
}

-(void)mockOutXMLStoreForInMemoryStore {
    ...
}

我是否按顺序调用方法?如果从一个类中的两个地方调用一个方法怎么办?

这个代码片段对我来说看起来完全一团糟 - 为了弄清楚什么是非常简单的流程,我必须跳过这一点非常困惑。

哪种方法更有意义?

5 个答案:

答案 0 :(得分:4)

我发现这对方法而不是类更为正确 - 但我认为这是因为我只是做得不够:保持足够短,这些问题就会消失。

因此,对于方法 - 长期以来一直存在关于是否在顶部初始化所有变量,或者在它们被使用的地方附近初始化它们的问题(答案就在他们使用的地方附近,fwiw) - 但是如果你保持你的方法足够短,这没关系。在他们使用的地方附近 位于顶部。

至少在理论上,对于类来说也是如此:保持它们足够短,内部组织无关紧要(限制和不可能的情况:每个类只有一个方法;它会自动按照你声明的顺序)。如果你的类有很多方法,你想知道如何组织 - 考虑提取一些属于他们自己的类的方法。越小越好。

答案 1 :(得分:3)

除非您的项目/工作场所遵循标准,否则我似乎不会对此作出明确答复。就个人而言,如果我没有遵循另一个标准,我先将构造函数放入,然后是析构函数。之后,我只是按方法名称按字母顺序排列。我有点像恐龙(自卡特管理以来我一直在编程),所以在我听说面向对象编程之前我采用了按字母顺序排列的函数方法,并在我开始做对象时将其转换。

答案 2 :(得分:2)

您可以使用多种方法对方法进行分组:

  • 通过功能(即彼此需要的方法靠得很近)
  • 通过可见性(例如,首先在界面中声明的公共方法)
  • 按名称(即方法只按名称排序)

我个人更喜欢按照功能对方法进行分组,所以如果跟踪流程,我不需要跳得太远。随着现代IDE的发展,这不再是一个大问题。

在您的特定示例中,您可能希望减少提高可读性的方法数。如果你的方法都很短(2-3行)并且只能从一个地方调用,你可以内联代码并省略一些方法。

答案 3 :(得分:1)

我总是这样订购我的方法:

第一个构造函数/析构函数, 然后访问者, 然后按重要性排序其他方法。

首先是重要的方法,所以当我打开文件时,我必须滚动最少的方法以获得最重要的方法。

相同的public / protected / private:public first,因此打开文件时可以快速看到其他文件中可以使用的所有内容。

答案 4 :(得分:1)

我也遇到过这个问题。我确实尝试根据类的角色对方法进行分组。这种方法并不真正起作用,因为它留下了很多未解决的问题。我最近开始使用Objective-C的以下约定:

除了initializeinitdeallocawakeFromNib和便捷方法(即返回自动方法的类方法)之外,方法按顺序减少了受众群体规模发布了该类的实例)。

//initialze, init, dealloc, awakeFromNib
//convenience methods
//properties
//IBActions
//General public methods
//Delegate methods (eg NSResponder, NSTableview etc)
//Binding and notification call back methods
//private methods

我仍然不能100%确定如何在头文件中订购ivar。我暂时按照内存管理责任命令他们:

//IBOutlets
//other non-retained objects (eg delegates - these can most likely be labeled IBOutlet too)
//primative data types (no mm responsibilties)
//retained objects