Klassendesign Spannungsquelle

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 10 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Klassendesign Spannungsquelle

    Hallo liebe Leute,

    ich habe eine 3-phasige Spannungsquelle die sich über ASCI Befehle über RS232 steuern lässt.
    Es ist möglich Spannungen an den einzelnen Phasen einzustellen und auszulesen.

    Ich möchte jetzt eine kleine Hilfssoftware schreiben mit einem hübschen GUI damit man die Befehle nicht immer über ein Terminalprogramm schicken muss.

    Da jede dieser Phasen Eigenschaften besitzt wie z.B. AC-Spannung, DC-Spannung, Strom, Scheinleistung, Blindleistung, Wirkleistung kommen doch sehr viele Properties zusammen (weil, das ganze mal 3) und das ganze könnte etwas unübersichtlich werden.

    Mal angenommen ich würde jetzt für die Eigenschaften die Properties erstellen in einer Klasse die "Spannugsquelle" heißt.

    Dann würde nach Instanzierung einer solchen Spannungsquelle der Zugriff auf die Eigenschaften ja so aussehen:

    VB.NET-Quellcode

    1. Private Sub ABC()
    2. Dim Quelle as New Spannungsquelle
    3. Quelle.Phase1ACSpannung
    4. Quelle.Phase1DCSpannung
    5. Quelle.Phase1Strom
    6. '[...]
    7. Quelle.Phase2ACSpannung
    8. Quelle.Phase2DCSpannung
    9. Quelle.Phase2Strom
    10. '[...]
    11. Quelle.Phase3ACSpannung
    12. Quelle.Phase3DCSpannung
    13. Quelle.Phase3Strom
    14. End Sub


    Wenn ich jetzt diese zig Properties habe und

    VB.NET-Quellcode

    1. Quelle.


    schreibe, dann würde mir IntelliSense ja alle meine Properties anzeigen und das ist ja irgendwie ein Chaos.

    Wie ist es denn möglich den Code bestmöglich zu strukturieren?
    Sprich sowas hier

    VB.NET-Quellcode

    1. Quelle.Phase1.ACSpannung
    2. Quelle.Phase1.DCSpannung


    Also das IntelliSense mir nach Eingabe von

    VB.NET-Quellcode

    1. Quelle.


    die Phasen anzeigt und erst nachdem ich eine Phase ausgewählt habe

    VB.NET-Quellcode

    1. Quelle.Phase1.


    die Propierties für die Phase?

    Was ist denn da "Best Practice"?

    Ich wäre dankbar für jegliche Hilfe!
    Du erstellst dir eine Klasse Spannungsquelle, welche du schon hast.
    Dann erstellst du eine Klasse, von mir aus "Phase". Diese beinhaltet dann die Properties welche du benötigst.
    Innerhalb der Klasse Spannungsquelle stellst du 3 Properties vom Typ "Phase" (Phase1, Phase2, Phase3) bereit. Diese instanziierst du am Besten im Konstruktur.

    Danach kannst du, wie du es oben beschrieben hast, auf diese Art darauf zugreifen.

    lg
    ScheduleLib 0.0.1.0
    Kleine Lib zum Anlaufen von Code zu bestimmten Zeiten
    @fichz Eher nicht.
    @vanitas Eine Klasse für alles, davon 3 Instanzen für jede Phase. Diese Phase müsstest Du dann im Konstruktor übergeben.
    Arbeiten die 3 Phasen absolut unabhängig voneinander oder sehen die Eigenschaften von anderen Phasen?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @vanitas Jou. 3 Instanzen, die kannst Du dann unabhängig voneinander ansteuern.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Aber die Spannungsquelle als reales Objekt existiert doch nur einmal? Wenn ich drei Instanzen davon initialisiere, dann brauche ich auch drei COM-Ports?

    Tante Edith: Also die Lösung von deinem Vorredner fand ich eigentlich plausibel, bis ich gemerkt habe das die Phasen dann zur Laufzeit instanziert werden. Das heißt ich kann beim Programmieren gar nicht darauf zugreifen :D
    Tante EdithEdith: Wenn ich aber in der Klasse eine globale Variable vom Typ Phase erstelle, dann kann ich doch drauf zugreifen. Ist doch ok, oder?

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

    vanitas schrieb:

    Die Phasen arbeiten unabhängig voneinander.
    Also pack jede Phase in eine Instanz.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Ich verstehe nicht wie du das meinst?

    Warum sollte ich drei Instanzen der Spannungsquelle instanzieren, wenn ich in der Realität nur eine Quelle habe?

    Die drei Phasen lassen sich aber unterschiedlich einstellen. Wenn ich der Quelle dann den Befehl schicke um den Ausgang freizuschalten, liegt die voreingestellte Spannung an den Ausgängen (Phase 1-3).
    @vanitas Das, was Du bisher Spannungsquelle nanntest, ist dem Inhalt nach eine Phase.
    Benenne die Klasse meinetwegen um.
    Wenn da 3 irgendwelche Dinger der gleichen Art unabhängig voneinander agieren können, gehören die in 3 Instanzen. Egal, wie sie heißen.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @RodFromGermany Dann möchte ich das nochmal klarstellen.

    Nennen wir es meinetwegen Generator. Der Generator hat 3 Phasen (L1, L2, L3 und natürlich das Bezugspotential N). Also hat 1 Generator 3 Kanäle die sich unabhängig voneinander einstellen lassen.

    Bisher habe ich es jetzt so gelöst. Wie von fichz vorgeschlagen.

    VB.NET-Quellcode

    1. Public Class Generator
    2. Public Phase1 As New Phase
    3. Public Phase2 As New Phase
    4. Public Phase3 As New Phase
    5. Public Class Phase
    6. Private mACSpannung As Double
    7. Public Property ACSpannung() As Double
    8. Get
    9. Return mACSpannung
    10. End Get
    11. Set(ByVal value As Double)
    12. mACSpannung = value
    13. End Set
    14. End Property
    15. End Class 'Phase
    16. End Class 'Generator


    und in meinem Projekt so:

    VB.NET-Quellcode

    1. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    2. Dim MyGen As New Generator
    3. MyGen.Phase1.ACSpannung = 20
    4. MyGen.Phase2.ACSpannung = 40
    5. MyGen.Phase3.ACSpannung = 60
    6. End Sub


    Ist das so in Ordnung oder hast du einen anderen Vorschlag?