实例变量与方法参数

时间:2015-10-19 07:53:41

标签: javascript oop

我有一个对象,不管是BookmarksManager。它处理保存在服务器中的书签,管理更新等。 其中一种方法称为'getNextPage(count,???)',它取出| count |的下一页来自服务器的书签。我的问题是,我应该给它一个偏移量的参数,形成我想要进入下一页的地方吗?或者偏移量应该是一个实例变量并且自己处理(在获取它之后它应该按取出项目的数量递增)?

我应该如何决定,标准应该是什么?

2 个答案:

答案 0 :(得分:1)

我会将该功能重构为另一个类,例如BookmarksPaginator。该类独自负责保存当前所在项目的信息,就像迭代器一样。这意味着该类应该是有状态的并将该数字保持在其状态。但是,您可能还需要在构造函数中询问页面上有多少项。

根据经验,当你的代码中有SomethingManager时,它表明它有太多的责任。只要有可能,课程应该只有一个责任。

答案 1 :(得分:0)

我会为此使用单独的对象。类似的东西:

class Paginator {
    private $currentPage;
    private $resultsPerPage = 20;
    private $numberOfResults = 0;
    private $object;

    public function __construct($object, $currentPage = 1) {
        $this->object = $object;
        $this->currentPage = is_numeric($currentPage) ? $currentPage : 1;

        $this->getNumberOfResults();
    }

    private function getNumberOfResults() {
        $this->numberOfResults = $this->object->count();
    }

    public function getPaginated()
    {
        $startFrom = $this->currentPage * $this->resultsPerPage - $this->resultsPerPage;
        return $this->object->getPaginated($startFrom, $this->resultsPerPage);
    }

    public function getNumberOfPages() {
        return floor($this->numberOfResults / $this->resultsPerPage);
    }

    public function getCurrentPage() {
        return $this->currentPage;
    }

    public function getNextPage() {
        return $this->currentPage < $this->getNumberOfPages() ? $this->currentPage + 1 : $this->currentPage;
    }
}

class BookmarksManager implements ManagerInterface {
    public function count() {
        // query here to get the number of bookmarks
    }

    public function getPaginated($startFrom, $numberOfResults) {
        // query here to get your bookmarks paginated by using
        // LIMIT $startFrom, $numberOfResults
    }
}

interface ManagerInterface {
    public function count();
    public function getPaginated($startFrom, $numberOfResults);
}

现在您可以使用它:

$bookmarkManager = new BookmarkManager();
$paginator = new Paginator($bookmarkManager, $_GET['page']);

$myBookmarks = $paginator->getPaginated();
$numberOfPages = $paginator->getNumberOfPages();
$currentPage = $paginator->getCurrentPage();
$nextPage = $paginator->getNextPage();

请注意,这些课程只是一个示例..您可以修改它们以满足您的需求