abstract 和interface

初学者经常会把 abstract 和 interface 的作用混淆,这里有一篇 abstract 和 interface 的文章,Java版的,十分通俗易懂,不懂java的也很容易看懂
https://mp.weixin.qq.com/s?__biz=MzAxMzQ3NzQ3Nw==&mid=2654251476&idx=4&sn=e66ec48c1d1aa84a50e6a0a6959aa4df&chksm=8061fadeb71673c89fd9ca27f8957766c9286ca3f82c2425edea9d52206847fee0e5bfd35cf4&mpshare=1&scene=1&srcid=0507QOAxDz4FDVwuNkiE7XLG#rd

一句话总结就是:abstract起到模板的作用,可以有属性和方法,interface起到规范方法行为的作用,只能有抽象方法存在,两者都不可以实例化,abstract单继承(视乎语言),interface可以多实现。

下面我说一下interface在我项目中的实现。

我把有列表显示和详情显示的信息抽象成实体(entity),实体列表和实体详情。以用户信息为例(json格式):


2018-05-19_111139.png

ps:这里推荐一个 chrome 插件:JSON-handler,十分好用
项目的其他实体类型还有评论,帖子等等。每一个信息对象,都是一个实体。在项目的 cache 层获取实体列表信息或者详细信息,方法都是类似的,可以把这个概念抽象出一层变成一个 interface(如果实体类型比较多,可以用 trait 封装成复用的方法,最近是个小项目,所以就用 interface 了)。

    /**
     * EntityCache实体接口
     */
    Interface EntityCache {
        /**
         * [entityDetail 根据主键获取实体详情缓存]
         * @param  [type] $id [description]
         * @return [type]     [description]
         */
        public function entityDetail($id);

        /**
         * [entityList 根据主键批量获取实体缓存信息]
         * @param  [Array]  $ids [description]
         * @return [type]      [description]
         */
        public function entityList(Array $ids);

        /**
         * [cacheEntityList 单个或者批量缓存实体信息]
         * @param  [Array] $data [二维实体数组]
         * @return [type]       [description]
         */
        public function cacheEntityList(Array &$data);
    }

这3个抽象方法规定了那些实现了 EntityCache Interface 的类的行为,可以使得团队代码更加规范。

其实在 model 层也可以做这么一个 interface

    /**
     * EntityModule实体接口
     */
    Interface EntityModule {
        /**
         * [entityDetail 根据主键获取实体详情]
         * @return [type] [description]
         */
        public function entityDetail($id);

        /**
         * [entityList 根据主键获取实体列表]
         * @return [type] [description]
         */
        public function entityList(Array $ids);

    }

具体规范视乎团队和业务逻辑而定。
总结:相当一部分phper的编码风格都是非常粗放狂野的,同一个项目中的代码逻辑可能都有几处不同。在养成坏习惯之前意识到规范统一的重要性还是很有必要的,不然以后项目重构的时候真的就火葬场了。

推荐阅读更多精彩内容

  • 一、Abstract 1,abstract class 抽象类 abstract修饰类,会使该类成为一个抽象类,这...
    徘徊0_阅读 74评论 0 1
  • 区别: (1)abstract类,是单继承,用的是关键字 extends;interface接口,可以多实现,用的...
    Jacksimo阅读 1,343评论 0 3
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 76,179评论 13 117
  • pdf下载地址:Java面试宝典 第一章内容介绍 20 第二章JavaSE基础 21 一、Java面向对象 21 ...
    王震阳阅读 79,144评论 25 513
  • 小时候 就对你充满向往 那里主席的灵柩 永远散发着光芒 真去了 看到了万人的敬仰 还有数不清的威武雄壮 我感到自己...
    莫邪干剑阅读 14评论 0 0