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