您的位置:首页 > 移动开发 > Objective-C

Objective-C:神在细节之中

2015-11-23 18:53 211 查看
Objective-C:神在细节之中
内容来源:CocoaChina

说明:关于《VIP群福利:天才帝一步应用源代码分享》里面介绍的“天才帝一步”应用上传到AppStore的问题,这个APP我是出售给我的一个朋友,他要的是这个APP的流量。所以大家尽管进行一些改动,然后上传到AppStore。代码已经放在iOS开发实战交流VIP群共享文件里面!

Objective-C是 C
语言的扩展,增加了动态类型和面对对象的特性。它被设计成具有易读易用的,支持复杂的面向对象设计的编程语言。它是 Mac OS X 以及 iPhone 的主要开发语言。

Cocoa是 Mac OS X
上主要的应用程序框架之一。它由一组 Objective-C 类组成,为快速开发出功能齐全的 Mac OS X 应用程序提供支持。

而在日常的编程中,我们除了要写代码,还需要去阅读别人的代码,熟悉过往的业务逻辑。不知,你可曾发过牢骚:这代码怎么能这么写呢?有些时候我们的代码,也会被别人去读,不知你可曾想过,当别人读到你的代码的时候会作何评价。

诚然,“让代码能够工作”是做为开发者的头等大事。但是,代码的可维护性却是更加影响深远的一件事情。你的代码既有可能在下一个版本中被修改,也极有可能被交给另外的同事去修改。毕竟我们写代码,不止是在和机器沟通,而且也是在和人沟通——和其他的程序员沟通。大家都知道“学好普通话,走遍天下都不怕”,同样的道理:写出一手漂亮的代码,你和谁沟通都没问题。

即使你的原始代码修改之后,其代码风格和可读性仍会影响到可维护性和可扩展性。即使代码不复存在,你的风格和律条仍存活下来。

下面我们将围绕一些基本的准则展开讨论,目的是让我们写出一手漂亮的代码,更好的用代码与其他同事沟通,也为了提高我们代码的可维护性和可修改性,也是为了让我们自己工作的地方有一个愉悦的代码环境。

(PS:当你真的按照这些看似偏执的规则去做的时候,你就真的能够发现“伟大来自细节”,而且会受益匪浅。保剑锋自磨砺出,梅花香自苦寒来。)

总则

1.Don’t repeat your self.

2.代码自注释,依靠代码本身来表达你的设计意图,不要依赖注释。

3.单一指责,无论是类、函数、模块、包尽可能令其指责纯净且单一。

4.死程序不说谎,不要因为防止Crash写奇葩的代码。程序Crash了,反而更容易查找错误。

5.借用美国童子军军规:让营地比你来时更干净。

格式

1.任意函数长度不得超过50行。

2.任意行代码不得超过80字符。可以在设置中设置超过80个字符的提醒。

3.在定义函数的行前留白一行

4.功能相近的代码要放在一起。

5.使用#pragma来切分不同功能区域的代码。

6.二元运算符和参数之间需要放置一个空格,一元运算符、强制类型转换和参数之间不放置空格。关键字之后圆括号之前需要放置一个空格.

7.长的字面值应被拆分为多行。

命名

命名是编程中最基本的技能,我们给变量、函数、类、包等等命名。给他们以名字,让他们有意义,既能表示他们到底是做什么的,也能将其与其他变量区别开来。而通过,语言的发展史,我们也能够看到“方便编程人员理解和使用”一直都是编程语言发展的动力之一,而命名则是其最最核心的环节。像人一样娶一个好名字至关重要,“丁当”总比“狗蛋”来的好听。

为什么要命名?命名代表着抽象,我们使用名字将一些没必要关系的细节隐去,减少我们自己的记忆成本,也更加方便我们理解。用过C语言的人都知道,一个变量名最终会转化成类似于~~~0x11111111~~~之类的地址,相比去理解和记忆这些地址,用一个更加抽象的变量名来代表这些地址。无论从理解还是记忆上都要方便的。

命名一定要“名副其实”,尽可能使用有意的名称,而且这个意义和指称的变量真实意义相关。

尽量不要出现没有任何意义的命名类似于下述形式的命名:

int a = 1;

int b = 3;

CGPoint point = CGPointMake(a,b);

如果换成下面的形式是不是可读性强了很多:

int startX = 1;

int startY = 3;

CGPoint
startPoint = CGPointMake(startX,startY);

命名首字母大写,其他命名首字母小写。并且采用驼峰格式分割单词。

例如:BWTest

使用能够读出来的名称

人类长于记忆和使用单词。大脑中的相当一部分就是用来容纳和处理单词的。单词如果能够读的出来,则非常方便我们阅读和理解。

错误的示例: genymdhms
(生成日期,年、月、日、时、分、秒)

正确的实例: generationTimeStamp

使用可搜索的名称

单字母名称和数字常量有一个问题,就是很难在一大篇文字中找出来。试想一下,你找~~~MAX_CLASSES_PER_STUDENT~~~容易还是找数字7容易。

文件名

文件名反映出了其实现了什么类(包括大小写),你需要遵循所参与醒目的约定。

文件的扩展名及其意义如下:

类别的扩展名以“被扩展的类名+自定义命名部分组成”

例如:NSSstring+Utils.h

缩略词

虽然方法命名不应使用缩略词,然而有些缩略词在过去被反复的使用,所以使用这些缩略词能更好的的表达代码的含义。下表列出了Cocoa可接受的缩略词。

以下是一些常用的首字母缩略词:ASCII,PDF,XML,HTML,URL,RTF,HTTP,TIFF,JPG,PNG,GIF,LZW,ROM,RGB,CMYK,MIDI,FTP…

宏定义全部字母大写,例如:#define BW_DEBUG 1

常量定义,字符串定义以小写字母 k
开头,随后首字母大写

staticNSString* const kBWBarTitle = @"动态";

如果要定义常量使用static const优于宏定义,前者会进行类型检查

因为OC没有命名空间的概念,所以使用前两个或者多个字母来表示命名空间,例如”NSObject中的NS”,我们也使用自己的命名空间。比如

红点中使用了VAS:VASAddValueInfo...

钱包中使用了QW:QWApplication....

注释

让代码自注释,不要依赖注释来解释自己的设计或者编码意图。除了特殊情况外,代码中不要有多余的注释。

类与对象

明确指定构造函数

注释并且明确指定你的类的构造函数。

对于需要继承你的类的人来说,明确指定构造函数十分重要。这样他们就可以只重写一个构造函数(可能是几个)来保证他们的子类的构造函数会被调用。这也有助于将来别人调试你的类时,理解初始化代码的工作流程。 ###重载指

定构造函数

当你写子类的时候,如果需要 init… 方法,记得重载父类的指定构造函数。

如果你没有重载父类的指定构造函数,你的构造函数有时可能不会被调用,这会导致非常隐秘而且难以解决的 bug。

重载 NSObject的方法

如果重载了 NSObject
类的方法,强烈建议把它们放在 @implementation 内的起始处,这也是常见的操作方法。

通常适用(但不局限)于init…,copyWithZone:,以及dealloc方法。所有init…方法应该放在一起,copyWithZone: 紧随其后,最后才是dealloc 方法

观察者模式

如果只是单纯的传递数据,不要使用观察者模式,容易导致逻辑链断裂。

参考资料

1.《Clean Code》

2.《编写可阅读代码的艺术》

3.《Google Objective-C Style Guide》

4.《Introduction to Coding Guidelines forCocoa》

5.《iOS应用开发最佳实践系列一:编写高质量的Objective-C代码》
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: