第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条笔记的更多相关文章

  1. effective OC2.0 52阅读笔记(三 接口与API设计)

    第三章:接口与API设计 15 用前缀避免命名空间冲突 总结:避免重名符号错误的唯一办法是变相实现命名空间.为所有符号都加上命名前缀.类和分类都应加三字前缀.注意类实现文件中的纯C函数及全局变量,是算 ...

  2. Flask 教程 第二十三章:应用程序编程接口(API)

    本文翻译自The Flask Mega-Tutorial Part XXIII: Application Programming Interfaces (APIs) 我为此应用程序构建的所有功能都只适 ...

  3. 组件接口(API)设计指南-文件夹

    组件接口(API)设计指南-文件夹 组件接口(API)设计指南[1]-要考虑的问题 组件接口(API)设计指南[2]-类接口(class interface) 组件接口(API)设计指南[3]-托付( ...

  4. 推荐一款接口 API 设计神器!

    今天栈长给大家推荐一款接口 API 设计神器,传说中的,牛逼哄洪的 Swagger,它到底是什么?今天为大家揭开谜底! Swagger是什么? 官网:https://swagger.io/ Swagg ...

  5. 一篇文章帮你梳理清楚API设计时需要考虑的几个关键点

    本文作者是Enchant的架构师,他最近研究了Netflix.SoundCloud.谷歌.亚马逊.Spotify等公司的微服务实践,并根据自己的理解总结出了一套适用于现代Web和云技术的微服务实战经验 ...

  6. 开放接口/RESTful/Api服务的设计和安全方案

    总体思路 这个涉及到两个方面问题:一个是接口访问认证问题,主要解决谁可以使用接口(用户登录验证.来路验证)一个是数据数据传输安全,主要解决接口数据被监听(HTTPS安全传输.敏感内容加密.数字签名) ...

  7. 前后端分离&接口API设计学习报告

    接口API设计学习报告 15331023 陈康怡 什么是API? API即Application Programming Interface.API是一种通道,负责一个程序与另一个程序的沟通.而对于w ...

  8. Api接口幂等设计

    1,Api接口幂等设计,也就是要保证数据的唯一性,不允许有重复. 例如:rpc 远程调用,因为网络延迟,出现了调用了2次的情况. 表单连续点击,出现了重复提交. 接口暴露之后,会被模拟请求工具(Jem ...

  9. spring boot: 设计接口站api的版本号,支持次版本号(spring boot 2.3.2)

    一,为什么接口站的api要使用版本号? 1,当服务端接口的功能发生改进后, 客户端如果不更新版本,    则服务端返回的功能可能不能使用,    所以在服务端功能升级后,     客户端也要相应的使用 ...

随机推荐

  1. Silverlight实用窍门系列:2.Silverlight动态加载外部XML指定地址的WebService---(动态加载外部XML文件中指定的WebService地址)【附带实例源码】

    接上节所讲的,Silverlight可以加载外部的XML文件里面的内容,那么我们可不可以在外部XML里面配置一个WebService地址,并且以此加载这个地址来动态加载WebService呢?这样子就 ...

  2. .NET 的 WebSocket 开发包比较 【已翻译100%】--网址:http://www.oschina.net/translate/websocket-libraries-comparison-2

    编者按 本文出现在第三方产品评论部分中.在这一部分的文章只提供给会员,不允许工具供应商用来以任何方式和形式来促销或宣传产品.请会员报告任何垃圾信息或广告. Web项目常常需要将数据尽可能快地推送给客户 ...

  3. Redmine 数据库连接错误

    /******************************************************************** * Redmine 数据库连接错误 * 说明: * Open ...

  4. I.MX6 AW-NB177NF WIFI 驱动移植问题

    /******************************************************************************** * I.MX6 AW-NB177NF ...

  5. macbook pro 下eclipse配置svn插件

    eclipse中最常使用的SVN插件是subclipse,先到subclipse官网:http://subclipse.tigris.org下载该插件.   如上图,点击“Download and I ...

  6. 内部锁之一:锁介绍(偏向锁 & 轻量级锁 & 重量级锁 & 各自优缺点及场景)

    一.内部锁介绍 上篇文章<Synchronized之二:synchronized的实现原理>中向大家介绍了Synchronized原理及优化锁.现在我们应该知道,Synchronized是 ...

  7. 使用Ajax选取ListBox的值异步更新视图,并作为表单值提交

    一.控制器返回一个ViewBag MultiSelecList值. public ActionResult Create() { ViewBag.ReviewIndexItems = new Mult ...

  8. 记一次OutOfMemory定位过程

    背景 最近有个项目部署到了AWS,部署方案是ECS+Docker+Java Launch type CPU Units Memory FARGATE 1024 4G 运行后发现程序表现不符合预期--每 ...

  9. Spherical Harmonics Lighting

    [转自:http://www.cnblogs.com/daniagger/archive/2012/05/29/2524133.html] 1.背景知识 1.1 光照表示 之前我们都只考虑光源点和物体 ...

  10. ObjectARX学习笔记

    http://blog.csdn.net/jangdong/article/category/1642265/3 http://blog.csdn.net/u011331383/article/cat ...