第3章 接口与API设计 52条笔记
第3章 接口与API设计 52条笔记
第15条: 用前缀避免命名空间冲突
Objective-C 没有其他语言那种内置的命名空间机制 。鉴于此,我们在起名时要设法避免潜在的命名冲突,否则很容易就重名了。如果发生命名冲突 naming clash ,那么应用程序的连接过程就胡出错。

避免此问题的唯一做法就是变相实现命名空间:为所有名称都加上适当的前缀。
第16条: 提供全能初始化方法
把这种可为对象提供必要信息以便其能完成工作的初始化方法就做 指定初始化方法 designated initialzier.
如果创建实例的方法不止一种,那么这个类就会有多个初始化方法。不过要在其中选定一个作为designated initializer ,令其他初始化方法都来调用它。

上面几个初始化方法中,initWithTimeIntervalSinceReferenceDate:是 designated initializer.
第23条:通过委托与数据源协议进行对象间通信
该模式的主旨是 : 定义一套接口,某对象若想接受另一个对象的委托,则需要遵从此接口,以便成为其委托对象 delegate.而这另一个对象则可以给其委托对象回传一些信息,也可以在发生相关事件时通知委托对象。
一般通过协议 这项语言特性来是实现此模式,整个Cocoa系统框架都是这么做的。
第24条: 将类的实现代码分散到便于管理的数个分类之中
类中经常容易填满各种方法,而这些方法的代码则全部堆在一个巨大的实现文件中。
通过Objective-C的分类机制,把类代码按逻辑划入几个分区中,这对开发与调试都有好处。
把个人信息建模为类。

可以用分类机制把刚才的类改写成下面这样:

现在,类的实现代码按照方法分成了好几个部分。所以说,这项语言特性当然就叫做分类 啦 。
使用分类机制之后,依然可以把整个类都定义在一个接口文件中,并将其代码写在一个实现文件中。可是随着分类数量增加,当前这份实现文件很快就会膨胀。此时,可以把每个分类提取到各自的文件中去。
以EOCPerson为例,可以按照其分类分成以下几个文件:



通过分类机制,可以把类代码分成很多易于管理的小块,以便单独检视 。使用分类机制之后,如果想用分类中的方法,那么要记得在引入EOCPerson.h时一并引入分类的头文件。
虽然稍微有点麻烦,不过分类仍然是一种管理代码的好方法。
第25条:总是为第三方的分类名称加前缀。
第26条: 勿在分类中声明属性
属性是封装数据的方式。尽管从技术上说,分类也可以声明属性,但这种做法应该尽量避免。
关联对象能够解决在分类中不能合成实例变量的问题。

这样做可行,但不太理想。要把相似的代码写很多遍,而且在内存管理问题上容易出错,因为我们在为属性实现存取方法时,经常会忘记遵从其内存管理语义。
尽管这个方法不坏,但笔者不推荐。
把属性定义在主接口中要比定义在分类里清洗得多。
至于分类机制,则应将其理解为一种手段,目标在于扩展类的功能。
有时候只读属性还是可以在分类中使用的。
由于获取方法并不访问数据,而且属性也不需要由实例变量来实现,所以可以像下面这样来实现分类:

