Fragen zum MVC-Pattern

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

Hallo,

nachdem ich mir einige Beispiele zum MVC-Pattern angeschaut habe, bleibt für mich erstmal eine Frage: Welchen Vorteil hat es, einen observer (oder wie immer man das dann nennen mag) einzubauen?
Ich hab' mal 2 ganz simple Beispiele geschrieben, anhand derer das für mich noch nicht wirklich ersichtlich ist. Aber irgendeinen Grund muss es ja geben, oder? :wink:

Ohne observer:

Code: Alles auswählen

class Model(object):
    def set_data(self, data):
        self.data = data

class View(object):
    def output(self, data):
        print '-' * 15
        print 'Ihre Eingabe war:'
        print 'Vorname: %s\nNachname: %s' % data
        print '-' * 15

    def input(self):
        first = raw_input('Vorname : ')
        last = raw_input('Nachname: ')
        return first, last

    def question(self):
        another = raw_input('Weitere Eingabe (j/n)? ')
        return another

def control():
    model = Model()
    view = View()
    another = ''
    while another != 'n':
        model.set_data(view.input())
        view.output(model.data)
        another = view.question()

if __name__ == '__main__':
    control()
Mit observer:

Code: Alles auswählen

class Observer(object):
    def __init__(self):
        self.callbacks = []

    def add_callback(self, func):
        self.callbacks.append(func)

    def run_callbacks(self):
        for func in self.callbacks:
            func(self.data)

    def set_data(self, data):
        self.data = data
        self.run_callbacks()

class Model(object):
    def __init__(self):
        self.data = Observer()

    def set_data(self, data):
        self.data.set_data(data)

class View(object):
    def output(self, data):
        print '-' * 15
        print 'Ihre Eingabe war:'
        print 'Vorname: %s\nNachname: %s' % data
        print '-' * 15

    def input(self):
        first = raw_input('Vorname : ')
        last = raw_input('Nachname: ')
        return first, last

    def question(self):
        another = raw_input('Weitere Eingabe (j/n)? ')
        return another

def control():
    model = Model()
    view = View()
    model.data.add_callback(view.output)
    another = ''
    while another != 'n':
        model.set_data(view.input())
        another = view.question()

if __name__ == '__main__':
    control()
mutetella
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
BlackJack

@mutetella: Der `Observer` sieht mir mehr nach einem `Observable` aus.

Der Sinn bei so etwas liegt darin, dass es Daten gibt, die man über mehrere unterschiedliche Views anzeigen möchte und vielleicht auch verändern möchte.

Simples Beispiel: Schieberegler und Texteingabe für einen Wert. Wenn der Schieberegler den Wert ändert, dann möchte der View, der die Zahl als Text anzeigt, darüber informiert werden und umgekehrt. Und vielleicht hängt ja noch irgendein anderer View von dem Wert ab und möchte auch über Änderungen informiert werden um sie darzustellen. Zum Beispiel durch eine Farbänderung oder eine Grafik die von dem Wert abhängt oder so.
Antworten