作为输入,我有一个书籍列表。作为输出,我期望一个 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 构造函数中使用验证器吗?
你会改变代码的设计吗?如果是怎么办?