这种写法的劣势在哪,是不是个人习惯

<?php
interface Log {
    public function write();
}

Class FileLog implements Log{
    public function write() {
        echo "文件记录日志";
    }
}

Class DatabaseLog implements Log{
    public function write() {
        echo "数据库记录日志";
    }
}

Class User {
    public function login(Log $log) {
        echo "登录成功";
        $log->write();
    }
}

$user = new User();
$user->login(new DatabaseLog());
你的代码应该是写给下一个开发者的情书。
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 17

控制反转,内部服务由外部提供,降低耦合

3年前 评论
巴啦啦

挺好啊,没啥劣势吧

3年前 评论

哪天admin login的时候需要用到 FileLog 并且user login要保持DatabaseLog

3年前 评论
LW_aravel 3年前

补充一下,是跟这种写法比较,他俩是不是一样的 :sweat_smile:

class User 
{
    protected $log;

    public function __construct(Log $log)
    {
        $this->log = $log;   
    }

    public function login()
    {
       public function login(Log $log) {
          echo "登录成功";
            $this->log->write();
       }   
    }
}

$user = new User(new DatabaseLog());
$user->login();
3年前 评论
九霄道长

基于接口,而非实现编程

3年前 评论

劣势就是要写的代码更多了...

3年前 评论

码农的人习惯问题,对服务器来说没什么特别的,都是0/1在跑。 :joy:

3年前 评论

接口编程的坏处

  1. IDE代码跳转不方便, 需要去看依赖找实现类
  2. 容易过度设计,让本来清晰的逻辑复杂化
3年前 评论

从长远的角度考虑,后期比较没有bug

3年前 评论
九霄道长

@cvoid 复杂的项目基于接口反而更清晰,更灵活吧

3年前 评论

之后如果想用另一种方式记录日志,可以很方便地切换。

3年前 评论
KayuHo

我觉得是一样,注入的时机不同而已

3年前 评论

方便切换实现方式吧

3年前 评论

基于接口的开发 这种比较适合于 后期会换不同实现方式或者直接替换的 需求,主流程不变 而需要改变的仅仅是具体的实现方式而已! 优势就是 替换具体的实现类 简单方便 ,缺点就是代码量上去了 容易过度设计!

3年前 评论

@Nines 我自己认为抽象的优势在于无限横向扩展,相同情况不同实现。 但是我自己在写业务的时候发现需求逻辑多变情况一直在变化,抽象反而在肘制自己。

在某些功能需求十分明确的情况下代码会比直接实现清晰很多 类似支付登录分享之类。

这是我目前的理解,抽象不是万金油,只是有适用场景。

3年前 评论
九霄道长

@cvoid 确实更依赖与现实需求,经常变动的业务层不适合,那些 支付,oss,短信之类的可以

3年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!