Announcement

Collapse
No announcement yet.

Kaffeeautomat - Prozedur umschreiben

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Kaffeeautomat - Prozedur umschreiben

    Hallo zusammen,

    Der berühmte Getränkeautomat... Habe bei den Zusätzen Milch und Zucker jetzt alles so, wie ich es haben will. Zusätze sind nur dort wählbar, wo sie auch Sinn machen. Cola + Zucker wird z.B. deaktiviert, genauso wie Milch + Milch. Bei Kaffe + Milch und Zucker werden die Zusätze nach Tee übernommen, aber nach Suppe zB nicht(kein Häkchen mehr gesetzt).

    Habe jetzt zu der folgendem Prozedur ne Frage:

    [highlight=vbnet]
    Private Sub einaus()

    If mizu = 1 Then 'Alle Getränke, bei denen Milch und Zucker Sinn ergeben

    chkMilch.Enabled = True
    chkZucker.Enabled = True


    ElseIf mizu = 2 Then ' Milch

    ' Milch + Milch wird disabled, aber Zucker erlaubt

    chkMilch.Enabled = False
    chkZucker.Enabled = True

    ' Häkchen für Milch deaktivieren
    chkMilch.Checked = False

    ElseIf mizu = 3 Then ' Alle Getränke und Suppe bei denen Milch und Zucker
    ' keinen Sinn ergeben

    chkMilch.Enabled = False
    chkZucker.Enabled = False

    chkMilch.Checked = False
    chkZucker.Checked = False

    End If

    End Sub
    [/highlight]

    Bei jedem Getränk muss ich jetzt die Hilfsvariable mizu setzen, das stört mich... Wie kann ich diese Prozedur umschreiben, ohne dass diese Hilfsvariable benötigt wird?

    Danke für eure Hilfe!

    sunnyj

  • #2
    Woran würdest du die Enscheidung binden?
    Christian

    Comment


    • #3
      Hmmm, am Getränk selber, evtl? Habs jetzt hinbekommen

      Aber geht das Ganze evtl noch irgendwie eleganter?

      [highlight=vbnet]
      Private Sub einaus()
      ' Bei Kaffe, Tee und Schokolade: Milch und Zucker zulassen und vorherige Auswahl behalten
      If optKaffee.Checked = True Or optTee.Checked = True Or optSchokolade.Checked = True Then
      chkMilch.Enabled = True
      chkZucker.Enabled = True

      ' Bei Süppchen und Cola: Milch und Zucker NICHT zulassen und vorherige Auswahl verwerfen
      ElseIf optSuppe.Checked = True Or optCola.Checked = True Then
      chkMilch.Enabled = False
      chkZucker.Enabled = False

      chkMilch.Checked = False
      chkZucker.Checked = False

      ' Bei Milch: Nur Zucker zulassen, vorherige Auswahl von Milch verwerfen
      Else
      chkMilch.Enabled = False
      chkZucker.Enabled = True

      chkMilch.Checked = False

      End If

      End Sub
      [/highlight]

      Comment


      • #4
        Es war sicher vorher eleganter...

        Wenn du eine Methode hast, die dir diesen Wert ermittelt hat, wäre diese für weitere Entscheidungen vorhanden gewesen. Die Entscheidung wäre in einer Methode gekapselt gewesen. Kommt jetzt etwas dazu darfst du es an allen benötigten Stellen einfügen, überall die logischen Ausdrücke pflegen.

        Wenn die Methode dann noch ein Enum zurückgegeben hätte, wäre das auch lesbar gewesen.

        Wenn dir das if nicht gefällt kannst du ein switch benutzen...
        Christian

        Comment


        • #5
          Hallo Christian,

          danke für deine schnellen Antworten.

          Leider verstehe ich von dem, was du sagst, rein gar nicht... Soweit habe ich mich noch nicht eingearbeitet, bin blutiger Anfänger

          Kannst du mir mal ein Beispiel schreiben?

          Danke

          Edit: In dem Buch steht folgendes Beispiel:

          [highlight=vbnet]
          Private Sub EinAus()
          If fSchalter = True Then
          chkMilch.Enabled = True
          chkZucker.Enabled = True
          Else
          chkMilch.Enabled = False
          chkZucker.Enabled = False
          chkMilch.Checked = False
          chkZucker.Checked = False
          End If
          [/highlight]

          Das kann ich aber nicht benutzen, weil mir der fschalter durch Boolean nur 2 Möglichkeiten bietet. Da ich bei mir bei Milch aber Zucker als Zusatz erlaube, brauche ich eine dritte Möglichkeit... Deshalb auch der erste Versuch mit der Hilfsvariablen "mizu".
          Zuletzt editiert von sunnyj; 19.07.2011, 18:59.

          Comment


          • #6
            Es ist besser eine Methode zu haben, die den Zustand liefert, als das immer an den benötigten Stellen zu implementieren.

            Wenn jetzt jemand deine Aufgabe dahingehend erweitert, dass du am Schluß eine detailierten Bon ausdrucken sollst, dann musst du obige Prüfungen da auch reinschreiben.

            Wenn dann dein Chef sagt, dass neue Kundenkreise erschlossen wurden und ab jetzt auch Fledermausblut angeboten wird, dann musst du die logischen Prüfungen schon an 2 Stellen ergänzen.

            Wird jetzt gesagt, dass du auch eine XML-Datei schreiben sollst, dann sind die Prüfungen schon an einer 3. Stelle hinzuzufügen.

            .....
            Zuletzt editiert von Christian Marquardt; 19.07.2011, 19:18.
            Christian

            Comment


            • #7
              Und wie würde ich das an obigem Beispiel implementieren? Habe gerade zwar was über Objekte, Eigenschaften und Methoden gelesen, aber verstehe noch nicht, wie ich das hier in der Praxis einsetzen kann.

              Comment


              • #8
                In dem du eine Methode "getMilchZuckerZustand" schreibst, die den aktuellen Wert ermittelt und zurück gibt.
                Christian

                Comment


                • #9
                  Und wenn mir die Cola nicht süß genug ist?
                  ;-)
                  Günther

                  Comment


                  • #10
                    Dann trinkst du halt 2

                    Comment


                    • #11
                      @Christian: hmmmmmmmm

                      Mal drüber nachdenken und rumbasteln

                      Comment


                      • #12
                        Hallo,

                        die Prozedur wie in Post #3 hat wunderbar funktioniert....

                        Jetzt habe ich ein neues Formular erstellt, in dem ich zwischen einem Süßigkeitenautomaten und dem Getränkeautomaten wählen kann. Dieses habe ich dann in den Projekteinstellungen als Startformular festgelegt.

                        Der Getränkeautomat wird folgendermassen aufgerufen:

                        [highlight=vbnet]
                        Private Sub cmdKaffee_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdKaffee.Click

                        Dim objForm As New frmKaffee()
                        objForm.Show()

                        End Sub
                        [/highlight]

                        Der Getränkeautomat heisst immer noch frmKaffee, aber die Prozedur von Post #3 funktioniert nicht mehr, ein Fehler wird nirgendwo angezeigt.

                        Irgendeine Idee, warum die Prozedur nicht mehr funktioniert?

                        Danke,

                        sunnyj

                        Comment


                        • #13
                          Dieses Forum hat - wie andere auch - die seltsame Eigenschaft -> je Frage einen Thread.
                          Man sollte wirklich ausprobieren, in einem Forum Nutzer anzulegen und dann jeweils deren Fragen zu beantworten.

                          Da keiner weiss wie deine Prozedur aus #3 eingebunden wurde bzw. aufgerufen wurde, wird auch eine Beantwortung schwerfallen.
                          Christian

                          Comment

                          Working...
                          X