J'ai pratiqué les modèles de conception afin de pouvoir écrire du code conscient du design. D'autres modèles de conception seront publiés fréquemment.
L'objectif principal est de comprendre quand, quoi et comment utiliser les modèles de conception. (Je suis nouveau en Java ou dans un langage à typage statique, et je n'ai pas une longue histoire de python, donc je pense qu'il y a des choses qui ne ressemblent pas à Pythonista. Si vous avez des suggestions, apprenez-moi s'il vous plaît.)
Cette fois, le motif de la façade était lié à la structure.
La façade agit comme une simple fenêtre pour les systèmes complexes. Autrement dit, simplifier la grande logique en un seul appel de fonction simple.
L'exemple de programme créé ici crée la page Web d'un utilisateur. Afin de créer un échantillon de motif de façade, "beaucoup de classes compliquées et complexes" sont à l'origine nécessaires. Cependant, afin de raccourcir l'exemple de programme, nous considérerons un système simple composé de seulement trois classes. Ce système se compose d'une base de données qui obtient un nom à partir d'une adresse e-mail, d'une classe qui crée un fichier HTML (HTMLWriter) et d'une classe qui fournit une interface de haut niveau en tant que façade (PageMaker).
database.py
from configparser import ConfigParser
import logging
class Database():
def get_properties(self, dbname):
filename = dbname + '.ini'
conf = ConfigParser()
try:
conf.read(filename)
prob = conf['TEST1']
return prob
except IOError:
logging.exception('Warning' + filename + 'is not found.')
La classe Database obtient le nom_utilisateur en spécifiant le nom de la base de données ("maildata").
maildata.ini
[TEST1]
[email protected]=Hiroshi Yuki
[email protected]=Hananko Sato
Le fichier de données que vous référencez.
html_writer.py
class HtmlWriter():
def __init__(self, writer):
self.__writer = writer
def title(self, title):
self.__writer.write('<!DOCTYPE html> \n')
self.__writer.write('<html>')
self.__writer.write('<head>')
self.__writer.write('<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> \n')
self.__writer.write('<title>' + title + '</title>')
self.__writer.write('</head>')
self.__writer.write('<body> \n')
self.__writer.write('<h1>' + title + '<h1> \n')
def paragraph(self, msg):
self.__writer.write('<p>' + msg + '</p>\n')
def link(self, href, caption):
self.paragraph('<a href=\'' + href + '\' >' + caption + '</a>')
def mailto(self, mailaddr, username):
self.link('mailto:' + mailaddr, username)
def close(self):
self.__writer.write('</body>')
self.__writer.write('</html>\n')
self.__writer.close()
La classe HtmlWriter crée une page Web simple. Donnez un rédacteur lors de la création d'une instance et envoyez le code HTML à ce rédacteur.
La méthode title génère le titre, la méthode paragraph génère le paragraphe, la méthode link génère le lien, la méthode mailto génère le lien de l'adresse e-mail et la méthode close met fin à la sortie HTML.
Cette classe masque la contrainte selon laquelle la méthode title doit être appelée en premier. Et la classe PageMaker, qui est le point de contact, est écrite pour se conformer à cette restriction.
page_maker.py
import logging
from html_writer import HtmlWriter
from database import Database
class PageMaker():
def make_welcome_page(self, mailaddr, filename):
db = Database()
try:
prob = db.get_properties('maildata')
user_name = prob[mailaddr]
writer = HtmlWriter(open(filename, mode='w'))
writer.title('Welcome to ' + user_name + 'is page!')
writer.paragraph(user_name + 'Bienvenue sur la page.')
writer.paragraph('J'attends un e-mail.')
writer.mailto(mailaddr, user_name)
writer.close()
print(filename + ' ' + 'is created for' + mailaddr + ' ' + '(' + user_name + ')')
except IOError as e:
logging.exception(e)
La classe PageMaker est une combinaison de la classe Database et de la classe HtmlWriter pour créer une page Web pour un utilisateur spécifié.
La seule méthode publique définie dans cette classe est make_welcome_page. Spécifier une adresse e-mail et un nom de fichier de sortie pour cette méthode créera une page Web.
Là où les méthodes de la classe HtmlWriter sont gâchées, cette classe PageMaker s'en charge, ** ne montrant qu'une seule méthode make_welcome_page à l'extérieur **. Ceci est une simple fenêtre.
main.py
from page_maker import PageMaker
def main():
pm = PageMaker()
pm.make_welcome_page('[email protected]', 'welcome.html')
if __name__ == '__main__':
main()
Résultat d'exécution
welcome.html is created [email protected] (Hiroshi Yuki)
Facade s'assure que si vous souhaitez travailler avec un groupe de classes, vous n'avez pas à vous soucier de la complexité de l'appel des méthodes de ce groupe de classes ou lorsque la méthode d'initialisation est compliquée. Le but est de réduire le nombre d'interfaces et de les combiner en un seul appel de fonction simple.
En conséquence, la connexion avec l'extérieur devient lâche et il devient facile à réutiliser. En d'autres termes, cela permet de masquer facilement les informations orientées objet.
Recommended Posts