Programming With Objective-C
Posted 题材新颖
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Programming With Objective-C相关的知识,希望对你有一定的参考价值。
本篇是苹果官方文档 Programming With Objective-C 的最后一篇,主要内容是关于 OC 开发的规范问题。
对于初次接触 OC 的人来说,刚开始肯定还是会有一点不习惯的。但是上手之后会觉得非常舒服,其中有一大原因就在于,OC 的规范是非常统一的,各个库之间的一些命名等是非常符合规范的,用起来就感觉很顺畅。
编码规范有很多好处,这里不会一一列出来,只是简单地谈一下。在苹果的开发中,或者说 OC 的开发中,采用规范的编码方式到底有什么好处。OC 编程有一个很重要的特性,KVC 或者比较相似的 KVO,这两个技术都和命名的规范沾边,想要用 OC 写出一个好程序,没有好的编码习惯是不行的。
基本命名规范
关于命名,我们最早接触的概念就是,命名要具有唯一性,要防止冲突。这是命名最基本的一点,因为产生了命名上的冲突,那么程序的可读性还有可维护性就太差了。
类名
关于类名的话,在整合的时候还是比较容易出现命名冲突的,因为各个插件,库的开发者们在考虑的时候可能会构建出名字相同但是内部的功能又不一样的类,这个时候就非常容易让阅读代码的人感到疑惑。苹果官方对此的做法就是,采取前缀,通过前缀来区分各个不同的类。以官方的库为例:
前缀 | 框架 |
---|---|
NS | Foundation/Application Kit(OS X) |
UI | UIKit(ios) |
AB | Address Book |
CA | Core Animation |
CI | Core Image |
苹果官方采用了两个字母来区分各个框架中的不同类,对于开发者而言,苹果官方推荐采用三个字母作为前缀来进行区分,这三个字母可以从公司名、应用名或者应用内某个部件的名称中取出来进行区分。另外,就是关于类名要记得它应该是可以反映出来这个类到底能够用于做什么的,不要取一个太过抽象的名字。
函数名
函数名主要是在类的内部,不过有时候也会出现两个类中有名称相同的方法的情况,比如在继承的体系中,或者在使用多态的时候。苹果官方在这个方面的要求还是比较严格的,如果两个函数执行的内容不一样,那么它们应该有着不同的名称,但是如果两个函数执行的内容是一样的,那么它们的名称、返回类型、甚至是参数都应该是一样的。
函数的命名不需要考虑前缀的情况,但是应该以小写字母开头,后面的单词按照驼峰式写法首字母大写。另外,如果函数有着多个参数,那么对于每个参数都是应该指明的。
在给函数命名的时候,大体上可以这么做:首先考虑函数起什么作用,或者函数将会返回什么,这个将作为函数名的第一个部分,一般可能一个词就可以解决,不过如果返回的值存在一定的意义的话,可能需要用多个单词来描述。然后再考虑这个函数需要什么参数,给每个参数加一点描述,就可以组成整个函数名。对于参数,如果有 error 指针,那么应该作为函数的最后一个参数。如果有 block,那么就应该把 block 作为最后一项。那么如果既有 error 又有 block 呢?这个官方并没有给出答案,不过 error 放到最后的原因是为了更加方便的知道这个函数是可能返回 error 对象的,而 block 放到最后的原因是为了方便看到调用信息,所以这两个同时存在的情况下怎么抉择,只能说是仁者见仁智者见智了。
函数前缀
对于类我们一般会使用前缀来进行区分,不过对于函数来说是否要使用前缀呢?一般情况下是不需要的,不过也有特殊情况,之前在降到类别的时候也有提到,对于 OC 官方库中的类,如果我们使用类别来进行扩充,那么就需要加一个前缀来避免冲突。
局部变量
其实局部变量的命名挺简单的,注意不要给出没有意义的命名就好了。不过苹果官方有另外一个推荐,那就是在一个作用域内,不要出现重复的命名。这也就是说,哪怕这作用域内部的某个代码块中,我们也要尽量避免命名上的重复,因为官方认为这对可读性有一定影响。
一般来说,命名规范只是作为推荐,不过对于 OC 来说有些不同,因为苹果的 KVC 和 KVO 是以命名为基础的,所以如果做 OC 相关的开发,最好还是多注意一下命名上的规范,否则可能会在某些意想不到的地方出现问题。
以上是关于Programming With Objective-C的主要内容,如果未能解决你的问题,请参考以下文章
Aspect-Oriented Programming : Aspect-Oriented Programming with the RealProxy Class
System and device programming——R&W with semaphore
PyQt5 GUI Programming With Python 3.6
[RxJS] Reactive Programming - Using cached network data with RxJS -- withLatestFrom()