[PYTHON] Essayez d'utiliser des modèles de conception (édition exportateur)

Aperçu

Ce contenu est destiné aux débutants qui souhaitent essayer d'utiliser des modèles de conception avec Maya Python. Je laisserai l'explication détaillée du modèle de conception à d'autres sites, Comment le code s'améliore-t-il lorsque vous l'utilisez réellement? Se concentrer sur. Comme exemple d'application, prenez quelque chose comme un exportateur de données comme exemple.

motivation

Je souhaite améliorer ma capacité de conception et la qualité de mon code en utilisant réellement des modèles de conception. Je veux trouver un modèle qui puisse être utilisé en particulier dans la mise en œuvre d'outils.

Design pattern

Le modèle suivant est utilisé cette fois. Pour plus de détails sur le modèle, veuillez consulter le site de référence en bas de page.

modèle Aperçu (ma perception) mérite
TemplateMethod Abstenez la méthode appelée par la classe parent et laissez l'implémentation à l'intérieur de la méthode à la sous-classe. Flux de processusDe chaque processus en liantComportementEst laissé à la sous-classe.
FactoryMethod Lors de l'utilisation d'un autre objet dans la classe, abstraire le processus de génération et utiliser l'objet de génération (abstrait). Le processus de génération et la mise en œuvre de la méthode sont laissés à chaque sous-classe. Il hérite de la bonté de la méthode de modèle. Lors de la création d'un autre objet et de l'appel d'une méthodeFlux de processusproduireComportementPeut être séparé.
Factory Préparez et utilisez une classe qui crée uniquement des objets selon les conditions spécifiées. Du côté qui utilise l'objet, l'objet selon les conditionsproduirePeut être séparé.

** Essayez de l'utiliser pour le script d'exportateur **

J'ai choisi le processus d'exportation des informations de scène Maya car je pensais que c'était un processus relativement important. L'image est comme la sortie des données appropriées à l'aide de l'exportation FBX. Il est reconnu que les spécifications sont susceptibles d'être modifiées ultérieurement, comme la sélection des données de sortie ou l'exécution d'un traitement spécial en fonction des conditions. Il décrit à quoi ressemblera le code avant et après l'application du modèle de conception.

Code de base

Si vous organisez les processus sans penser à rien en particulier, cela ressemblera à ce qui suit.

scene_exporter.py


def scene_export(option):
    """Modèles de sortie et animations dans la scène"""
    #Pré-traitement

    if option.mode == ExportMode.head:
        #Rechercher les données de maillage de tête dans la hiérarchie
        #Faire quelque chose
        #Exportation
    if option.mode == ExportMode.body:
        #Rechercher les données de maillage corporel dans la hiérarchie
        #Faire quelque chose
        #Exportation
    if option.mode == ExportMode.animation:
        #Rechercher des données de squelette dans la hiérarchie
        #Faire quelque chose
        #Exportation

    #Post-traitement

Adaptation de la méthode du modèle

Pour le moment, appliquez le modèle de méthode modèle pour standardiser le processus d'exportation.

exporter.py


from abc import ABCMeta, abstractmethod


class BaseExporter(object):
    """Classe de base de l'exportateur"""
    __metaclass__ = ABCMeta

    def export(self):
        select_export_targets()
        export_selection()

    @abstractmethod
    def select_export_targets(self):
        """Sélectionnez la cible d'exportation"""
        pass

    @abstractmethod
    def export_selection(self):
        """Exporter l'objet sélectionné"""
        pass


class HeadExporter(BaseExporter):
    """Classe d'exportateur pour HEAD"""
    def select_export_targets(self):
        cmds.select("|char|mesh|head")

    def export_selection(self):
        #Implémentation du traitement de sortie pour HEAD

class BodyExporter(BaseExporter):
    """Classe d'exportateur pour BODY"""
    def select_export_targets(self):
        cmds.select("|char|mesh|body")

    def export_selection(self):
        #Implémentation du traitement de sortie pour BODY

class AnimExporter(BaseExporter):
    """Classe d'exportateur pour ANIM"""
    def select_export_targets(self):
        cmds.select("|char|skel|root")

    def export_selection(self):
        #Implémentation du traitement de sortie pour ANIM

scene_exporter_v2.py


def scene_export(option):
    """Modèles de sortie et animations dans la scène"""
    #Pré-traitement

    if option.mode == ExportMode.head:
        HeadExporter().export()
    if option.mode == ExportMode.body:
        BodyExporter().export()
    if option.mode == ExportMode.animation:
        AnimExporter().export()

    #Post-traitement

Appliquer davantage le modèle Factory

Même si TemplateMethod est appliqué, la maintenabilité lors de l'ajout d'un mode n'a pas encore été améliorée. Créez une nouvelle classe Factory et laissez-la créer des branches et générer. Le processus principal utilise simplement la sous-classe BaseExporter où export () existe.

exporter_factory.py


class BaseExporterFactory(object):
    """Classe d'usine de la classe BaseExporter"""
    def create(option):
        if option.mode == ExportMode.head:
            return HeadExporter()
        if option.mode == ExportMode.body:
            return BodyExporter()
        if option.mode == ExportMode.animation:
            return AnimExporter()

scene_exporter_v3.py


def scene_export(option):
    """Modèles de sortie et animations dans la scène"""
    #Pré-traitement

    BaseExporterFactory().create(option).export()

    #Post-traitement

Appliquer davantage le modèle de méthode d'usine

