繁体   English   中英

关于.h和.m文件(如何管理)

[英]About .h and .m files (how to manage) [closed]

嗨,经验丰富的程序员!

我想问你一些有关干净代码的问题:)

我想保持代码干净整洁,这就是我的问题:

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全局标识符以及如何组织它们

  • 在将发送此通知的类中的.h文件中#define NSNotificationDataSourceDidLoadData @“ NSNotificationDataSourceDidLoadData”

但是...

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

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

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

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

这是我的方法:

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

在极少数的情况下,一个类具有一些应由几个类访问但不包含“普通”用户的内容,我创建了foo_protected.h头文件,其头文件类定义了“ protected”方法。

关于#define的字词:尽可能避免使用它们。 如果可能,请改用const变量或enum ,因为附加的类型信息可以帮助编译器以这种方式捕获更多错误。 例如,使用enum s有一个很好的好处,如果您有switch但未处理enum所有值,则会收到警告。 如果添加新值,则会在所有忘记处理警告的地方得到警告,而#define则不会。

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

导入框架应始终位于.h中

没有为什么?

导入.h文件应始终位于.m中

那是很模糊的。 而且,如果您需要在头文件中导入内容,该怎么办? 您想对一个类进行子类化,您该怎么做? #import "SomeClass.h"标头中的#import "SomeClass.h"

.h文件应仅具有@class,而不能具有导入(不包括UIKit等框架)

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

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

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

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

您几乎完全正确。

4)#defines呢?

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

苹果在.h文件中有很多私人物品。在大多数情况下,我的.h文件只是..空:)

好吧,甚至苹果也不太符合他们的风格。 始终如一。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM