入力として、本のリストがあります。出力として、SimilarBookCollection が必要です。
SimilarBookCollection には、著者、発行年、書籍のリストがあります。書籍の著者が異なる場合、または 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 コンストラクターで Validator を使用しますか?
コードのデザインを変更しますか?はいの場合、どのように?