微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

php – 这是一个很好的工厂候选人吗?

我想创建一个投票系统,可以对多个域对象进行投票:

>日历活动
>评论
>一个用户

所以我想我会为这些项目创建一个Voteable接口:

interface Voteable
{
    public function Vote( User $user,$value );
}

我认为这个投票方法会代理存储库方法,例如:

class VotingRepository
{
    public function castVote( Voteable $item,User $user,$value )
    {
        // save the these values,along with the value
        $itemId = $item->getId();
        $userId = $user->getId();

    }
}

目前,存储库将是一个数据库.该数据库将为每种类型的投票提供链接表:

> eventVote
> commentVote
> userVote

因此,这实质上意味着每个域对象都需要另一个表来投票.这对工厂来说是个好人吗?这种情况下的VotingRepositoryFactory?换句话说,像:

class VotingRepositoryFactory
{
    createVotingRepository( $type )
    {
        switch( $type )
        {
            case 'event':
                // create a voting repository with EventVote table
                return new VotingRepository( new EventVoteTable() );
            case 'comment':
                // create a voting repository with CommentVote table
                return new VotingRepository( new CommentVoteTable() );
            case 'user':
                // create a voting repository with UserVote table
                return new VotingRepository( new UserVoteTable() );
        }
    }
}

然后,从域对象(例如在这种情况下评论)中将它们全部捆绑在一起,我看起来像这样:

class Comment implements Voteable
{
    public function construct()
    {
        $this->_repository = VotingRepositoryFactory::createVotingRepository( 'comment' );
    }

    public function Vote( User $user,$value )
    {
        $this->_repository->castVote( $this,$user,$value );
    }
}

这有意义吗?

是的,存储库和工厂都有意义.

关于工厂的一些评论

我将删除开关($type)并为每种类型的Votable对象创建方法.而不是

VotingRepositoryFactory :: createVotingRepository(‘comment’);

我更喜欢

VotingRepositoryFactory :: createCommentVotingRepository();

原因是很容易忘记在交换机上添加一个新案例,而(我不确定PHP,但是)编译语言会告诉你何时缺少一个调用方法.还记得你可以发送到工厂方法的字符串,因为$type很难,而大多数智能IDE会告诉你类/对象上有什么方法.

一个想法是添加一个可以调用的单例,如VotingRepositoryFactory :: Instance-> createCommentVotingRepository();.然后,“Instance”可以是DatabaseVotingRepositoryFactory或FakeVotingRepositoryFactory(用于单元测试)或VotingRepositoryFactory的任何其他实现.这样,如果要编写单元测试或切换到其他存储系统,就可以轻松替换VotingRepositoryFactory的实现.

只是一些想法..

原文地址:https://www.jb51.cc/php/134542.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