【发布时间】:2013-10-09 16:57:58
【问题描述】:
作为输入,我有一个书籍列表。作为输出,我期望一个 SimilarBookCollection。
SimilarBookCollection 有作者、publishYear 和图书列表。如果书籍的作者不同或 publishYear 不同,则无法创建 SimilarBookCollection。
目前在 PHP 中的解决方案:
client.php
----
$arrBook = array(...); // array of books
$objValidator = new SimilarBookCollectionValidator($arrBook);
if ($objValidator->IsValid()) {
$objSimilarBookCollection = new SimilarBookCollection($arrBook);
echo $objSimilarBookCollection->GetAuthor();
}
else {
echo 'Invalid input';
}
SimilarBookCollection.php
---
class SimilarBookCollection() {
public function SimilarBookCollection(array $arrBook) {
$objValidator = new SimilarBookCollectionValidator($arrBook);
if ($objValidator->IsValid()) {
throw new Exception('Invalid books to create collection');
}
$this->author = $arrBook[0]->GetAuthor();
$this->publishYear = $arrBook[0]->GetPublishYear();
$this->books = $arrBook;
}
public function GetAuthor() {
return $this->author;
}
public function GetPublishYear() {
return $this->publishYear;
}
public function GetBooks() {
return $this->books;
}
}
SimilarBookCollectionValidator.php
---
class SimilarBookCollectionValidator() {
public function IsValid() {
$this->ValidateAtLeastOneBook();
$this->ValidateSameAuthor();
$this->ValidateSameYear();
return $this->blnValid;
}
... //actual validation routines
}
我们的目标是拥有一个“特殊”收藏,其中仅包含具有相同作者和发布年份的书籍。这样做的目的是轻松访问对象中的重复信息,例如作者或年份。
您会如何命名 SimilarBookCollection?现在的名字是 通用的。使用像 SameYearAuthorBookCollection 这样的名称看起来有点 又长又奇怪(如果要添加更多条件,则名称会增加)
您会在 SimilarBookCollection 构造函数中使用验证器吗? 防御性编程风格?
你会改变代码的设计吗?如果是怎么办?
【问题讨论】:
标签: oop design-patterns