PSR&&RESTful--如何编写优雅的代码

我们经常会在很多地方看到要求我们有代码规范,能够编写优雅的代码,然而究竟如何写代码才是合适的呢?

这里我们仅谈PHP语言的规范

PSR--PHP标准规范

以下规则必须执行!传送门psr规范

只要你是一名PHPer,你就必须要遵守以下规则,不然不就不是一名合格的PHPer!

一切为了进步

基础规范

文件开头:<?php  或 <?=

编码:UTF-8

内容:定义和输出(之类的操作)不可同时出现

命名空间:自动加载规范

类命名:大写开头的驼峰

方法命名:小写开头的驼峰

常量:全大写,单词间下划线分隔

缩进:四个空格而非Tab键

每行字符:最好<80,最多120,但不可强制

声明语句:代码块后插入一个空白行

类&方法: 开始和结束花括号({})自起一行

控制结构(如if):花括号 同一行,空格相隔

日志接口规范

日志等级:debug、 info、 notice、 warning、 error、 critical、 alert 以及 emergency 。

log方法:其第一个参数为记录的等级。可使用一个预先定义的等级常量作为参数来调用此方法,必须 与直接调用以上八个方法具有相同的效果。如果传入的等级常量参数没有预先定义,则 必须 抛出 Psr\Log\InvalidArgumentException 类型的异常。在不确定的情况下,使用者 不该 使用未支持的等级常量来调用此方法。

自动加载规范

\<命名空间>(\<子命名空间>)*\<类名>

缓存接口规范

  • 调用类库 (Calling Library) - 调用者,使用缓存服务的类库,这个类库调用缓存服务,调用的
    是此缓存接口规范的具体「实现类库」,调用者不需要知道任何「缓存服务」的具体实现。

  • 实现类库 (Implementing Library) - 此类库是对「缓存接口规范」的具体实现,封装起来的缓存服务,供「调用类库」使用。实现类库 必须 提供 PHP 类来实现
    Cache\CacheItemPoolInterface 和 Cache\CacheItemInterface 接口。
    实现类库 必须 支持最小的如下描述的 TTL 功能,秒级别的精准度。

  • 生存时间值 (TTL - Time To Live) - 定义了缓存可以存活的时间,以秒为单位的整数值。

  • 过期时间 (Expiration) - 定义准确的过期时间点,一般为缓存存储发生的时间点加上 TTL 时
    间值,也可以指定一个 DateTime 对象。

    假如一个缓存项的 TTL 设置为 300 秒,保存于 1:30:00 ,那么缓存项的过期时间为 1:35:00。

    实现类库 可以 让缓存项提前过期,但是 必须 在到达过期时间时立即把缓存项标示为
    过期。如果调用类库在保存一个缓存项的时候未设置「过期时间」、或者设置了 null 作为过期
    时间(或者 TTL 设置为 null),实现类库 可以 使用默认自行配置的一个时间。如果没
    有默认时间,实现类库 必须把存储时间当做 永久性 存储,或者按照底层驱动能支持的
    最长时间作为保持时间。

  • 键 (KEY) - 长度大于 1 的字串,用作缓存项在缓存系统里的唯一标识符。实现类库
    必须 支持「键」规则 A-Za-z0-9_, 和 . 任何顺序的 UTF-8 编码,长度
    小于 64 位。实现类库 可以 支持更多的编码或者更长的长度,不过 必须 支持至少以上指定
    的编码和长度。实现类库可自行实现对「键」的转义,但是 必须 保证能够无损的返回「键」字串。以下
    的字串作为系统保留: {}()/\@:一定不可 作为「键」的命名支持。

  • 命中 (Hit) - 一个缓存的命中,指的是当调用类库使用「键」在请求一个缓存项的时候,在缓存
    池里能找到对应的缓存项,并且此缓存项还未过期,并且此数据不会因为任何原因出现错误。调用类
    库 应该 确保先验证下 isHit() 有命中后才调用 get() 获取数据。

  • 未命中 (Miss) - 一个缓存未命中,是完全的上面描述的「命中」的相反。指的是当调用类库使用「键」在请求一个缓存项的时候,在缓存池里未能找到对应的缓存项,或者此缓存项已经过期,或者此数据因为任何原因出现错误。一个过期的缓存项,必须 被当做 未命中 来对待。

  • 延迟 (Deferred) - 一个延迟的缓存,指的是这个缓存项可能不会立刻被存储到物理缓存池里。一个
    缓存池对象 可以 对一个指定延迟的缓存项进行延迟存储,这样做的好处是可以利用一些缓存服务器提供
    的批量插入功能。缓存池 必须 能对所有延迟缓存最终能持久化,并且不会丢失。可以 在调用类库还未发起保存请求之前就做持久化。当调用类库调用 commit() 方法时,所有的延迟缓存都 必须
    做持久化。实现类库 可以 自行决定使用什么逻辑来触发数据持久化,如对象的 析构方法 (destructor)内、调用 save() 时持久化、倒计时保存或者触及最大数量时保存等。当请求一个延迟
    缓存项时,必须 返回一个延迟,未持久化的缓存项对象。

HTTP消息接口规范

每一个 HTTP 请求都有专属的格式:

POST /path HTTP/1.1
Host: example.com

foo=bar&baz=bat

按照顺序,第一行的各个字段意义为: HTTP 请求方法、请求的目标地址(通常是一个绝对路径的 URI 或 者路径),HTTP 协议。

接下来是 HTTP 头信息,空行,消息内容

HTTP 返回消息有类似的结构:

HTTP/1.1 200 OK
Content-Type: text/plain

这是返回的消息内容

按照顺序,第一行为状态行,包括 HTTP 协议版本,HTTP 状态码,描述文本。

和 HTTP 请求类似的,接下来是 HTTP 头信息,空行,消息内容

 

RESTful风格

RESTful只是一种风格,并不是规范,但是大家都公认的风格。

主要存在于API设计之中

资源

对于返回相同的数据,要做到缓存处理,防止大量请求返回大量数据,造成不必要的开销

以此来提高响应速度

接口返回的数据要有统一格式,json是现在最常用的资源表示格式

无状态

就是客户端或其他端调用API时,不依赖其他状态,即使你的API在后期发生了修改、重构,也不会影响原来端的调用逻辑

以此来提高可扩展性

统一接口

数据的元操作,即CRUD(create, read, update和delete,即数据的增删查改)操作,分别对应于HTTP方法:GET用来获取资源,POST用来新建资源(也可以用于更新资源),PUT用来更新资源,DELETE用来删除资源,这样就统一了数据操作的接口,仅通过HTTP方法,就可以完成对数据的所有增删查改工作。

对于多个端,无论PC、安卓、iOS、微服务等等,应该统一调用的一个接口,而非开发多个接口实现同一业务。

blog-post-REST-vs-RPC2

 

 

时刻学习!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值