Bir nesneyi bir yineleyici uygulamak ya da bir yineleyici uygulayan başka bir nesne içermelidir

6 Cevap php

Ben SPL Yineleyicilerin etrafında başımı almak için çalışıyorum ve bunu işlemek için 2 yollar ile geldim. Ben ilk sürümü daha az karmaşık olması için görmek ama ikinci versiyonu kompozisyon (Bence) hissediyorum vardır.

Ne göremiyorum diğer üzerinden tercih edilir hangisi? Yoksa bu komplike üzerinde sadece ben?

İşte benim düşünceler şunlardır:

Nesne bir yineleyici uygular:

class BoxOfChocolates implements Iterator {

  private $id
  private $name; // e.g. Valentine's Heart Box
  private $maker; // e.g. Hersheys
  private $items; // array

  public function getChocolates() {
    $query = ...
    foreach($rows as $row) {
      $this->_items[] = new Chocolate() ...
    }
  }

  // ... necessary iterator implementation stuff


}

Nesnesi, bir yineleme-mümkün nesne içerir:

class BoxOfChocolates {

  private $id;
  private $name;
  private $maker;
  private $items; // chocolates object

  public function getChocolates() {
    $this->items = new Chocolates();
    $this->items->getChocolates();
  }

}


class Chocolates implements Iterator {

  private $items;

  public function getChocolates() {
    $query = ...
    foreach($rows as $row) {
      $this->_items[] = new Chocolate() ...
    }
  }

  // ... necessary iterator implementation stuff

}

6 Cevap

bbxbby, en iyi çözüm genellikle en basit olanıdır. Kesinlikle ayrı yineleyici nesnesi oluştururken şeyler overcomplicating değildir. Aslında, PHP destekler ve IteratorAggregate arayüzü sağlayarak bu tür toplama teşvik. IteratorAggregate getIterator() yöntemi, dönen içermelidir uygulanması Nesne Iterator. Bu getChocolated() yöntemi ne gerçekten. Hakkında güzel bir şey IteratorAggregate Eğer foreach döngü doğrudan bir nesne geçmek olabilir. Bunu kullanırken sizin kod bu gibi gibi görünebilir:

class BoxOfChocolates implements IteratorAggregate

    private $chocolates = array();

    public function getIterator() {
        return new ArrayIterator(new ArrayObject($this->chocolates)));
    }

}

Daha sonra, bir yerde kodu:

$box = new BoxOfChocolates();
foreach ($box as $chocolate) { ... }

Bu duruma bağlıdır. T0'da gidiyor çikolata kutusu birden koleksiyonları içeren mı? Öyleyse koleksiyonları üyeleri olması gerekir.

Şöyle düşünün. Bir toplama (yani PersonList) veya bir koleksiyonu var bir şey (yani bir araba bunun bir koleksiyon sahibi olabilirler son sahipleri var) bir kutu çikolata var.

Ben bu ilk grubu altında düşüyor düşünüyorum

:)

Ben çikolata mecaz gerçek sınıf için oldukça doğru olduğunu varsayarak, çok ilk grubu öneririm.

bir kutu çikolata gerçekten çikolata koleksiyonu, ve gibi bu kutunun içindeki çikolatalar üzerinde yineleme istediğiniz mantıklı. Ayrı bir çikolata listesini ekleyerek gerçekten herhangi bir değer katmak ve sadece gereksiz bir katman eklemek için gözükmemektedir.

Eh, ben PHP bilmiyorum, bu yüzden düzgün cevap veremem, ama ben biliyorum bir alan için ilgili çalışacağım.

IEnumerable ve IEnumerator: C #, iki arayüzleri bulunmaktadır. Sizin örnekte, BoxOfChocolates Enumerable olurdu, Çikolata bir Listeleyicisi olacaktır.

Enumerable sadece bir Numaralandırıcı döndüren bir yöntem var. Sayim güncel bir öğenin bir kavram ve bir sonraki öğeye hareketli bir anlamı var. Çoğu durumda, Listeleyicisi sınıf "görülmektedir" değildir. Örneğin, çizgi "foreach (boxOfChoclates Çikolata madde)" in boxOfChocolates bir Enumerable olduğunu; Enumerator nesne tamamen foreach tarafından gizlenmiştir.

Oldukça sade kap yineleyici uygulamak için yerdir.

Ben size Yineleyicilerin ayrı koleksiyonları tutmak gerektiğini düşünüyorum. Ben koleksiyon sık sık yineleyicileri olması @ James Curran ile kabul edeceğini - Aslında, onlar çeşitli olabilir. Örneğin, (tipik durum sıralamayı tersine çeviren bir tane istiyorum olsa) fındık ile şeker atlar bir yineleyici isteyebilirsiniz. Bu durumda, bir sonraki () yöntemi değişikliklerin anlamı ise. Bu işlemek için, kendi yineleme semantik içeren ayrı sınıflar Yineleyicilerde uygulamak. Uygun tür yineleyicileri elde toplama yöntemleri sağlayın. Bu gerçekten endişeleri ayrılığı bir sorun bulunuyor. Koleksiyon üzerinde kullanıcı dolaşır, o yineleyici kaygısı nasıl umursamıyor.