Iterátor programtervezési minta

From Wikipedia, the free encyclopedia

Az objektumorientált programozásban az iterátor olyan tervezési minta, melyet arra használunk, hogy bejárjunk egy containert és elérjük annak elemeit. Az Iterátor minta szétválogatja a container algoritmusait; egyes esetekben viszont ezek az algoritmusok container-specifikusak és így nem nem lehet őket függetleníteni.

Például, egy képzeletbeli SearchForElement algoritmust általában végrehajthatunk egy meghatározott típusú iterátorral, ahelyett, hogy container-specifikus algoritmusként implementálnánk. ezáltal a SearchForElement bármely container által használható, mely támogatja a kívánt típusú iterátort.

Definíció

Az Iterátor Aggregator minta lényege, hogy segítségével szekvenciálisan érhetjük el egy aggregált objektum elemeit, a mögöttes megvalósítás megismerése nélkül.

Nyelv specifikus végrehajtás Néhány nyelv standardizálja a szintaxist. A C++ és a Python figyelemre méltó példa lehet.

C++

A C++ a pointerek szemantikájával valósítja meg az Iterátorokat. A C++-ban egy osztály megtölthetünk pointer műveletekkel, ezáltal az Iterátort implementálhatjuk többé-kevésbé pointer mintára, mely rendelkezik, feloldással, növeléssel és csökkentéssel. Ennek előnye, hogy a C++ algoritmusokat, mint például a std::sort azonnal alkalmazhatóak korábbi memória pufferekre és hogy ehhez nem kell új szintaxist megtanulni. Ugyanakkor szükség van egy vég-Iterátorra az egyenlőség teszteléséhez, ahelyett hogy az Iterátor felismerné, hogy elért a művelet végére. Úgy mondjuk, hogy a C++ nyelvben az Iterátor modellezi az Iterátor koncepcióját.

Java

A Java-ban van Iterátor interfész. A Java 5 óta az olyan objektumok, melyek implementálják az Iterable interfészt, mely egyetlen metódus segítségével visszaad egy Iterátort, bejárhatók egy továbbfejlesztett for loop szintaxis segítségével.[1] A Java collection frameworkben található Collection interfész kiterjed az Iterátorra is.

Python

A Python a nyelv részeként előre meghatározza az Iterátorok szintaxisát, így a nyelv kulcsszavai, mint például a for, működhetnek a Python által használt szekvenciákkal. A szekvenciának van egy __iter__() metódusa, mely visszaad egy Iterátor objektumot. Az "Iterátor protokoll"-hoz tartozik a next(), mely a következő elemet adja vissza, vagy egy stopIteration kivétel, amikor elért a szekvencia végére. Az Iterátorok rendelkeznek továbbá egy __iter__() metódussal, melynek segítségével önmagukat adják vissza, hogy újra iterálhatóak legyenek, például a for loop használatával. A generátorok a 2.2. óta elérhetőek.

A Python 3-ban a next()-et átnevezték __next__()-re.[2]

PHP

A PHP az Iterátor Interfészen keresztül alkalmazza iterátor mintát, ami a standard csomag része.[3] Azok az objektumok, melyek implementálják ezt az interfészt bejárhatók a foreach nyelvi konstrukcióval.

Példa mintákra a PHP-ben

interface IIterator {
    /*
     * @param: void
     * @return:Boolean
     */
    public function hasNext();
 
    /*
     * @param: void
     * @return: String
     */
    public function next();
}
 
interface IContainer {
    /*
     * @param: void
     * @return: IInterator
     */
    public function createIterator();
}
 
class BooksCollection implements IContainer {
    private $a_titles = array();
 
    /*
     * @param: void
     * @return: IIterator
     */
    public function createIterator()
    {
        return new BookIterator($this);
    }
 
    /*
     * @param: string
     * @return: void
     */
    public function setTitle($string)
    {
        $this->a_titles[] = $string;
    }
 
    /*
     * @param: void
     * @return: Array
     */
    public function getTitles(){
        return $this->a_titles;
    }
}
 
class BookIterator implements IIterator {
    private $i_position = 0;
    private $booksCollection;
 
    function __construct(BooksCollection $booksCollection)
    {
        $this->booksCollection = $booksCollection;
    }
 
    /*
     * @param: void
     * @return: Boolean
     */
    public function hasNext()
    {
        if ($this->i_position < count($this->booksCollection->getTitles())) {
            return true;
        }
        return false;
    }
 
    /*
     * @param: void
     * @return: String
     */
    public function next()
    {
        $m_titles = $this->booksCollection->getTitles();
 
        if ($this->hasNext()) {
            return $m_titles[$this->i_position++];
        } else {
            return null;
        }
    }
}
 
class Tester {
    static function Main() {
        $booksCollection = new BooksCollection();
 
        $booksCollection->setTitle("Design Patterns");
        $booksCollection->setTitle("1");
        $booksCollection->setTitle("2");
        $booksCollection->setTitle("3");
 
        $iterator = $booksCollection->createIterator();
        while ($iterator->hasNext()) {
            echo $iterator->next() . '<br />';
        }
    }
}
 
Tester::Main();

Kapcsolódó szócikkek

Jegyzetek

További idegen nyelvű irodalom

Fordítás

Loading related searches...

Wikiwand - on

Seamless Wikipedia browsing. On steroids.