Χρησιμοποιώντας τη Στρατηγική Μελέτη μοτίβο με Python

ψήφοι
1

Δουλεύω σε ένα μέρος που έχει πολλά έργα. Ανάλογα με το έργο, θέλω στοιχεία σε μια λίστα σε επεξεργασία με έναν ορισμένο τρόπο. Σκέφτηκα ότι αυτό το πρόβλημα θα προσφέρεται για το σχέδιο στρατηγικής. Ωστόσο, πριν από τη δέσμευση πλήρως σε αυτό το μοτίβο, έχω δημιουργήσει μια μικρή εφαρμογή για να demo το πώς νομίζω ότι η τελική εφαρμογή θα μπορούσε να λειτουργήσει.

Κατ 'αρχάς, έχω δημιουργήσει μια τάξη στρατηγική:

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!)

Όπως βλέπετε έχω κάποιες μεθόδους που καθορίζονται που προκαλούν το do_that και do_this μεθόδους για να συμπεριφερθεί με ένα συγκεκριμένο τρόπο με ένα πρόγραμμα που ονομάζεται Χ.

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))

Στη συνέχεια δημιούργησε τον πελάτη (ένα απλό GUI) που θα αξιοποιούν την κατηγορία στρατηγικής.

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()

Θα μπορούσε να βελτιωθεί αυτό το σχέδιο; Παρατήρησα ότι ένα θέμα είναι πως θα μπορούσε να καταλήξει με μια μεγάλη if / else δήλωση στην κατηγορία στρατηγική. Αυτό μπορεί να είναι εύκολο να καταλάβει, αλλά δεν είμαι σίγουρος αν αυτό είναι ιδιαίτερα κομψό. Ο κωδικός λειτουργεί. Εδώ είναι η έξοδος μετά τη θέση «Χ» στο GUI:

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

Με εκπλήσσει το γεγονός αυτό λειτούργησε.

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)

Νόμιζα ότι θα μπορούσε μόνο δυναμικά ορίσετε μία μέθοδο για ένα παράδειγμα μιας κατηγορίας.

Δημοσιεύθηκε 08/11/2018 στις 00:04
πηγή χρήστη
Σε άλλες γλώσσες...                            

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