我有一个对象,不管是BookmarksManager。它处理保存在服务器中的书签,管理更新等。 其中一种方法称为'getNextPage(count,???)',它取出| count |的下一页来自服务器的书签。我的问题是,我应该给它一个偏移量的参数,形成我想要进入下一页的地方吗?或者偏移量应该是一个实例变量并且自己处理(在获取它之后它应该按取出项目的数量递增)?
我应该如何决定,标准应该是什么?
答案 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();
请注意,这些课程只是一个示例..您可以修改它们以满足您的需求