2

我对编程还是很陌生,我想编写尽可能干净的代码。

这听起来像是一个愚蠢的问题,但我应该按什么顺序排列我的方法?功能上当然没关系,但布局却有很大的不同。假设我们在一个类中有以下代码:

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

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

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

- (NSPersistentStoreCoordinator *)pscMock {
    ...
}

-(void)mockOutXMLStoreForInMemoryStore {
    ...
}

我是否按照调用顺序对方法进行了排序?如果从类中的两个地方调用方法怎么办?

这段代码片段在我看来完全是一团糟——为了弄清楚什么是一个非常简单的流程,不得不跳过这么多的内容非常令人困惑。

哪种方法顺序更有意义?

4

5 回答 5

4

我发现方法比类更正确——但我认为这是因为我做得不够:保持足够短,这样的问题就会消失。

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

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

于 2009-05-30T23:33:57.540 回答
3

在我看来,这似乎没有一个明确的答案,除非你有一个标准可以为你的项目/工作场所遵循。就个人而言,如果我不遵循另一个标准,我将构造函数放在第一位,然后是析构函数。之后,我只是按方法名称的字母顺序排列它们。我有点像恐龙(自卡特政府以来我一直在编程),所以在我听说面向对象编程之前就采用了函数的字母顺序方法,并且在我开始做对象时就沿用了它。

于 2009-05-31T00:03:53.753 回答
2

您有多个选项可以对您的方法进行分组:

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

就我个人而言,我更喜欢按功能对方法进行分组,所以如果我跟踪流程,我不需要跳得太远。使用现代 IDE 为您实现跳跃,这不再是一个大问题。

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

于 2009-05-30T23:23:33.740 回答
1

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

首先是构造函数/析构函数,然后是访问器,然后是其他按重要性排序的方法。

首先是重要的方法,所以当我打开一个文件时,我必须滚动最少才能找到最重要的方法。

public/protected/private 也一样:首先是公共的,因此在打开文件时可以快速看到其他文件中可以使用的所有内容。

于 2009-05-30T23:28:16.007 回答
1

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

方法按受众规模递减的顺序排列,但 、 、initializeinit便利方法(即返回类的自动发布实例的类方法)除外。deallocawakeFromNib

//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在头文件中订购 s 。目前我正在按内存管理责任对它们进行排序:

//IBOutlets
//other non-retained objects (eg delegates - these can most likely be labeled IBOutlet too)
//primative data types (no mm responsibilties)
//retained objects
于 2009-07-30T08:45:54.810 回答