您在.m文件顶部添加的NAMELESS类别的最佳名称是什么?

时间:2011-01-02 20:23:35

标签: iphone objective-c cocoa

所以前几天我厌倦了输入重复的addTarget:action:forControlEvents:s,而宏只是娱乐这么久,所以我这样做了:

@implementation UIControl (xx)
-(void)addTarget:(id)target action:(SEL)action
 {
 [self addTarget:target action:action forControlEvents:UIControlEventTouchUpInside];
 }
@end

,只需将其添加到相关.m文件的顶部。

当然很有效,但请注意“xx”。

NAME这样的“无名”类别最棒的是什么?

请注意,它确实 NEEDS NO NAME,因为名称永远不会在任何地方使用。最好的办法就是不给它起名字 - 但从语法上讲,你不能把它留空。

(如果你把xx留空 - 它就变成了一个“扩展”,这是完全不同的。)

我想的可能是:

  • 单个下划线
  • 同样的类名称
  • “quick”
  • 也许是这个文件中类的名称(如“CherryBomb中UIControl的快速额外例程”) - 所以它将是UIControl(CherryBomb),即提醒你这些额外的例程对于CherryBomb来说很方便确实在文件CherryBomb.m
  • “X”
  • 您或您公司的姓名首字母(在任何地方使用相同的“快速”类别名称)
  • “ThisTextNeverUsedAnywhere”

(顺便说一下......看来你实际上需要包含这样一个类别的界面,即你可以省略......

//you can actually get away without these lines...
//#import <UIKit/UIControl.h>
//@interface  UIControl (x)
//-(void)addTarget:(id)target action:(SEL)action;
//@end

......那部分并且工作正常。)

对于喜欢分类的人,以及不喜欢分类的人,这个令人不安的问题的答案是什么?

您应该为“无名”类别 命名,其中名称永远不会再次使用且无关紧要 ,因为文本仅直接在顶部输入一个.m文件只能在该文件中使用?

7 个答案:

答案 0 :(得分:3)

Extension与Category 相同,但额外的方法必须与原始类进入相同的实现。

这对于将私有方法添加到不需要在头文件中公开或重新声明@properties的类非常有用。

显然,在将类别添加到没有源代码的类时,不能使用此功能。例如 UIControl

至于我如何命名类别:我使用我的三字母前缀和“扩展”一词,例如:

UIControl (ADNExtensions)

答案 1 :(得分:3)

我只使用Private。因为他们是,私下......我很想听听人们对此的看法。 :)

答案 2 :(得分:1)

我看不出_有什么问题。

答案 3 :(得分:1)

我喜欢这样的命名约定“UIControl + MyClassName”,并且通常将命名类别添加到系统类“UIControl + MyPurpose”。

答案 4 :(得分:1)

如果它是一个快速的,袖手旁观的类别,那么我会称之为DDAdditions。如果它应该更正式,那么我将弄清楚该类别的定义目的是什么,并从中构建一个名称。

修改更多信息:

这就是我的所作所为:

当我命名包含该类别的文件时,它的格式始终为:

BaseClass+CategoryName.h/m

因此,如果我有一个名为UIButton的{​​{1}}类别,则该文件的名称为FooBar。在我的源代码树中看到这个构造会立即告诉我2个(可能是3个)事情:

  1. 我正在扩展课程
  2. 我正在推广的课程
  3. 扩展的目的是什么(如果类别名称足够描述)
  4. 如果我在单个文件中声明多个类别,那么“BaseClass”位可能会根据扩展类的相关方式而有所不同。

    1. 如果存在可变不可变关系(即,我将UIButton+FooBar.h/mNSArray扩展为提供不可变和可变变体的类别[例如:NSMutableArray和{{ 1}}]),然后我只使用-[NSArray shuffledArray]作为基类。
    2. 如果有一种亲切的关系(我正在扩展的东西都是集合),那么我会尝试提出反映该关系的基本名称,例如-[NSMutableArray shuffle]
    3. 如果我不能想出类别相关的方式,那么它们不应该在同一个文件中。使用单个文件“在这里和那里只添加一些没有定义目的的小类别”(在我看来)是错误的。文件名与方法名称一样,应反映文件的用途。
    4. 提出正确的类别名称需要练习。如果我赶时间或只是添加一个类别来尝试一些东西,我将使用“DDAdditions”(我的缩写+“Additions”)。如果我使用类别隐藏类的方法,我会使用“私有”或“内部”之类的东西。

      否则,我找到了这些方法的目的并构建了一个名称。

      例如,如果我向NSArray添加方法以获取其键值对并将URL编码为查询字符串,那么我将调用类别Collections+CategoryName.h/m或{{ 1}}或类似的东西。

      这里的主要原则是描述性的。真的,无论你称之为什么类别,或者你的名字是什么,只要它清楚它们是什么。 (我们喜欢Objective-C的一个原因是它的详细程度使它在很大程度上是自我记录的)唯一需要注意的是确保你的类别与另一个类别的名称不同类。 (以及您的方法名称不会发生冲突等)

答案 5 :(得分:1)

类别的问题在于编译器和链接器需要类别的名称才能区分符号,否则它无法找到符号并正确构建类。所以称之为“私人”,“添加”或“便利”,但无论如何你都需要一个名字,如果你碰巧在不同文件中为同一个班级分别有两种类型,我建议你去找不同的名字,或更好的:遵循戴夫的建议。

注意,可能已经为类扩展删除了名称,因为它们只是接口,很容易指示编译器忽略类别名称,只需将方法作为临时声明添加到主类块中,从而放置未实现方法时@implementation内的警告。

对于类别,您不需要将@interface与@implementation匹配,反之亦然:@interface将仅包含您不一定需要实现的声明(但是,不要尝试调用它们)如果它们没有实际实施,你将会崩溃...)。如果在使用之前将@implementation单独放在没有@interface的情况下,编译器将存储方法声明,从而删除“可能不响应选择器”警告。

注意:您也可以编写Xcode宏来直接构建“便利”类别......

答案 6 :(得分:0)

我更喜欢以他们所做的命名。在你给出的例子中,我称之为“UIControl + Convenience”或“UIControl + Targets”。 KWTargets或JBTargets也没关系。您的大多数示例都会告诉您很少或根本没有关于该类别的作用,当您尝试理解不熟悉的代码时(或者因为其他人编写它,或者因为您暂时没有查看它),这会让您感到困惑。