【问题标题】:Difference between a function layer and an interface功能层和接口的区别
【发布时间】:2013-09-18 00:48:14
【问题描述】:

这样做有什么区别:

class UserRepository extends DAO
{
    public function GetAllUsers()
    {
        return $this->Select();
    }

    public function GetUserById( $id )
    {
        return $this->Select( $id );    
    }
}

class MockUserRepository extends MockDAO
{
    public function GetAllUsers()
    {
        return $this->Select();
    }

    public function GetUserById( $id )
    {
        return $this->Select( $id );    
    }
}

class UserController
{
    private $userRepository;

    function __Construct( $repo )
    {
        $this->userRepository = $repo;
    }

    public function ListUsers()
    {
        $users = $this->userRepository->AnUndeclaredMethod();
        // ...
    }
}

$repo = new MockUserRepository();
$controller = new UserController( $repo );

还有这个:

interface IUserRepository
{
    public function GetAllUsers();
    public function GetUserById( $id );
}

class UserRepository extends DAO implements IUserRepository
{
    public function GetAllUsers()
    {
        return $this->Select();
    }

    public function GetUserById( $id )
    {
        return $this->Select( $id );    
    }
}

class MockUserRepository extends MockDAO implements IUserRepository
{
    public function GetAllUsers()
    {
        return $this->SelectUsers();
    }

    public function GetUserById( $id )
    {
        return $this->SelectUsers( $id );            
    }
}

class UserController
{
    private $userRepository;

    public function __Construct( IUserRepository $repo )
    {
        $this->userRepository = $repo;
    }

    public function ListUsers()
    {
        $users = $this->userRepository->AnUndeclaredMethod();
        // ...
    }
}
$repo = new MockUserRepository();
$controller = new UserController( $repo );

如果在控制器中使用了未在其中一个存储库中声明的函数,无论如何它都会抛出错误,为什么对这种类型的任务使用接口更好?我有什么好处?

  1. 是否与错误有关?如果您忘记实现一个您知道必须存在的功能,无论是否使用它都会出错,这就是接口的好处吗?
  2. 是不是因为您可能需要 2 个存储库来存储 2 个数据源,所以如果您的控制器调用未实现的功能而不是立即提醒您注意这一事实,您的应用程序会在不知道的情况下停止工作您的存储库没有实现您在界面中告诉它的方法?再说一遍,都是关于错误的吗?

【问题讨论】:

  • 并不是完全取决于合同,而不是实施。消费者可能只依赖于一个方法接口定义的存在,它可能由多个不同的类实现。
  • 合同?你能澄清一下吗?...(在你的编辑之后,我不确定我理解你的意思)。

标签: php interface


【解决方案1】:

接口强制使用该接口的任何对象,使接口内的方法可调用,也称为实现。因此,如果您有两个使用相同接口的不同类,它们都必须具有相同的方法(例如 save())。尽管每个类都必须有一个保存方法,但方法中的代码可以完全不同,重点是每个类都有一个save() 方法。

我见过与工厂一起使用的接口,这些接口可以创建各种对象。所以调用代码用各种参数调用工厂,返回一个对象,因为工厂内创建的对象遵循一个接口,我们可以安全地调用save()而不知道实际创建的是哪个对象。

【讨论】:

  • 但就它们两者之间的视觉差异而言,是否严格取决于它们所服务的错误?无论您是否创建了实现接口的类之一,您都必须声明另一个方法,即使您可能尚未实现它并在应用程序中调用它。你现在什么,我想我明白了。
  • 对,如果一个类实现了一个接口,它必须使接口中找到的任何方法定义都可以调用,否则会报错。如果您实现一个接口并且不需要编写其中一种方法,您可以定义它,但不要让它做任何事情。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-01
  • 2011-04-28
  • 1970-01-01
  • 1970-01-01
  • 2023-04-09
  • 1970-01-01
相关资源
最近更新 更多