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)

用户喜欢...

聊一聊iOS的那些生命周期

iOS应用程序的生命周期,还有程序是运行在前台还是后台,应用程序各个状态的变换,这些对于开发者来说都是很重要的。iOS系统的资源是有限的,应用程序在前台和在后台的状态是不一样的...


iOS 开发周报:苹果正在重新设计 Mac Pro、Weex 布局引擎(Yoga)探究

苹果正在重新设计 Mac Pro :苹果正在加班加点开发一款 完全重新思考 的 Mac Pro,采用模块化设计,可以为高端 CPU 和 GPU 提供空间,而且未来的升级也将更加方便。苹果还在开发自有品牌的专...


iOS的那些面试

笔试面试是程序员应聘绕不过的坎,想进大厂就一定要有知识储备量,而这个却是最佳的考察方式。笔者分享一些收集的iOS面试题,答案仅供参考,如有错误,还请指正。 第一部分 1.Objecti...


iOS 组件化 —— 路由设计思路分析

前言 随着用户的需求越来越多,对App的用户体验也变的要求越来越高。为了更好的应对各种需求,开发人员从软件工程的角度,将App架构由原来简单的MVC变成MVVM,VIPER等复杂架构。更换适合...


iOS 导航栏的那些事儿

最近项目里有个需求和导航栏的样式定制有关,深入之后发现之前理解的一些概念有些模糊,刚好趁着这次机会全面整理了一下。 从 iOS7 开始,苹果采用了大量的扁平化和毛玻璃风格,刚升...


iOS那些“垃圾”的轮播

轮播视图通常也叫Banner,90%以上App都会用到的一个控件,网上有很多开源代码,但是至今我觉得比较好的一个是 SDCycleScrollView ,因为他解决了我接下来要吐槽的两个问题。 通常实现定时自动...


iOS开源 - 复制 iOS 样式库到 Sketch 以改善、加速设计流程

I’ve decided to take styles from Xcode and do my best to replicate them for Sketch. Along the way, I documented the process of how I ended up with the result so you can look into things even further. UIBlurEffectStyle The API doesn't provide any...


Java开发者需要了解的移动开发编程语言

移动应用开发行业在过去的五年里飞速地成倍增长,改变了全球企业功能。随着企业在最近一段时间调整移动应用到他们的生产力,以及他们跨平台移动设备的快速创新;它需要移动应用程序...


总结iOS开发中的断点续传那些事儿

前言 断点续传概述 断点续传就是从文件赏赐中断的地方重新开始下载或者上传数据,而不是从头文件开始。当下载大文件的时候,如果没有实现断点续传功能,那么每次出现异常或者用户主...


使用WKWebView遇见的那些坑

iOS8之后出了WKWebView,据说加载速度和内存占用情况都甩UIWebView好几条街,鉴于我们公司的项目用到挺多的webView,于是简单的调研下决定用WKWebView替换UIWebView。WKWebView的使用方法不多少,相信...