Lorsque la spécification est ajoutée, nous "créerons et utiliserons un objet journal dans la classe BaseExporter". Appliquez FactoryMethod car vous allez créer et utiliser des objets dans la classe BaseExporter.

Implémentez le parent et les sous-classes d'ExporterLog, qui est le produit de FactoryMethod.

exporter_log.py


from abc import ABCMeta, abstractmethod


class BaseExporterLog(object):
    """Classe de base du journal de l'exportateur"""
    __metaclass__ = ABCMeta

    @abstractmethod
    def open(self):
        """Commencer la journalisation"""
        pass

    @abstractmethod
    def close(self):
        """Terminer la journalisation"""
        pass


class MyExporterLog(BaseExporterLog):
    """Sous-classe du journal des exportateurs"""
    def open(self):
        print "export logging start"

    def close(self):
        print "export logging close"

Définissez la génération et l'utilisation du journal dans BaseExporter, le créateur de FactoryMethod, et laissez l'implémentation aux sous-classes.

exporter.py


from abc import ABCMeta, abstractmethod


class BaseExporter(object):
    """Classe de base de l'exportateur"""
    __metaclass__ = ABCMeta

    def export(self):
        self.log = create_exporter_log()
        self.log.open()

        select_export_targets()
        export_selection()

        self.log.close()

    @abstractmethod
    def create_exporter_log(self):
        """Générer un journal d'exportation"""
        pass

    @abstractmethod
    def select_export_targets(self):
        """Sélectionnez la cible d'exportation"""
        pass

    @abstractmethod
    def export_selection(self):
        """Exporter l'objet sélectionné"""
        pass


class HeadExporter(BaseExporter):
    """Classe d'exportateur pour HEAD"""
    def create_exporter_log(self):
        return MyExporterLog()

    def select_export_targets(self):
        cmds.select("|char|mesh|head")

    def export_selection(self):
        #Implémentation du traitement de sortie pour HEAD

Après cela, je pense que cela peut ou non être comme utiliser des journaux du côté du traitement principal.

scene_exporter_v4.py


def scene_export(option):
    """Modèles de sortie et animations dans la scène"""
    #Pré-traitement

    exporter = BaseExporterFactory().create(option)
    exporter.export()

    #Traiter ou non le journal

    #Post-traitement

** Impression **

Indépendamment du fait que la reconnaissance et les exemples sont appropriés, regarder le code après l'adaptation du modèle est quelque peu convaincant. Si c'est juste la quantité de code, le code de base est le plus petit, mais étant donné qu'il sera changé plus tard, j'ai utilisé un modèle Il est efficace de consacrer du temps à la refactorisation.

Avec le modèle utilisé cette fois, j'ai du mal à comprendre le modèle de la méthode d'usine. Cela ressemble à une dérivation du modèle Factory à partir du nom, mais j'ai reconnu qu'il s'agissait d'une dérivation de la méthode du modèle. Parce que je le pensais, le flux d'adaptation des modèles a également amené la méthode des modèles en premier.

Je souhaite continuer à étudier en attendant des conseils et des conseils issus de domaines variés.

** Site de référence **

Recommended Posts

Essayez d'utiliser des modèles de conception (édition exportateur)
Essayez d'utiliser Tkinter
Essayez d'utiliser docker-py
Essayez d'utiliser Cookiecutter
Essayez d'utiliser PDFMiner
Essayez d'utiliser des géopandas
Essayez d'utiliser Selenium
Essayez d'utiliser scipy
Essayez d'utiliser pandas.DataFrame
Essayez d'utiliser django-swiftbrowser
Essayez d'utiliser matplotlib
Essayez d'utiliser tf.metrics
Essayez d'utiliser PyODE
Essayez d'utiliser virtualenv (virtualenvwrapper)
[Azure] Essayez d'utiliser Azure Functions
Essayez d'utiliser virtualenv maintenant
Essayez d'utiliser W & B
Essayez d'utiliser Django templates.html
[Kaggle] Essayez d'utiliser LGBM
Essayez d'utiliser l'analyseur de flux de Python.
Essayez d'utiliser Tkinter de Python
Essayez d'utiliser Tweepy [Python2.7]
Essayez d'utiliser collate_fn de Pytorch
Dezapata_0 Pourquoi apprendre les modèles de conception?
Essayez d'utiliser PythonTex avec Texpad.
[Python] Essayez d'utiliser le canevas de Tkinter
Essayez d'utiliser l'image Docker de Jupyter
Essayez d'utiliser scikit-learn (1) - Clustering K par méthode moyenne
Essayez l'optimisation des fonctions à l'aide d'Hyperopt
Essayez d'utiliser matplotlib avec PyCharm
Essayez d'utiliser Azure Logic Apps
Essayez d'utiliser Kubernetes Client -Python-
[Kaggle] Essayez d'utiliser xg boost
Essayez d'utiliser l'API Twitter
Essayez d'utiliser OpenCV sur Windows
Essayez d'utiliser Jupyter Notebook de manière dynamique
Essayez d'utiliser AWS SageMaker Studio
Essayez de tweeter automatiquement en utilisant Selenium.
Essayez d'utiliser SQLAlchemy + MySQL (partie 1)
Essayez d'utiliser l'API Twitter
Modèles de conception en Python: introduction
Essayez d'utiliser SQLAlchemy + MySQL (partie 2)
Essayez d'utiliser la fonction de modèle de Django
Essayez d'utiliser l'API PeeringDB 2.0
Essayez d'utiliser la fonction de brouillon de Pelican
Essayez d'utiliser pytest-Overview and Samples-
Essayez d'utiliser le folium avec anaconda