美术

当前位置:北京快三 > 美术 > Cocoa代码风格指南之命名规范(一)

Cocoa代码风格指南之命名规范(一)

来源:http://www.yylbdq.com 作者:北京快三 时间:2020-01-06 05:49

1. 语言接纳

行使 Objective-C 不利用 斯威夫特 (能够做 Swift知识储备,不选取在实质上项目中State of Qatar

  • Cocoa代码风格指南之命名规范(风流倜傥)
  • Cocoa代码风格指南之制版标准(二)
  • Cocoa代码风格指南之注释标准(三)
  • Cocoa代码风格指南之使用正式(四)

2. 工程构造

  • 为了制止源码归类杂乱,项目必要保证统黄金年代的 Group 布局
  • 为了幸免文件系统汉语件絮乱,能够思量 Group 与文件系统一保险持同步

工程 Group 结构

projectName/
        |-- Frameworks                      静态库
            |-- Flurry.a                        Flurry库
        |-- Vendors                         第三方库
                |-- AFNetworking                库名称
                |-- ...                         引用的第三方库
        |-- Resources                       资源文件等(将Assets资源文件也放入这里)
            |-- images
            |-- html
            |-- css
            |-- js
        |-- Classes
            |-- Modules                     功能模块
                |-- MoudleName1                 功能模块名称1
                    |-- Model                       模型
                    |-- View                        视图
                    |-- Controller                  控制器
                    |-- Utility                     工具类
                    |-- DataManager                 数据管理器
                |-- MoudleName2                 功能模块名称2
                    |-- Model                       模型
                    |-- View                        视图
                    |-- Controller                  控制器
                    |-- Utility                     工具类
                    |-- DataManager                 数据管理器
            |-- Service                     服务组件模块,之后可被单独抽取成SDK的模块
                |-- OMTADK                  广告相关服务
                |-- OMTShare                分享服务
                |...
            |-- Common                         工程内一些通用的机制实现类
                |-- Network                    项目网络请求
                |-- Marco                      宏定义
                |...
            |-- Utils                        基本的工具
                |-- Category                 
                |...
            |-- Other                        项目基本文件(如: AppDelegate, Info.plist等)

正文基于 Google 和 Apple 的代码风格指南开中学关于命名标准部分的下结论。Apple 的指南基本都以命名规范,而 Google的指南则的相比较丰富。命名、风格、使用都有关联,但讲的都以比较基本的正经八百。

3. 切图像和文字件命名规范

取名准则的主导思想是把文件名分成三部分,第生机勃勃有个别是图形的逻辑归属分类,第二有的是图片的表现内容,第4盘部是图表的原委的项目,有个别图片还有第四片段,表示图片表现的景况。首先有多少个法规是:

  • 用韩语命名,不用拼音
  • 每生机勃勃部分用下划线分隔
  • 图片名中两倍图在名字最终要加@2x,三倍图在名字最终要加@3x (日常摄影会弄好卡塔尔国
万能公式: 模块_类别_功能_状态.png
举个列子: tab_button_search_normal.png
说明:    标签   按钮  搜索   默认状态

注:本文只针对 Objective-C。借使是 Swift,你还索要再看下合斯拉维尼亚语档的建议。

4. 代码标准

  • [Apple] :Apple 分明给出建议
  • [Google] :谷歌(GoogleState of Qatar 分明给出提议
  • [General] :通用做法(主观)

4.1 类

通用法规

  • 透过命名可清晰的观察方法及其参数的效应。防止歧义。并在这里根底上尽量做到简约。 [Google] [Apple] [General]
insertObject:atIndex: // 正确
insert:at: // 错误
  • 不畏命名非常长也决不使用简写。除了本文最终那二个历史悠久的简写。 [Google] [Apple] [General]
destinationSelection // 正确
destSel // 错误
  • 尽恐怕使用与 Cocoa 编制程序接口的命名保持统风华正茂。在分裂类中达成平等功效的艺术应该具备同样的名目。 [Apple] [General]
- (int)tag // 在 UIView, UIControl 中都具有相同的功能
- (void)setStringValue:(NSString *) // 在许多 Cocoa classes 中都具有相同的功能
  • 具有办法/常量/变量/属性都应选拔"小驼峰"命名法。除了本文最终这个盛名的大写字母缩略词。 [Google] [Apple] [General]

  • 全体类/体系/合同使用“大驼峰”命名法。 [Google] [Apple] [General]

4-1-1 类名正式

1. 类名应该以项目定好的�大写字母作为前缀.(当前Hayya用HY,新闻项目用NEWS,基础框架服务用OMT).
2. 当你创建一个子类的时候,你应该把说明性的部分放在前缀和父类名的在中间.比如你有一个 OMTNetworkClient 类,子类的名字会是OMTTwitterNetworkClient (注意 "Twitter" 在 "OMT" 和 "NetworkClient" 之间); 按照这个约定, 一个UIViewController 的子类会是 OMTTimelineViewController.
3. 统一相同类型类的后缀命名,常用后缀命名如下:
    3.1 UIViewController的子类命名,以完整的ViewController为后缀.
    3.2 数据模型类的后缀以VO为后缀.  (VO-Value Object)
    3.3 UITableViewCell和UICollectionViewCell的子类,以Cell为后缀
    3.4 其他UI控件的子类,以完整的控件名字为后缀,尽量不用简写

  • 类名应饱含二个显著描述该类(或类的指标)是怎么或做哪些的名词。 [Apple] [General]

  • 在为类增添实例变量是要注意:

  1. 幸免创立 public 实例变量。 [Google] [Apple] [General]
  2. 动用 @private,@protected 显式节制实例变量的拜见权限。 [Google] [Apple]
  3. 确认保证实例变量名删繁就简地叙述了它所表示的品质。 [Google] [Apple] [General]

4-1-1 依照统风华正茂的结构顺序来书写头文件(.h文件卡塔尔(قطر‎

证实:以下内容有个别节没有必要,可以忽视.不过其余节要保持该次序.</br>
头文件布局:

#import <标准库头文件.h>
#import "非标准库头文件.h"
宏定义
常量
类型定义 (枚举类型,�block类型)

协议 [Apple] [General]

  • 大大多研究仅构成风华正茂组有关的章程,而不涉及任何类,这种合同的命名应该利用动名词(ingState of Qatar,以不与类名混淆。
NSLocking // 正确
NSLock // 错误
  • 有一些协议组合一些互为非亲非故的艺术(那样做是防止创制三个独立的小合同)。那样的左券趋向于与有些类关联在一同,该类是斟酌的机要展示者。在此种景况,我们约定合同的称谓与该类同名。NSObject 合同便是如此八个事例。那个公约组合黄金年代组互相毫不相关的点子,有用于查询对象在其类等级次序中地方的主意,有使之能调用特殊情势的法门以至用于增减引用计数的章程。由于 NSObject 是那个办法的严重性反映者,所以 Apple 用类的称谓命名那些左券。

4-1-2 坚守统风度翩翩的布局顺序来书完成文件(.m和.mm文件State of Qatar

评释:以下内容有个别节不供给,能够忽视.不过其他节要保持该次序.</br>
完结公文结构:

#import <标准库头文件.h>
#import "非标准库头文件.h"
宏定义
常量
类型定义 (枚举类型,�block类型)
全局变量

方法

  • 参数后边的单词要能描述该参数。並且格局名应尽量读起来就如句子,所以应当采取与办法名连在协作读起来顺口的参数名。 [Google] [Apple] [General]
- (id)viewWithTag:(int)aTag; // 正确
- (id)taggedView:(int)aTag; // 错误
  • 意味着对象行为的不二等秘书技,名称以动词初叶。 [Apple] [General]
- (void)invokeWithTarget:(id)target:
- (void)selectTabViewItem:(NSTableViewItem *)tableViewItem
  • 措施名称中不要现身 do 或 does,因为那个助动词没怎么实际意义。也休想在动词前应用副词或形容词修饰。 [Apple] [General]

  • 少年老成经措施再次回到方法选取者的某部属性,直接用属性名称命名。不要选择 get。 [Apple] [General]

- (CGSize)cellSize; // 正确
- (CGSize)getCellSize; // 错误
  • 唯有在点子需求直接重返多少个值的状态下,才使用 get。 [Apple] [General]
- (void)getLineDash:(float *)pattern count:(int *)count phase:(float *)phase; UIBezierPath
  • 细化基类中的原来就有点子:创制三个新办法,其名目是在被细化措施名称前边扩张参数关键词。 [Apple] [General]
- (instancetype)initWithFrame:(NSRect)frameRect; // UIView
- (instancetype)initWithFrame:(CGRect)frame style:(UITableViewStyle)style; // UITableView, UIView 的子类
  • 不要选择 and 来延续用属性作参数关键字。 [Apple] [General]
- (int)runModalForDirectory:(NSString *)path file:(NSString *)name types:(NSArray *)fileTypes;
- (int)runModalForDirectory:(NSString *)path andFile:(NSString *)name andTypes:(NSArray *)fileTypes;
  • 生龙活虎经方式描述三种独立的表现,使用 and 来串接它们。 [Apple] [General]
- (BOOL) openFile:(NSString *)fullPath withApplication:(NSString *)appName andDeactivate:(BOOL)flag; NSWorkspace 
  • 绝不在章程的参数名中接受 pointer 或 ptr,让参数的档期的顺序来评释它是指针。 [Apple] [General]

  • 幸免接纳 one, two,...,作为参数名。 [Apple] [General]

  • 奉公守法 Cocoa 惯例,以下爱慕字与参数应同步利用: [Apple] [General]

...action:(SEL)aSelector
...alignment:(int)mode
...atIndex:(int)index
...content:(NSRect)aRect
...doubleValue:(double)aDouble
...floatValue:(float)aFloat
...font:(NSFont *)fontObj
...frame:(NSRect)frameRect
...intValue:(int)anInt
...keyEquivalent:(NSString *)charCode
...length:(int)numBytes
...point:(NSPoint)aPoint
...stringValue:(NSString *)aString
...tag:(int)anInt
...target:(id)anObject
...title:(NSString *)aString

4-1-3 类的结构构造

#pragma mark – Life Cycle
#pragma mark - Events
#pragma mark – Private Methods
#pragma mark – Public Methods
#pragma mark - Delegate
#pragma mark – Getters and Setters

Delegate & DataSource [Apple] [General]

  • 委托方法是那些在一定事件发生时可被对象调用,并扬言在目的的寄托类中的方法。它们有特有的命名约定,那些命名约定同样也适用于对象的数据源方法。

1.称呼以标示发送音讯的靶子的类名开始,省略类名的前缀并小写类第三个字符。

- (BOOL)tableView:(NSTableView *)tableView shouldSelectRow:(int)row;
- (BOOL)application:(NSApplication *)sender openFile:(NSString *)filename;

2.冒号紧跟在类名之后(随后的老大参数表示委派的目标)。该准绳不适用于唯有二个sender 参数的点子。

- (BOOL)applicationOpenUntitledFile:(NSApplication *)sender;

3.方面包车型客车那条法规也不适用于响应文告的艺术。在这里种情形下,方法的独步一时参数表示文告对象。

- (void)windowDidChangeScreen:(NSNotification *)notification;

4.用于文告委托对象操作就要发生或曾经发生的点子名中要动用 did 或 will。

- (void)browserDidScroll:(NSBrowser *)sender;
- (NSUndoManager *)windowWillReturnUndoManager:(NSWindow *)window;

5.用以询问委托对象可以还是不可以实施某操作的艺术名中可应用 did 或 will,但最佳使用 should。

- (BOOL)windowShouldClose:(id)sender;

4.2 命名

取名两大标准是:可读性高和制止命名矛盾(通过加前缀来保证卡塔尔. Objective-C 的命名常常都相比长, 名称坚守驼峰式命名法.

C情势的函数 [Apple] [General]

  • 函数命名与艺术命名雷同,但有几点区别:
  1. 它们有前缀,其前缀与你使用的类和常量的前缀相近。
  2. 大写前缀后紧跟的首先个单词首字符。
  • 大大多函数名称以动词早先,那么些动词描述该函数的作为。
NSHighlightRect
NSDeallocateObject
  • 查询属性的函数有越多的不成方圆要依据:
  1. 询问第三个参数的性质的函数,省略动词。
unsigned int NSEventMaskFromType(NSEventType type)
float NSHeight(NSRect rect)
  1. 再次回到值为援引的措施,使用 get。
const char *NSGetSizeAndAlignment(const char *typePtr, unsigned int *sizep, unsigned int *alignp)
  1. 再次回到布尔值的函数,名称使用剖断动词 is/does 早先。
BOOL NSDecimalIsNotANumber(const NSDecimal *decimal)

4-2-1 常量的命名

对于常量的命名最佳在前头加上字母k作为标志. 如:
在 .m 文件中常量命名

static NSTimeInterval const kAnimationDuration = 0.3;

亟需开放根本文件中的常量命名类名加功能名:

// 苹果的命名
UIApplicationDidEnterBackgroundNotification
// 如 OMTPostCell.h中
FOUNDATION_EXTERN CGFloat const OMTPostCellTitleLabelPadding;
// .m文件中
CGFloat const OMTPostCellTitleLabelPadding = 10;

存取方法 [Apple] [General]

  • 存取方法是指用来博取和安装类属性值的主意,属性的不及档案的次序,对应着分化的存取方法规范。

  • 只要属性是用名词描述的,则命名格式为:

- (NSString *)title;
- (void)setTitle:(NSString *)title;
  • 即使属性是用形容词描述的,则命名格式为:
- (BOOL)isEditable;
- (void)setEditable:(BOOL)editable;
  • 若是属性是用动词描述的,则命名格式为:(动词要用今后时时态)
- (BOOL)showsAlpha;
- (void)setShowsAlpha:(BOOL)showsAlpha;
  • 不要选拔动词的过去分词方式作形容词使用。
- (void)setAcceptsGlyphInfo:(BOOL)flag; // 正确
- (BOOL)acceptsGlyphInfo; // 正确
- (void)setGlyphInfoAccepted:(BOOL)flag; // 错误
- (BOOL)glyphInfoAccepted; // 错误
  • 能够接纳情态动词(can, should, will 等)来巩固清晰性,但并非选择 do 或 does。
- (void)setCanHide:(BOOL)flag; // 正确
- (BOOL)canHide; // 正确
- (void)setShouldCloseDocument:(BOOL)flag; // 正确
- (void)shouldCloseDocument; // 正确
- (void)setDoseAcceptGlyphInfo:(BOOL)flag; // 错误
- (BOOL)doseAcceptGlyphInfo; // 错误

4-2-2 枚举的命名

枚举类型命名要加相关类名前缀何况枚举值命名要加枚举类型前缀.

typedef NS_ENUM(NSInteger, UIViewAnimationTransition) {
    UIViewAnimationTransitionNone,
    UIViewAnimationTransitionFlipFromLeft,
    UIViewAnimationTransitionFlipFromRight,
    UIViewAnimationTransitionCurlUp,
    UIViewAnimationTransitionCurlDown,
};

常量

  • 常量命名法规依靠常量创立的格局差别而大为差别。

  • 枚举常量

1.用到枚举来定义豆蔻梢头组有关的平头常量。 [Apple] [General]
2.枚举常量与其 typedef 命名服从函数命名法规。如:来自 NSMatrix.h 中的例子:(本例中的 typedef tag(_NSMatrixMode)不是必得的) [Apple] [General]

typedef enum _NSMatrixMode {
    NSRadioModeMatrix           = 0,
    NSHighlightModeMatrix       = 1;
    NSListModeMatrix           = 2,
    NSTrackModeMatrix           = 3
} NSMatrixMode;

3.位掩码常量能够应用不具名枚举。如: [Apple] [General]

enum {
    NSBorderlessWindowMask         = 0,
    NSTitledWindowMask             = 1 << 0,
    NSClosableWindowMask           = 1 << 1,
    NSMiniaturizableWindowMask      = 1 << 2,
    NSResizableWindowMask          = 1 << 3
};
  • 使用 typedef NS_ENUM/NS_OPTIONS 来表明枚举。 [General]

C++11 规范扩张了枚举的特点,能够指明用何种“底层数据类型”来保存枚举类型的变量。那样做的利润是足以向前评释枚举变量。Foundation 框架中定义了某个相助宏来钦定用于保存枚举值的底层数据类型。那几个宏具有向后特别本领,如若目的平台的编写翻译器扶助新的规范,就选拔新语法,否则改用旧式语法。所以建议那样来使用。

typedef NS_ENUM(NSInteger, UIViewAnimationCurve) {
    UIViewAnimationCurveEaseInOut,         // slow at beginning and end
    UIViewAnimationCurveEaseIn,            // slow at beginning
    UIViewAnimationCurveEaseOut,           // slow at end
    UIViewAnimationCurveLinear
};
  • const 常量 [Apple] [General]
  1. 运用 const 来修饰浮点常量或彼此未有涉及的整数常量。
  2. 北京快三,枚举常量命名准绳与函数命名法规平等。const 常量命名楷模:
const float NSLightGray;
  • 此外常量 [Apple] [General]
  1. 习感觉常不选用 #define 来创制常量。如上面所述,整数常量请使用枚举,浮点数常量请使用 const。
  2. 采取大写字母来定义预管理编写翻译宏。如:#ifdef DEBUG。
  3. 编写翻译器定义的宏名首尾皆有双下划线。如:__MACH__。
  4. 为 notification 名及 dictionary key 定义字符串常量,进而能够使用编写翻译器的拼写检查,减弱书写错误。Cocoa 框架提供了成百上千那样的模范:
APPKIT_EXTERN NSString *NSPrintCopies;

实则的字符串值在得以实现公文中予以。(注意:APPKIT_EXTEPAJERON 宏等价于 Objective-C 中 extern)

4-2-3 变量的命名

titleLabel    //表示标题的label,  是UILabel类型 
confirmButton //表示确认的button, 是UIButton类型

数量集结 [Apple] [General]

  • 处理对象(集结中的对象被称呼成分)的集结类,约定要享犹如下情势的措施:
- (void)addLayoutManager:(NSLayoutManager *)adObj;
- (void)removeLayoutManager:(NSLayoutManager *)anObj;
- (NSArray *)layoutManagers;
  • 聚拢方法命名好似下一些约束和预订:
  1. 如果集结中的成分冬天,再次来到 NSSet,实际不是 NSArray。
  2. 假设将成分插入钦赐地方的法力很主要,则需持好似下方法:
- (void)insertElement:(elementType)anObj atIndex:(int)index;
- (void)removeElementAtIndex:(int)index;
  • 晤面方法的贯彻要思虑如下细节:

1.上述会集类方法日常担任管理成分的主人关系,在 add 或 insert 的落到实处代码里会 retain 成分,在 remove 的落实代码中会 release 成分。
2.当被插入的对象急需全体指向集结对象的指针时,日常选取 set... 来命名其安装该指针的法子,且不要 retain 群集对象。比方上边的 insertLayerManager:atIndex: 这种情形,NSLayoutManager 类使用如下方法:

- (void) setTextStorage:(NSTextStorage *)textStorage;
- (NSTextStorage *)textStorage;

3.兴味索然你不会直接调用 setTextStorage:,而是覆写它。

  • 另两个有关集合约定的事例来自 NSWindow 类:
- (void)addChildWindow:(NSWindow *)childWin ordered:(NSWindowOrderingMode)place;
- (void)removeChildWindow:(NSWindow *)childWin;
- (NSArray *)childWindows;
- (NSWindow *)parentWindow;
- (void)setParentWindow:(NSWindow *)window;

本文由北京快三发布于美术,转载请注明出处:Cocoa代码风格指南之命名规范(一)

关键词: