【发布时间】: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 );
如果在控制器中使用了未在其中一个存储库中声明的函数,无论如何它都会抛出错误,为什么对这种类型的任务使用接口更好?我有什么好处?
- 是否与错误有关?如果您忘记实现一个您知道必须存在的功能,无论是否使用它都会出错,这就是接口的好处吗?
- 是不是因为您可能需要 2 个存储库来存储 2 个数据源,所以如果您的控制器调用未实现的功能而不是立即提醒您注意这一事实,您的应用程序会在不知道的情况下停止工作您的存储库没有实现您在界面中告诉它的方法?再说一遍,都是关于错误的吗?
【问题讨论】:
-
并不是完全取决于合同,而不是实施。消费者可能只依赖于一个方法接口定义的存在,它可能由多个不同的类实现。
-
合同?你能澄清一下吗?...(在你的编辑之后,我不确定我理解你的意思)。