close
当前位置: 物联网在线 > 技术文库 > ios >

那些设计iOS API需要知道的事

为了能够将我们项目中的代码能够在后续开发者使用(重用代码),通常使用的方法是将代码按照功能模块编写成API。那么我们就很有必要了解Objective-C语言中常见的编程范式(paradigm),同时还需了解各种可能碰到的陷阱。

命名 命名冲突的问题

Objective-C没有其他语言的那种内置命名空间(namespace)机制。因此,我们只能自己想办法来解决命名冲突问题。最常用的解决方式就是,仿照其他语言(C++)建立自己的namespace,例如,使用前缀。

所选前缀可以是与公司、应用程序或二者皆有关联之名。例如,ZAKER User Interface可以使用ZUI作为前缀。使用Cocoa创建应用程序时一定要注意,Apple宣称其保留使用所有“两字母前缀”(two-letter prefix)的权利,所以开发者选用的前缀应该是三个字母的。如果开发者使用了两个字母作前缀,那么很有可能开发者自定义的API和Apple的API冲突。

不仅仅是类名,应用程序中的所有名称都应该加前缀。如果要为既有类新增“分类”(category),那么一定要给“分类”及“分类”中的方法加上前缀。另外,类的实现文件中所用的纯C函数及全局变量也应该注意添加前缀。

如果使用了第三方库编写自己的代码,并准备将其发布为程序库供他人开发应用程序所用,则尤其要注意重复符号问题。这种情况下为了避免使用者使用了与你相同的第三方库,应该为第三方库都加上你自己的前缀。

那些设计iOS API需要知道的事

命名方式

类、方法和变量的命名是Objective-C编程的重要环节。如果命名方式好,可以提高代码可读性,减少不必要的注释。

初学者通常会觉得Objective-C是门很繁琐的语言,因为其语法结构使得代码读起来和句子一样。命名中一般都带有“in”、“for”、“with”等介词,特别是在命名时还要讲究英文语法。例如:

NSString *text = @"This is a good idea."; NSString *newText = [text stringByReplacingOccurrencesOfString:@"idea" withString:@"think"];

上面的代码虽然用了比较啰嗦的方式描述一个看上去很简单的表达式。对于执行替换的那个方法,代码读起来就像日常语言里的那个句子:“Take text and give me a new string by replacing the occurrences of the string ‘idea’ with the string ‘think’”。

这个句子准确描述了开发者想做的事。在命名不像Objective-C这般繁琐的语言中,类似的程序可能会写成:

string text = "This is a good idea."; string new Text = text.replace("idea", "think");

上面代码这样写,看起来方法名简洁很多,但是带来的代码不可读性却是非常大的。首先,我们不知道 text.replace 方法的两个参数到底按照什么顺序解读(除非查看方法声明);再者,这两个参数谁替换谁?

另外,和大多数语言一样,Objective-C也是采用“驼峰式大小写命名法”(camel casing)——以小写字母开头,其后每个单词首字母大写。

方法命名

清晰的方法名从左至右读起来好似一段文章。并不是说非得按照那些命名规则来给方法起名,不过这样做可以令代码变得更好维护,使他人更容易读懂。

虽然类似C++或Java中那种函数命名简单,但是,若想知道每个参数的用途,就得查看函数原型,这会令代码难于读懂。

NSString这个类展示了一套良好的命名习惯。下面列举几个方法及命名缘由:

1) + (instancetype)string;
工厂方法(factory method),用于创建新的空字符串。方法名清晰地描述了返回值的类型。

2) + (instancetype)stringWithString:(NSString *)string;
工厂方法,根据某字符串创建出与之内容相同的新字符串。与创建空字符串所用的那个工厂方法一样,方法名的第一个单词也指明了返回类型。

3) + (instancetype)localizedStringWithFormat:(NSString *)format, ...;
工厂方法,根据特定格式创建出新的“本地化字符串”(localized string)。返回值类型是方法名的第二个单词(string),因为其前面还有个修饰语(localized)用来描述其逻辑含义。此方法的返回值依然是“字符串”(string),只不过是一种经过本地化处理的特殊字符串。

