第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,当服务端接口的功能发生改进后, 客户端如果不更新版本, 则服务端返回的功能可能不能使用, 所以在服务端功能升级后, 客户端也要相应的使用 ...
随机推荐
- js split分割字符串成数组
str = "2,2,3,5,6"; //这是一字符串 var strs = new Array(); //定义一数组 strs = str.split("," ...
- Android 走向MD的配色风格
这是一些google官方推出的推荐色值 下面补充上对应的xml文件,省得大家再去自己写 <?xml version="1.0" encoding="utf-8&qu ...
- hdu 3336 Count the string(next数组)
题意:统计前缀在串中出现的次数 思路:next数组,递推 #include<iostream> #include<stdio.h> #include<string.h&g ...
- 全排列 STL
#include<iostream> #include<algorithm> #include<stdio.h> using namespace std; int ...
- JS复制文本到剪切板
1.首先引入js文件, <script src="dist/clipboard.min.js"></script> 2.初始化 <script typ ...
- 图片加水印文字,logo。生成缩略图
简单JSP代码 图片加水银文字 try { String path = request.getRealPath("images\\01.jpg"); out.print(path) ...
- eclipse整合tomcat
首先确保jdk已经安装好 步骤1 获得服务器运行环境配置,Window/Preferences/Server/Runtime Environmen l步骤2 添加服务器 步骤3 选择服务器在硬盘的地址 ...
- AndroidStudio中添加依赖的三种方式以及如何引入so文件和arr文件
AndroidStudio中添加依赖的三个选项,如图: 分别为:库依赖(Library dependency).文件依赖(File dependency)和module依赖(Module dep ...
- hdoj5818【模拟】
2016 Multi-University Training Contest 7 1010 思路: 我相信T的绝对是直接根据题目意思来了. 正确的一点小转变,比较一下那个队列小,然后把小的给大的,每次 ...
- SQL语句合集
UNION (合并) UNION 操作符用于合并两个或多个 SELECT 语句的结果集. 请注意,UNION 内部的 SELECT 语句必须拥有相同数量的列.列也必须拥有相似的数据类型.同时,每条 S ...