1

嘿有经验的程序员!

我想问你一些关于干净代码的事情:)

我想保持我的代码干净并使它变得更好,所以这就是我的问题:

1)我应该把#imports放在哪里?我的原则:(而且我认为它们不好)

  • #import 框架应始终位于 .h 中
  • #import .h 文件应始终在 .m 中
  • .h 文件应该只有@class,而不是导入(不包括 UIKit 等框架)
  • 代表应该在.m

    @interface ViewController() <UIAlertViewDelegate> 
    @end
    

2)我应该把我的实例变量放在哪里?

  • 私有变量和受保护变量必须在 .m 中
  • 公共必须在 .h 中

3)我应该把我的方法放在哪里?

  • 在 .h 中公开
  • .m 中的私有(是的,我知道我的“私有方法”并不是真正私有的,只是隐藏了)

(顺便说一句,这很明显)

4)#defines 呢?

  • 全局 - 始终在 .h 中
  • 仅在该类中使用 - 始终在 .m 中

5)我应该把 NSNotification 全局标识符放在哪里以及如何组织它们

  • #define NSNotificationDataSourceDidLoadData @"NSNotificationDataSourceDidLoadData" in .h 文件中将发送此通知的类

但 ....

  • 苹果在 .h 文件中有很多私人的东西
  • 在大多数情况下,我的 .h 文件只是.. EMPTY :)

一年前,我遇到了另一种情况——一切都在 .h 中,但我认为这也很糟糕

该怎么办?你使用什么原则?谢谢!

那是关于编码风格的问题,而不是关于“如何使其可编译”的问题

4

3 回答 3

5

这是我的做法:

  • 通常#import <Foundation/Foundation.h>还是#import <UIKit/UIKit.h>进入 .pch 文件。没有头文件或实现文件再次执行这些导入(使 iOS 和 Mac OS X 之间的代码共享更容易一点)。
  • 在 .h 文件中:
    • 仅在绝对必要时才导入其他 .h 文件,例如因为它们定义了类以外的类型(枚举、结构、具有 typedef 的所有内容),然后在当前 .h 文件中使用这些类型。
    • 类是前向声明的 ( @class Foo;) 以避免拉入其他 .h 文件。
    • 接口只包含其他类可以访问的东西!这里没有私人物品!
  • 在 .m 文件中:
    • 包括您需要的所有 .h 文件。但不是更多;-)
    • 私有实例变量和属性在类扩展 ( @interface Foo ()) 中定义。
    • 私有方法不再需要“前向声明”,所以不要这样做。

在极少数情况下,一个类包含一些类应该访问但“普通”用户不应该访问的一些东西,我创建foo_protected.h具有定义“受保护”方法的类类别的标题。

关于#defines 的一句话:尽可能避免使用它们。如果可能,请使用const变量或enums,因为附加类型信息可以帮助编译器以这种方式捕获更多错误。例如,使用enums 有一个很好的优势,如果你有 aswitch但没有处理 的所有值,你会收到警告enum。如果您添加一个新值,您将在忘记处理它们的任何地方收到警告,这是您在 s 中没有得到#define的。

于 2013-04-25T15:03:41.823 回答
3

就个人而言,我认为答案很简单。现在可以在 .m 文件中声明实例变量,并且可以在.m文件@implementation的类扩展中声明属性和协议采用,所以我不会在.h文件中放置任何不必放在那里的东西。

于 2013-04-25T15:00:34.830 回答
2

导入框架应始终在 .h

没有为什么?

导入 .h 文件应始终在 .m 中

这很模糊。如果您需要在头文件中导入某些内容怎么办?你想继承一个类,你做什么?#import "SomeClass.h"在标题中。

.h 文件应该只有@class,而不是导入(不包括 UIKit 等框架)

无脑。(对不起,确实如此。请参阅上面的推理。)

2)我应该把我的实例变量放在哪里?

由于其他类确实不应该访问 ivars (即建议不要让您的 ivars public),您可以将它们放在任何地方:标头很好(并且对于与 v1.0 脆弱的运行时 API 兼容很有用),但是您也可以将所有内容都放在类扩展中。

3)我应该把我的方法放在哪里?

你说对了,差不多。

4)#defines 呢?

这也很好,就我而言。基本上,将定义和枚举放在它们需要可见的地方。

Apple 在 .h 文件中有很多私人内容在大多数情况下,我的 .h 文件只是.. EMPTY :)

好吧,即使是苹果也不是很符合他们的风格。始终如一。

空标题?如果您不需要标题,请不要使用标题。使用标头为您的类、函数和类型声明提供接口。

于 2013-04-25T15:05:31.000 回答