Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 复合模式,为什么不好,如果;“儿童”;“了解”;家长;?_Php_Composition - Fatal编程技术网

Php 复合模式,为什么不好,如果;“儿童”;“了解”;家长;?

Php 复合模式,为什么不好,如果;“儿童”;“了解”;家长;?,php,composition,Php,Composition,代码示例:我做了一些类似的东西,除了“电子书架上的””知道$books(几本书)。我的“老板”说他们互相了解很糟糕。但是为什么呢 好吧,我编辑它: abstract class OnTheBookShelf { public $shelf; ///////////////////////////////////////////////// abstract function getBookInfo($previousBook); abstract function get

代码示例:我做了一些类似的东西,除了“
电子书架上的”
”知道$books(
几本书
)。我的“老板”说他们互相了解很糟糕。但是为什么呢

好吧,我编辑它:

abstract class OnTheBookShelf {
    public $shelf; /////////////////////////////////////////////////
    abstract function getBookInfo($previousBook);
    abstract function getBookCount();
    abstract function setBookCount($new_count);
    abstract function addBook($oneBook);
    abstract function removeBook($oneBook);
}

class OneBook extends OnTheBookShelf {
    private $title;
    private $author;
    function __construct($title, $author) {
      $this->title = $title;
      $this->author = $author;
    }
    function getBookInfo($bookToGet) {
      if (1 == $bookToGet) {
        return $this->title." by ".$this->author;
      } else {
        return FALSE;
      }
    }
    function getBookCount() {
      return 1;
    }
    function setBookCount($newCount) {
      return FALSE;
    }
    function addBook($oneBook) {
      return FALSE;
    }
    function removeBook($oneBook) {
      return FALSE;
    }
}

class SeveralBooks extends OnTheBookShelf {
    private $oneBooks = array();
    private $bookCount;
    public function __construct() {
      $this->setBookCount(0);
    }
    public function getBookCount() {
      return $this->bookCount;
    }
    public function setBookCount($newCount) {
      $this->bookCount = $newCount;
    }
    public function getBookInfo($bookToGet) {   
      if ($bookToGet <= $this->bookCount) {
        return $this->oneBooks[$bookToGet]->getBookInfo(1);
      } else {
        return FALSE;
      }
    }
    public function addBook($oneBook) {
      $oneBook->shelf = $this; //////////////////////////////////////////////////
      $this->setBookCount($this->getBookCount() + 1);
      $this->oneBooks[$this->getBookCount()] = $oneBook;
      return $this->getBookCount();
    }
    public function removeBook($oneBook) {
      $counter = 0;
      while (++$counter <= $this->getBookCount()) {
        if ($oneBook->getBookInfo(1) == 
          $this->oneBooks[$counter]->getBookInfo(1)) {
          for ($x = $counter; $x < $this->getBookCount(); $x++) {
            $this->oneBooks[$x] = $this->oneBooks[$x + 1];
          }
          $this->setBookCount($this->getBookCount() - 1);
        }
      }
      return $this->getBookCount();
    }
}
电子书架上的抽象类{ 公共货架///////////////////////////////////////////////// 抽象函数getBookInfo($previousBook); 抽象函数getBookCount(); 抽象函数setBookCount($new_count); 抽象函数addBook($oneBook); 抽象函数removeBook($oneBook); } 第一类图书扩展到电子书架上{ 私人产权; 私人作家; 函数构造($title,$author){ $this->title=$title; $this->author=$author; } 函数getBookInfo($bookToGet){ 如果(1==$bookToGet){ 返回$this->title.“..$this->author; }否则{ 返回FALSE; } } 函数getBookCount(){ 返回1; } 函数setBookCount($newCount){ 返回FALSE; } 函数addBook($oneBook){ 返回FALSE; } 函数removeBook($oneBook){ 返回FALSE; } } 类扩展到电子书架上{ private$oneBooks=array(); 私人$bookCount; 公共函数构造(){ $this->setBookCount(0); } 公共函数getBookCount(){ 返回$this->bookCount; } 公共功能setBookCount($newCount){ $this->bookCount=$newCount; } 公共函数getBookInfo($bookToGet){ 如果($bookToGet bookCount){ 返回$this->oneBooks[$bookToGet]->getBookInfo(1); }否则{ 返回FALSE; } } 公共函数addBook($oneBook){ $oneBook->shelf=$this////////////////////////////////////////////////// $this->setBookCount($this->getBookCount()+1); $this->oneBooks[$this->getBookCount()]=$oneBook; 返回$this->getBookCount(); } 公共功能removeBook($oneBook){ $counter=0; 而(++$counter getBookCount()){ 如果($oneBook->getBookInfo(1)= $this->oneBooks[$counter]->getBookInfo(1)){ 对于($x=$counter;$x<$this->getBookCount();$x++){ $this->oneBooks[$x]=$this->oneBooks[$x+1]; } $this->setBookCount($this->getBookCount()-1); } } 返回$this->getBookCount(); } }
我在有问题的行中添加了一堆。在这里,他们说这本书提到了书架。

他们应该知道自己的接口,以便可以更改它们

假设你有课程:

Bookshelf
  private books: Book[]

Book
  public title: String
然后您将访问
图书[i]。书名
并显示图书的书名

现在想象一下,负责
书籍
的程序员决定书名是merrits自己的类,因此我们有:

Book
  public title: Title

Title
  private t: String
  public toString()
现在,编写
书架
代码的程序员需要更改他们的代码

另一方面,如果我们能够:

Book
  private title: String
  public getTitleString()
然后我们可以更改
Book
类的实现,我们所要做的就是编写
getTitleString()
函数,该函数将返回标题的字符串表示形式,并且一切都将继续工作,而不会对
书架
进行任何额外的更改

我的“老板”说他们互相了解很糟糕。但是为什么呢

问题是
书架
书籍
之间的循环引用不是那么简单,需要特别小心处理

例如,如果您只需编写
$oneBook->shelf=$this
inside
addBook
方法,那么如果消费者对两个不同书架上的一本书调用此方法,会发生什么情况

$book = new Book;
$shelf1 = new Shelf;
$shelf2 = new Shelf;

$shelf1->addBook($book);
$shelf2->addBook($book);
Book
将被添加到两个书架上,但它只会引用最后一个书架,这会导致不一致和潜在的运行时错误


当然,循环引用是正确的,但它需要特别注意,并增加了代码的复杂性。

请给出一些具体的例子。在复合模式中,通常不存在任何“父/子”关系;这与类继承有关。在您的案例中,
Book是否扩展了书架
,而
Bookshelf
是由
书籍
组成的,还是。。。?