Angepinnt Grundlagen: Benennung von Controls (Update: 24.10.2010)

  • VB.NET

Es gibt 47 Antworten in diesem Thema. Der letzte Beitrag () ist von loeffel.

    So, dein MVVM-Tut-Beispiel-Projekt ist da - und da finde ich dieses Form als Programm-Einstieg:

    VB.NET-Quellcode

    1. Public Class Initialize
    2. Public Shadows WithEvents Viewmodel As InitializeViewModel
    3. Public Sub New()
    4. InitializeComponent()
    5. Viewmodel = New InitializeViewModel
    6. Viewmodel.Initialize(Me)
    7. AddHandler MyFunctions.SaveClicked, AddressOf SaveClick
    8. End Sub
    9. Private Sub Initialize_Shown(sender As Object, e As EventArgs) Handles Me.Shown
    10. If Viewmodel.ConnectionCheck() Then
    11. Message.Text = "Verbindung aufgebaut"
    12. Message.ForeColor = Color.Lime
    13. Dim UserForm As New KratosUser
    14. UserForm.Show()
    15. Me.Close()
    16. End If
    17. End Sub
    18. Private Sub SaveClick()
    19. If Viewmodel.ConnectionCheck() Then
    20. Message.Text = "Verbindung aufgebaut"
    21. Message.ForeColor = Color.Lime
    22. Dim UserForm As New KratosUser
    23. UserForm.Show()
    24. Me.Close()
    25. Else
    26. Message.Text = "Verbindung konnte nicht hergestellt werden"
    27. Message.ForeColor = Color.Red
    28. End If
    29. End Sub
    30. End Class
    Ich habs schon bischen verändert, nämlich dir Regions rausgeworfen, weil wenn ich eine Datei öffne, dann will ich den Code darin sehen - ich will nicht erst noch iwelche Regions aufklappen müssen.
    Ist auch gar kein Problem - wie man sieht, passt der Code komplett selbst in kleine Editoren.
    Region-Exkurs
    ((Also die Regions bringen hier nix, ausser die erleichterte Möglichkeit, Code zu übersehen). Und wenn sie etwas brächten - etwa bei grossen Code-Dateien - dann wäre das eher ein Anzeichen fragwürdiger Architektur, dass da so grosse Dateien entstehen und unübersichtlich werden, dass man zu Regions neigen könnte.
    Summe: Regions bringen fast nie was, denn wenn sie bringen würden, sollte man eher die Architekt nochmal angucken)

    Wie dem auch sei - im gezeigten Code finde ich kein MVVM, sondern finde ganz normales WinForms-Coding - und darin vor allem eine fehlende BePrefixung:
    Message sollte lbMessage heissen, denn es ist keine Message, sondern ist ein Label.
    Die Klasse selbst heisst wie eine Methode - nämlich Initialize. Tatsächlich ists aber ein Form (also eine besondere Klasse, was ich beprefixen würde)
    Die Klasse KratosUser heisst ebenfalls wie eine Klasse, ist aber ein Form. Hier wendest du wenigstens für das erstellte Objekt eine Kenntlichmachung an - zwar keinen Prefix, stattdessen aber einen Postfix: UserForm.
    Wie gesagt: Bei mir wäre bereits die Klasse als Form kenntlich - die hiesse frmKratoUser.
    Also mit Prefixen benamt nach meinem System sähe der Code so aus:

    VB.NET-Quellcode

    1. Public Class frmInitialize
    2. Public Shadows WithEvents Viewmodel As InitializeViewModel
    3. Public Sub New()
    4. InitializeComponent()
    5. Viewmodel = New InitializeViewModel
    6. Viewmodel.Initialize(Me)
    7. AddHandler pnlFunctions.SaveClicked, AddressOf SaveClick
    8. End Sub
    9. Private Sub Initialize_Shown(sender As Object, e As EventArgs) Handles Me.Shown
    10. If Viewmodel.ConnectionCheck() Then
    11. txtMessage.Text = "Verbindung aufgebaut"
    12. txtMessage.ForeColor = Color.Lime
    13. Dim frm = New frmKratosUser
    14. frm.Show()
    15. Me.Close()
    16. End If
    17. End Sub
    18. Private Sub SaveClick()
    19. If Viewmodel.ConnectionCheck() Then
    20. txtMessage.Text = "Verbindung aufgebaut"
    21. txtMessage.ForeColor = Color.Lime
    22. Dim frm = New frmKratosUser
    23. frm.Show()
    24. Me.Close()
    25. Else
    26. txtMessage.Text = "Verbindung konnte nicht hergestellt werden"
    27. txtMessage.ForeColor = Color.Red
    28. End If
    29. End Sub
    30. End Class
    Wie man sieht: bis auf Viewmodel ist jedes Objekt beprefixt, weil es sind alles Controls. Auch das FunctionPanel - das hab ich nur durch Zufall mitgekriegt, dass das ja auch ein Control ist - das hiess ja vorher MyFunctions.



    Weiter kann ich mit der Solution nix anfangen, weil ich weiss nicht, was ich in frmInitialize eingeben muss, damit frmKratoUser gültige Daten hat und geöffnet wird.
    Hallo @ErfinderDesRades,

    Zu den angesprochenen Punkten: Ich habe ja bereits im Vorfeld geschrieben, dass ich kein Freund von Präfixen bin. MVVM Kannst du in der Maske auch nicht finden, Die Maske ist unheimlich dumm. Die macht gar nichts. Die Logik für das ganze findest du in der Basisklassen aus denen gerbt wird, was dir am Shadows im Viewmodel hätte auffallen können.

    Was du eingeben musst, sollte eigentlich klar sein, das Programm benötigt vorab die Verbindungsdaten zu einen MSSQL-Server, wie ich es auch an zwei oder drei Stellen im Tutorial beschrieben habe.

    Was die Regions angeht: Verwende ich nicht zum Ausblenden sondern zum Strukturieren, damit ich alles schnell wieder finde. Geschmackssache denke ich.


    Ein Computer wird das tun, was du programmierst - nicht das, was du willst.
    Ou, kann sein, dass ich da zuviel in Deinen Post#22 reininterpretiert habe, als ich ankündigte, dass Du ein Tutorial zum Thema MVVM@WinForms planst. Ich hab da MVVM reininterpretiert, obwohl Du das nie geschrieben hattest. Jetzt wird's aufgegabelt und Dir was nachgesagt, was so gar nicht gedacht war. Sorry. :(
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Nein, alles gut. Ist ja nicht falsch was du geschrieben hast, aber @ErfinderDesRades hat sich offenbar nur den Code aus der Maske angeschaut, das reicht natürlich nicht. Um die Maske zu verstehen, muss man sich 6 Klassen anschauen. Die Form, das Viewmodel und das ViewElement und natülich auch die Basisklassen die jedem davon zugrunde liegen. Das scheint er aber nicht getan zu haben, was aus verschiedenen Stellen des Post ersichtlich wird. Zum einen hat er zunächst das FunctionPanel übersehen, was in der Basisform deklariert ist und nur an die InitializeForm vererbt wird. Dann weiß er nicht, welche Daten er in der Maske eingeben soll, was er nur dann nicht wissen kann, wenn er nicht ins Viewmodel reingeschaut hat, denn dort werden die Daten aus der Maske direkt in ein Objekt eingetragen das SQLServer heißt. Spätestens dort hätte er erkennen müssen, dass er die Daten eines SQL-Servers dort eintragen muss. Wenn er dann noch mein Tutorial gelesen hätte, dann hätte er gewusst, dass ich einen MSSQL-Server erwarte. Das FunctionPanel zu übersehen ist doppelt schlecht für das das Verständnis, da es die allgemeine Logik zwischen Viewmodel und Maske verknüpft.

    Hier also nochmal der Hinweis: Es reicht nicht das Projekt zu überfliegen. Man muss sich schon etwas intensiver damit beschäftigen um zu verstehen, was ich hier mache. Die Code-Beispiele die @ErfinderDesRades in seinem Post erwähnt hat eignen sich eigentlich nur für einen Zweck: Um zu demonstrieren wie wenig Code erforderlich ist, um eine Stammdatenmaske lauffähig zu machen.


    Ein Computer wird das tun, was du programmierst - nicht das, was du willst.
    wie gesagt: ich kriege die Solution nicht ans Laufen, und so hats meiner Meinung nach keinen Zweck, sich den Code genauer anzugucken:
    Ich würde mir nur was zusammen-reimen, wie's vielleicht funktioniert, aber ohne TestLauf-Möglichkeit bleiben das zusammengereimte Vermutungen - und wird kein Verständnis draus.
    Dass da VerbindungsDaten zu einer Datenbank anzugeben sind ist mir schon klar - so sind die Textboxen ja beschriftet. Aber ich wüsste nicht, dass ich eine Datenbank hätte, mit der die "KratosProjekts"-Solution lauffähig wäre.
    Das meine ich damit, dass ich nicht weiss, was ich da eintragen soll.
    Dann gib eine völlig blanke Datenbank an und lass dich überraschen ;)

    Das Programm ist darauf auslegt sich komplett selbst zu verwalten. Du musst nichts weiter tun als ihm einmalig mitzuteilen in welche Datenbank du die Daten ablegen willst. Den Rest macht das Programm selber. Die SQL-Daten werden verschlüsselt im Ordner abgelegt, wo die .exe liegt. Im Unterverzeichnis SQLServer. Wenn du das Programm nachträglich zu einer anderen Datenbank verbinden willst, lösch den Ordner und du wirst erneut aufgefordert einen SQL-Server zu verbinden.


    Ein Computer wird das tun, was du programmierst - nicht das, was du willst.

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

    Nur so als insider Bericht, wie wir es bei Microsoft im WinForms Team handhaben:
    • Klassenmember tragen das Praefix '_' (auch in VB)
    • Consts beginnen mit Grossbuchstaben (es gibt aelteren code - zum Beispiel die App Framework Runtime, bei dem das noch nicht der Fall ist, aber wir bemuehen uns nach und nach, umzustellen.)
    • Static members (Shared in VB) tragen das Praefix "s_"
    • Lokale Variablen und Argumente, die an Methoden uebergeben werden, beginnen mit Kleinbuchstaben.
    • Wir verwenden Type Inferring (var in C#, Dim ohne As Klausel in VB) nur im Kontext, bei dem die Typen bedeutungstechnisch eindeutig und leicht zu erkennen sind. Primitive/Intrinsische Typen werden nie type inferred.
    Bei der Benennung von Controls denke ich mir: Das sind halt ebenfalls Klassenmember. Wieso sollten sie also nicht dem Pattern folgen?
    (Also beispielsweise _okButton oder wegen mir auch _btnOK).

    Ich glaube konsequentes Durchhalten des wie auch immer entworfenen Schemas ist wichtiger, als das Schema selbst.

    Meine 2 Cents.

    Klaus