第27条: 使用class-continuation 分类 隐藏实现细节
第28条:通过协议提供匿名对象
协议定义了一系列方法,遵从此协议的对象应该实现他们。于是,我们可以用协议把自己所写的API只中的实现细节隐藏起来,将返回的对象设计为遵从此协议的纯id 类型。
在定义受委托者 delegate这个属性时,可以这样写
@property (nonatomic ,weak )id <EOCDelegate>delegate;
由于该属性的类型是id<EOCDelegate>,所以实际上任何类的对象都能充当这一属性,即便该类不继承自NSObject也可以,只有遵循EOCDelegat协议就行。
第3章 接口与API设计 52条笔记的更多相关文章
- effective OC2.0 52阅读笔记(三 接口与API设计)
第三章:接口与API设计 15 用前缀避免命名空间冲突 总结:避免重名符号错误的唯一办法是变相实现命名空间.为所有符号都加上命名前缀.类和分类都应加三字前缀.注意类实现文件中的纯C函数及全局变量,是算 ...
- Flask 教程 第二十三章:应用程序编程接口(API)
本文翻译自The Flask Mega-Tutorial Part XXIII: Application Programming Interfaces (APIs) 我为此应用程序构建的所有功能都只适 ...
- 组件接口(API)设计指南-文件夹
组件接口(API)设计指南-文件夹 组件接口(API)设计指南[1]-要考虑的问题 组件接口(API)设计指南[2]-类接口(class interface) 组件接口(API)设计指南[3]-托付( ...
- 推荐一款接口 API 设计神器!
今天栈长给大家推荐一款接口 API 设计神器,传说中的,牛逼哄洪的 Swagger,它到底是什么?今天为大家揭开谜底! Swagger是什么? 官网:https://swagger.io/ Swagg ...
- 一篇文章帮你梳理清楚API设计时需要考虑的几个关键点
本文作者是Enchant的架构师,他最近研究了Netflix.SoundCloud.谷歌.亚马逊.Spotify等公司的微服务实践,并根据自己的理解总结出了一套适用于现代Web和云技术的微服务实战经验 ...
- 开放接口/RESTful/Api服务的设计和安全方案
总体思路 这个涉及到两个方面问题:一个是接口访问认证问题,主要解决谁可以使用接口(用户登录验证.来路验证)一个是数据数据传输安全,主要解决接口数据被监听(HTTPS安全传输.敏感内容加密.数字签名) ...
- 前后端分离&接口API设计学习报告
接口API设计学习报告 15331023 陈康怡 什么是API? API即Application Programming Interface.API是一种通道,负责一个程序与另一个程序的沟通.而对于w ...
- Api接口幂等设计
1,Api接口幂等设计,也就是要保证数据的唯一性,不允许有重复. 例如:rpc 远程调用,因为网络延迟,出现了调用了2次的情况. 表单连续点击,出现了重复提交. 接口暴露之后,会被模拟请求工具(Jem ...
- spring boot: 设计接口站api的版本号,支持次版本号(spring boot 2.3.2)
一,为什么接口站的api要使用版本号? 1,当服务端接口的功能发生改进后, 客户端如果不更新版本, 则服务端返回的功能可能不能使用, 所以在服务端功能升级后, 客户端也要相应的使用 ...
随机推荐
- DedeCms如何调用Discuz论坛主题等数据方法总结
DedeCms如何调用Discuz论坛主题等数据方法总结 同时使用Dedecms和Discuz论坛的朋友,难免要在网站内调用论坛的内容.使用Discuz论坛的JS调用方式,对搜索引擎不够友好,下面我们 ...
- MYSQL进阶学习笔记十:MySQL慢查询!(视频序号:进阶_23-24)
知识点十一:MySQL 慢查询的应用(23) 一.慢查询定义 MySQL记录下查询超过指定时间的语句,我们将超过指定时间的SQL语句查询称为慢查询. 查看时间限制 show variables lik ...
- 使用cocoaPods加载框架的具体步骤:
注意事项: 1.使用之前备份一下代码.因为pod更新很快,如果某个文件名有中文,pod install 一下.整个项目可能就要废掉了. 2.如果不把pod文件推动到远程服务器. 每一次用的时候在本地p ...
- ASP.NET WebServce项目下添加Http服务,支持Get,Post请求方式;传输格式json/xml
由于WEBServce老项目中需要增添新的接口,而且添加的接口不希望被其它项目以引用Servces方式使用. 那么得在现有Service项目中添加Http请求方式来实现系统间数据交互.只需要告知请求地 ...
- 理解iOS Event Handling
写在前面 最近的一个iOS App项目中遇到了这么问题:通过App访问服务器的大多数资源不需要登录,但是访问某些资源是需要用户提供验证的,一般来说,通常App的做法(譬如美团App)将这些资源放在“我 ...
- 【SDOI2009】SuperGCD
[题目链接] 点击打开链接 [算法] 1.关于求最大公约数的算法 若使用辗转相除法,那么显然会超时 不妨这样思考 : 要求gcd(a,b), 若a为偶数,b为偶数,则gcd(a,b) = 2 * gc ...
- USACO 回文的路径
传送门 这道题和传纸条在某些方面上非常的相似.不过这道题因为我们要求回文的路径,所以我们可以从中间一条大对角线出发去向两边同时进行DP. 这里就有了些小小的问题.在传纸条中,两个路径一定是同时处在同一 ...
- SPOJ FIBOSUM && FIBOSUM2
Fibonacci数列定义为 $$f_n = f_{n-1}+f_{n-2}, \text{以及初值}f_0=0, f_1=1.$$ 本文之讨论,皆在模$10^9+7$意义下. FIBOSUM 给定$ ...
- In-App Purchase Programming Guide----(五) ----Delivering Products
Delivering Products In the final part of the purchase process, your app waits for the App Store to p ...
- Codeforces - 773A - Success Rate - 二分 - 简单数论
https://codeforces.com/problemset/problem/773/A 一开始二分枚举d,使得(x+d)/(y+d)>=p/q&&x/(y+d)<= ...