brauche Hilfestellung beim erstellen einer Bedingung

  • Mahlzeit Forum,


    ich hatte vor langer Zeit mal ein Script geschrieben welches eine Alarmanlage steuert. Das Script war ziemlich funktionell und da ich mich mit OOP beschäftigen wollte hatte ich das Script umgeschrieben.


    Ich lege mir die Türen als Objekte an und wenn ich den Befehl zum einschalten des Alarms via Telegram schicke übergebe ich diese Türen der Methode def pruefe_tuer(self):.

    Damit ich nicht jedesmal 2 oder mehr Nachrichten bekomme wenn mehr als eine Tür offen ist, wollte ich die noch nicht geschlossenen Türen in eine Liste schmeißen und diese dann via Telegram schicken. An sich funktioniert das mit einer Tür, bei mehr Türen nicht so richtig. :lol:


    Da alle Türen einzeln geprüft, gezählt und in eine Liste gepackt werden, ist die Bedingung if Alarm.tuerZaehler > 0 in dem Fall wahr wenn nur eine oder mehrere Tür nicht geschlossen ist/sind und die Null mit einem anderen Wert ersetzen bringts ja auch nicht.

    Dann dachte ich mir, ich zähle wie oft das Wortschnippsel "tuer" in meiner Liste vorkommt und vergleiche das mit dem zähler, was im prinzip aufs selbe Problem hinaus führt. :X


    Lange Rede kurzer Sinn.

    Hat jemand eine Idee wie ich mir meine Bedingung so zurecht basteln kann damit mir zuerst alle meine offenen Türen in eine Liste gepackt werden und danach die Liste verschickt wird?

  • Entkopple das Senden per Telegram in eine eigene Funktion und nicht innerhalb der Methode pruefe__tuer()

    Füge ein Attribut Name hinzu, um die einzelnen Türen identifizieren zu können. Hast du ja schon :geek:

    Wenn die Tür geprüft wird, und in Ordnung ist gibt sie False oder None zurück, wenn nicht gibt sie ihren Namen zurück.

    Diese Rückgaben packst du in eine Liste, die False oder None filterst du dabei gleich raus.


    EDIT:

    Eventuell lässt es sich besser handeln, wenn die Türen ihre eigene Klasse bekommen und der Alarmmanager eine eigene Klasse ist.

    Der Alarmmanager bekommt bei der Instanziierung alle vorhandenen Türobjekte übergeben.


    EDITEDIT:


    Leider aktuell ungetestet, aber so in der Richtung meinte ich den vorherigen Text:

  • keepfear: ``global`` ist gar keine gute Idee. Auch nicht wenn man das verschleiert in dem man Klassenvariablen verwendet. Auf die Klasse gehören nur Konstanten, keine Listen oder andere Werte die verändert werden.


    Zudem gehören `holztuer` und `werkstatttuer` nicht auf Modulebene. Das sind ja auch wieder globale Variablen.


    Defaultwerte sollten Sinn machen. Man kann wie es jetzt aussieht einen `Alarm` ohne Namen und ohne Pinnummer erstellen, was beim Namen keinen Sinn macht und bei der Pinnummer zu Folgefehlern führt.


    Die Argumente `pull_up` und `bounce_time` werden nirgends verwendet. Sollten aber wohl an die Basisklasse weitergereicht werden. Das beim Erstellen der `Alarm`-Objekte ein anderer `pull_up`-Wert übergeben wird, als dann tatsächlich in der `__init__()` verwendet wird, ist verwirrend.


    Namen werden in Python klein_mit_unterstrichen geschrieben. Ausnahmen sind Konstanten (KOMPLETT_GROSS) und Klassen (PascalCase).


    Von der zweielementingen `meldeText`-Liste wird im ganzen Programm ausschliesslich das zweite Argument verwendet.


    `sende_nachricht()` ist extrem überladen. Die Methode macht aufgrund der beiden Argumente und eines globalen Flags unterschiedlichste Dinge. Von den 8 Zustandsmöglichkeiten beim Aufruf gibt es nur einen einzigen bei dem es überhaupt eine Methode ist, alle anderen verwenden das Objekt auf dem das definiert ist überhaupt gar nicht. Und der Fall *wo* das Objekt verwendet würd, hätte auch dadurch abgedeckt werden können, dass man das als Argument beim Aufruf an eine Funktion übergeben hätte. Aber wie gesagt: Die Methode macht viel zu viele unterschiedliche Dinge. Und wenn man sich den Code anschaut der das aufruft können auch gar nicht alle Fälle die dort behandelt werden, überhaupt auftreten.


    `tuerZaehler` ist mir nicht so ganz klar. Das sieht irgendwie so aus als würde da bloss redundant die Länge der Liste mitgeführt. Die kann man aber schon von der Liste mit `len()` abfragen.


    Eigentlich macht `Alarm` kaum etwas als einem `Button` noch einen Namen zu verpassen, wenn man da mal alles raus holt was eigentlich nicht in diese Klasse gehört.


    Ungetestet:

    Hofei Methoden die ein Ergebnis berechnen und das dann sowohl als Attribut setzen als auch an den Aufrufer zurückgeben, sind komisch. Da weiss man dann nicht was eigentlich der vorgesehene Weg ist diese Information zu verarbeiten — der Rückgabewert oder das Attribut. In desem Fall sind die offenen Türen aber auch gar kein Teil des Zustands von dem Objekt, denn der Wert ”veraltet” ja, das heisst der stimmt nur wenn man ihn gerade abgefragt hat. Wenn das Zustand sein soll, dann müsste der immer aktuell gehalten werden, also jedes mal aktualisiert werden wenn eine Tür geöffnet oder geschlossen wird. Dann müsste man den auch mit einem `Lock` absichern, denn die Rückrufe von den Türen passieren potentiell von einen anderen Thread aus.

    “I will not sell my kidney on eBay

    I will not sell my kidney on eBay

    I will not sell my kidney on eBay …” — Bart Simpson

  • Mahlzeit,

    (...)nicht auf Modulebene

    Wieso kommt denn logging.basicConfig(...) nich in die 'main'-Funktion sondern auf Modulebene? Damit das Logging konfiguriert ist, bevor irgendetwas anderes passiert oder gibt es noch einen anderen Grund?


    Danke und Grüße

    Dennis

    ... ob's hinterm Horizont wirklich so weit runter geht oder ob die Welt vielleicht doch gar keine Scheibe ist?

  • Dennis89 Zum einen dass, zum anderen ist Logging ja tatsächlich etwas das hier eine globale Einstellung ist. Das Logging-System ist globaler Zustand.

    “I will not sell my kidney on eBay

    I will not sell my kidney on eBay

    I will not sell my kidney on eBay …” — Bart Simpson