4) - (NSUInteger)lengthOfBytesUsingEncoding:(NSStringEncoding)enc;
若字符串是以给定的编码格式(ASCII、UTF8、UTF16)来编码的,则返回其字节数组长度。此方法与length相似,但该方法还需一个参数,该参数紧跟着方法名中描述其类型的那个名词(encoding)。

因此,我们可以总结成几条方法命名规则:

1)如果方法的返回值是新创建的,那么方法名的首个词应该是返回值的类型,除非前面还有修饰语,例如localizedString。属性的存取方法不遵循这种命名方式,因为一般认为这些方法不会创建新对象。即便有时返回内部对象的一份拷贝,我们也认为那相当于原有对象。这些存取方法应该按照其所对应的属性来命名。

2)应该把表示参数类型的名词放在参数前面。

3)如果方法要在当前对象上执行操作,那么就应该包含动词;若执行操作时还需要参数,则应该在动词后面加上一个或多个名词。

4)不要使用str这种简称,应该使用string这样的全称。

5)boolean属性应加is前缀。如果某方法返回非属性的boolean值,那么应该根据其功能,选用has或is当前缀。


(责任编辑:ioter)

用户喜欢...

三相电机驱动器英飞凌iMOTION™MADK平台是模块化应用设计套件

英飞凌科技iMOTIONMADK平台 英飞凌iMOTIONMADK平台是模块化应用设计套件,用于评估紧凑和灵活的三相电机驱动器。 iMOTION MADK评估平台涵盖115 / 230V电机驱动应用,功率高达300W。 提供两种控制板选...


了解电器的最新电机BLDC设计注意事项

诸如洗衣机,空调和冰箱的可变频率家用电器通常使用无刷DC电机(BLDC)。这些电机因其高效率,低噪音和无级调速而在家用电器中很受欢迎。 仍有许多低功率电机 - 例如洗衣机和洗碗机中的...


使用无刷DC驱动器设计的六种奇怪方法

我已经知道了两个绝对真理。首先,无刷直流电机驱动器很酷。每个人都喜欢旋转电机的快感,无刷直流电机通过高速,高功率和高效率来提升令人惊叹的因素。其次,工程师喜欢有创意。有时...


轻松设计出满足性能和成本要求的信号链

从工业过程控制和测量到高速通信和成像,高效的信号采集是各类应用的基础,如此宽广范围的应用类别,要匹配适当的应用组件,创建一个信号链是至关重要的,以便以尽可能低的成本满足性...


50~300MHz的低噪声宽带放大器的设计实例

低噪声放大器是通信、雷达、电子对抗及遥控遥测系统中的必不可少的重要部件,它位于射频接收系统的前端,主要功能是对天线接收到的微弱射频信号进行线性放大,同时抑制各种噪声干扰,...


推荐3大硬件到云设计套件,简化物联网连接和应用开发

Simplicity是IoT开发板的游戏名称,旨在降低复杂性和上市时间。 即插即用的物联网模块和设计套件通过开箱即用的解决方案进一步简化了与云的智能设备连接。它们为电子行业的众多设计人员创...


利用高级 LDO 应对物联网无线传感器电源设计挑战

物联网 (IoT) 在很大程度上依赖于一个无线传感器网络,用来监测温度、湿度、压力、振动、加速度、空气质量、光强度等参数。这些无线传感器采用短程射频技术,例如低功耗蓝牙 (Bluetooth L...


TVS二极管保护设计提高CAN总线可靠性

控制器局域网(CAN)总线是汽车和其他应用的常用总线标准,具有对过电压和过电流的高度内置抗扰度。但是,作为高级车辆电子网络的一部分,多达70个电子控制单元(ECU),设计人员越来越...


5G IoT:字面上的生命或死亡问题

需要零延迟的高风险应用,如远程手术,可能会在网络攻击时造成生命损失。 荷兰海牙 - 移动运营商需要在今年和明年部署5G网络时获得安全保障 - 因为错误的后果将包括生命损失。 这是GSM...


使用毫米波雷达套件快速开发精密目标检测设计

设计人员在设计运动传感器时面临着持续的竞争压力。传感器不仅要体积更小、更精确,并且还要在智能建筑、工厂自动化、交通运输和无人机等多种行业应用中具有更远的检测范围。虽然毫米...