🐈 【Python】デザインパターン学習 - Iteratorパターン -
作成日: 2021/10/16
0

Iteratorパターンについて学ぶ

参考サイト1の動画で紹介されているTypeScriptのコードを自分なりにpythonに書き直して学習する。

Iteratorパターンとは

繰り返し処理を自前で実装するときの実装の仕方。

pythonでの書き方

from abc import ABCMeta, abstractmethod

class MyIterator(metaclass=ABCMeta):
    @abstractmethod
    def hasNext(self) -> bool:
        pass

    @abstractmethod
    def next(self):
        pass

class Aggregate(metaclass=ABCMeta):
    @abstractmethod
    def getIterator(self) -> MyIterator:
        pass

class Book():
    
    def __init__(self,name:str):
        self.name = name
    
    def getName(self):
        return self.name

class BookShelf(Aggregate):

    def __init__(self):
        self.books = []
    
    def getBookAt(self,index:int):
        return self.books[index]
    
    def addBook(self,book:Book):
        self.books.append(book)
    
    def countBooks(self):
        return len(self.books)

    def getIterator(self) -> MyIterator:
        return BookShelfIterator(self)

class BookShelfIterator(MyIterator):

    def __init__(self,bookSelf:BookShelf):
        self.bookShelf = bookSelf
        self.index = 0
    
    def hasNext(self) -> bool:
        return self.index < self.bookShelf.countBooks()

    def next(self):
        BOOK = self.bookShelf.getBookAt(self.index)
        self.index += 1

        return BOOK

BOOK_SHELF = BookShelf()
BOOK_SHELF.addBook(Book('走れメロス'))
BOOK_SHELF.addBook(Book('羅生門'))
BOOK_SHELF.addBook(Book('人間失格'))

BOOK_SHELF_ITERSTOR = BOOK_SHELF.getIterator()

while BOOK_SHELF_ITERSTOR.hasNext():
    book = BOOK_SHELF_ITERSTOR.next()

    print(book.getName())
    

実行結果

走れメロス
羅生門
人間失格

書いた感想

プログラムの作成の勉強にはなった。仕組みが素晴らしい。ただやっぱり使わないなと。
因みにIteratorパターンを使わないでこの問題を解くプログラムも作成してみた。
以下の通りです。これを見ても分かる通りやっぱりこのパターンは使わないなと。

Iteratorパターンを使わないで書いた場合

class Book():
    
    def __init__(self,name:str):
        self.name = name
    
    def getName(self):
        return self.name

class BookShelf():

    def __init__(self):
        self.books = []
    
    def addBook(self,book:Book):
        self.books.append(book)

BOOK_SHELF = BookShelf()
BOOK_SHELF.addBook(Book('走れメロス'))
BOOK_SHELF.addBook(Book('羅生門'))
BOOK_SHELF.addBook(Book('人間失格'))

for book in BOOK_SHELF.books:
    print(book.getName())

書いたコード

github

参考サイト

  1. Iteratorパターン【コードで理解する】- プログラミング相談所オンライン

フリーランスでpythonエンジニアとして働きたく勉強中。 前職は運用SEとセキュリティエンジニア。 開発は学校で学んだ経験と趣味でやっていた程度。一応前職でも業務の自動化のためにExcel VBAやセキュリティテスト用のWebサイトの開発やセキュリティテストツールの改良などで開発はやっていた。