Mit der Strategie, Design, Muster mit Python

stimmen
1

Ich arbeite an einem Ort, der mehrere Projekte hat. Je nach Projekt, mag ich Elemente in einer Liste in einer bestimmten Art und Weise verarbeitet. Ich dachte, das Problem selbst zu den Strategiemuster verleihen würde. Bevor jedoch voll auf dieses Muster zu begehen, habe ich eine kleine App Demo, wie ich die letzte App denken funktionieren würde.

Zuerst habe ich eine Strategie Klasse:

import types
import rules.work_on_x

class WorkOnProjectsStrategy:

    def __init__(self, project=default):
        self.project = project
        self.msg = {0} is the project..format(self.project)

        if project == x:
            self.do_that = types.MethodType(rules.work_on_x.do_that, self)
            self.do_this = types.MethodType(rules.work_on_x.do_this, self)

    def do_that(self):
        print(Do that!)

    def do_this(self):
        print(Do this!)

Wie Sie sehen, ich habe ein paar Methoden, die ich, die Ursache der do_that definiert und do_this Methoden mit einem Projekt in einer bestimmten Weise verhalten x.

def do_that(self, thing):
    print(self.msg)
    print(Doing that on {0}.format(thing))

def do_this(self, some_thing):
    print(self.msg)
    print(Doing this on {0}.format(some_thing))

Ich habe dann den Client (eine einfache GUI), die die Strategie Klasse nutzen würde.

import os
import sys

from work_on_projects_strategy import WorkOnProjectsStrategy

from PySide2 import QtCore
from PySide2 import QtUiTools
from PySide2 import QtWidgets

class Client(QtWidgets.QWidget):

    def __init__(self, ui_file, parent=None):
        super().__init__(parent)

        # Load the ui file
        ui_file = QtCore.QFile(ui_file)
        ui_file.open(QtCore.QFile.ReadOnly)
        loader = QtUiTools.QUiLoader()
        self.my_widget = loader.load(ui_file)
        ui_file.close()
        self.my_widget.show()

        # Set up connections
        self.line_edit_input_asset = \
            self.my_widget.findChild(QtCore.QObject, lineEdit_inputasset)
        self.push_button_execute = \
            self.my_widget.findChild(QtCore.QObject, pushButton_execute)
        self.push_button_execute.clicked.connect(self.doing_stuff)

    def doing_stuff(self):
        proj = self.line_edit_input_asset.displayText()
        things = [thing_1, thing_2]
        for thing in things:
            strategy = WorkOnProjectsStrategy(proj)
            if thing == thing_1:
                strategy.do_that(thing)
            elif thing == thing_2:
                strategy.do_this(thing)

def main():
    app = QtWidgets.QApplication()
    client_ui = os.path.join(ui, demo_client.ui)
    client_tool = Client(client_ui)
    sys.exit(app.exec_())

if __name__ == __main__:
    main()

Könnte das Design verbessert werden? Ich bemerkte, dass ein Problem, das ich mit einer großen enden könnte, wenn / else-Anweisung in der Strategie-Klasse. Dies könnte leicht zu verstehen, aber ich bin nicht sicher, ob es besonders elegant ist. Der Code funktioniert. Hier ist die Ausgabe nach dem „x“ in der GUI setzen:

(MY_ENV) > python .\client.py
x is the project.
Doing that on thing_1
x is the project.
Doing this on thing_2

Ich bin überrascht, dass das funktioniert.

if project == x:
    self.do_that = types.MethodType(rules.work_on_x.do_that, self)
    self.do_this = types.MethodType(rules.work_on_x.do_this, self)

Ich dachte, Sie könnten nur dynamisch eine Methode, um eine Instanz einer Klasse zugeordnet werden.

Veröffentlicht am 08/11/2018 um 00:04
quelle vom benutzer
In anderen Sprachen...                            

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more