Anrufbeantworter(OOP & Events )

  • VB.NET
  • .NET (FX) 4.0

Es gibt 30 Antworten in diesem Thema. Der letzte Beitrag () ist von Amro.

    Anrufbeantworter(OOP & Events )

    Hallo Leute,
    schlage mich gerade mit Events und OOP rum.
    Um für mich selbst das ganze etwas verständlich zu machen, will ich
    ein kleines Programm schreiben.

    Folgendes soll implementiert werden:
    Ein Telefon-Klasse das Anrufe entgegen nehmen kann.
    Nach 3x klingeln soll eine Methode ausgelöst werden .
    Das Event befindet sich in der Klasse AnrufBeantworter.
    Das ganze sollte so flexible sein ,das die Nachricht für den AB und
    wie oft es Klingeln soll, bevor der AB angeht , in der aufrufenden
    Klasse implementiert (eine Form) werden kann.


    Wie würdet Ihr sowas angehen ? ?(
    Halte das Beispiel nicht für gut geeignet.
    Klassen braucht man eiglich nur, wenn man mehrere Objekte einer Klasse haben will.
    Hier gibt es aber nur 1 Telefon und 1 AB - es wäre also garnet angezeigt, eine Klasse überhaupt zu entwickeln. Damit ist das mit den Events erst recht hinfällig.

    Wie wärs mit einem Apfelbaum?
    Sind viele Äppel dran, und die wachsen unterschiedlich schnell. Ab einem bestimmten Gewicht fallen sie runter. Vlt hat auch jeder Apfel sein eigenes individuelles Runterfall-Gewicht.

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „ErfinderDesRades“ ()

    Jaa, das hört sich gut an.


    Was hälst du davon wenn der Baum erst nach einem bestimmten Alter(Jahre) Äpfel trägt.
    Die Klasse Baum sollte dann selber dafür sorgen, das Äpfel wachsen?

    Der Apfel sorgt dafür, bei welchem Gewicht er runter fällt.

    Wenn mann das mit Events lösen könnte, würde ich es evt. verstehen :thumbsup:
    keine Klasse Baum, denn Baum ist wieder nur einer, daher nicht notwendigerweise eine Klasse.
    Aber vonne Äppel gibts ja mehrere.

    Und einfach anfangen: einfach nur verschiedene Äppel generieren, die mw. alle gleich wachsen, aber je bei verschiedenem Gewicht runterpurzeln.

    Komplizierter kannstes jederzeit machen, mit Würmern, Jahreszeiten, Wirbesstürmen, Holzfällern und Auto-Unfällen.
    @ErfinderDesRades ich denke es ist schon sinnvoll wenn man sich das OOP Konzept direkt angewöhnt auch wenn es nicht unbedingt notwendig wäre.

    Was passiert wenn später eine "Wiese" mit mehreren Apfelbäumen hinzukommt??

    Es macht schon sinn mit Objekten zu arbeiten auch wenn dies später nur 1x instanziiert wird.

    shaebich schrieb:

    ich denke es ist schon sinnvoll wenn man sich das OOP Konzept direkt angewöhnt auch wenn es nicht unbedingt notwendig wäre.
    unbedingt.
    Und dazu gehört auch die Fähigkeit, unterscheiden zu können, wann eine Klasse sinnvoll ist, und wann nicht.

    Und klar - bei einer Streuobst-Wiese muss zusätzlich zur Apfel-Klasse auch eine Baum-Klasse her.

    Ich finde grad so zeigt sich der Sinn von Klassen erst.
    Und es zeigt sich, wie die Klassenstruktur etwas modelliert - Datenmodell - eines meiner Lieblings-Themen.
    Und es zeigt sich, wie man erweitert, wenn weitere Anforderungen hinzukommen.



    shaebich schrieb:

    Es macht schon sinn mit Objekten zu arbeiten auch wenn dies später nur 1x instanziiert wird.
    welchen denn?

    Wie gesagt, wenn eine Wiese zu modellieren ist, dann braucht man die Baum-Klasse, weil dann hat man ja mehrere Bäume. Aber vorher nicht, und deshalb soll man sie vorher auch nicht programmieren.
    Aus 2 Gründen
    1. Du weißt nocht nicht, wie die Baumklasse dann wirklich aussehen muss, wenn sie denn nötig wird.
    2. Vorauseilendes Programmieren kann ins Unendliche führen - warum nicht auch eine Wiese-Klasse? Und dann eine Gemarkungs-Klasse? Und eine Landkreis-Klasse? Bundesland-Klasse? Staat-Klasse? Welt-Klasse nicht vergessen! Sonnensystem! Universum! Multiversum! Multi-Multiversum!
      (Und das alles nur für paar blöde Äppel) ;)

    ErfinderDesRades schrieb:

    Du weißt nocht nicht, wie die Baumklasse dann wirklich aussehen muss, wenn sie denn nötig wird.


    Aber ich muss doch die Property und Funktionen die ein Baum hat sowieso implementieren. Wieso also nicht gleich sauber als Objekt bzw. eigene Klasse?

    Ich sehe kein Nachteil darin, im gegenteil..dies entspricht absolut allem was man unter Kapselung verstehen sollte :D
    Hä? In dem Modell kommt doch gar kein Baum vor - wassn für Properties willste da implementieren?

    Die Nachteile hab ich doch schon genannt:
    1. Die vorzeitige Implementation ist immer erstmal falsch.
    2. Das Prinzip, iwas vorauseilend zu entwerfen, führt ins Unendliche - es gibt kein Kriterium, wo man damit aufhören sollte.
    3. noch ein drittes: Wenn man so anfängt, erschwert man sich, den Sinn von Objekten zu verstehen: dass mehrere Objekte einer Klasse existieren können.
      Es gibt nunmal Objekte, und es gibt noch anderes. Sieh mal die Math-Klasse: So viel Funktionalität - und kein Objekt!
    ein Baum, dem du eine List(Of Apfel) übergibst - der macht doch nichts, was die List(Of Apfel) nicht selbst könnte.

    Nenn meinetwegen die List(Of Apfel) "Baum" - Nomen est Omen!

    VB.NET-Quellcode

    1. Private Baum As New List(Of Apfel)
    Mach alles immer so einfach wie möglich.
    Kompliziert wirds schon von ganz von selbst, da brauchst du keinerlei Extra-Bemühungen für hineinzulegen, mit Bäumen und was dir sonst noch einfällt.

    Eine Klasse, die eigentlich gar keine eigene Aufgabe hat, ist ein Greuel, und macht Code unverständlicher als so mancher anderer Code-Horror.
    Sinnloser, lauffähiger Code ist meist schlimmer, als wenn du einen richtigen Fehler drinne hast, der zumindest gelegentlich auftritt, und den man dann beheben kann.
    Ok, glaub hab was brauchbares

    VB.NET-Quellcode

    1. Public Class Form1
    2. WithEvents neuerApfel As cApfel
    3. Private Sub bntNeuerApfel_Click(sender As Object, e As EventArgs) Handles bntNeuerApfel.Click
    4. neuerApfel = New cApfel
    5. Label1.Text = "Neuer Apfel"
    6. End Sub
    7. Private Sub bntWachse_Click(sender As Object, e As EventArgs) Handles bntWachse.Click
    8. neuerApfel.ApfelGroesse += 50
    9. End Sub
    10. Sub Event1() Handles neuerApfel.Fallen
    11. Label1.Text = "Apfel fällt..."
    12. End Sub
    13. End Class


    Hier der Apfel

    VB.NET-Quellcode

    1. Public Class cApfel
    2. Public Event Fallen()
    3. Private _apfelGroesse As Single
    4. Public Property ApfelGroesse() As Single
    5. Get
    6. Return _apfelGroesse
    7. End Get
    8. Set(ByVal value As Single)
    9. _apfelGroesse = value
    10. If _apfelGroesse >= 100 Then
    11. RaiseEvent Fallen()
    12. End If
    13. End Set
    14. End Property
    15. End Class
    Keinesfalls hat ein Apfel eine Count-Property. Ein Apfel ist er selbst, er ist keine Auflistung.
    Betrachte die Realität: Weiß ein Appel am Baum, wieviele annere Äppel da rumhängen?

    Eine Auflistung hat eine Count-Property, wie gesagt: Mach nichts überflüssiges. List(Of Apfel) ist eine Auflistung, und hat auch eine Count-Property.
    Noch eine Count-Property sich auszudenken kann nur Chaos stiften.

    Ich hab dir den Code in post#10 doch schon gegeben, ist iwas nicht in Ordnung damit?

    Edit: zu spät
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Option Strict On
    2. Public Class Form1
    3. WithEvents neuerApfel As cApfel
    4. Private Baum As New List(Of cApfel)
    5. Private Sub btnNeuerApfel_Click(sender As Object, e As EventArgs) Handles btnNeuerApfel.Click
    6. neuerApfel = New cApfel
    7. Baum.Add(neuerApfel)
    8. End Sub
    9. Private Sub btnWachse_Click(sender As Object, e As EventArgs) Handles btnWachse.Click
    10. For Each oApfel As cApfel In Baum
    11. oApfel.ApfelGroesse += 50
    12. Next
    13. End Sub
    14. Private Sub neuerApfel_Fallen() Handles neuerApfel.Fallen
    15. Label1.Text &= "Apfel fällt..." & Environment.NewLine
    16. End Sub


    Klasse Apfel ist noch so wie vorher

    Wenn ich in der For each schleife die liste durchgehe und
    die Grösse änder, müsste doch für jeden Apfel das Ereignis ausgelöst werden
    und in Label1 angezeigt werden.
    Das Ereignis wird jedoch nur einmal ausgelöst

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Amro“ ()