Fachbegriffe sind leider oft unumgänglich, will man präzise Anleitung geben, deren Befolgung nicht in einem frustrierenden Dickicht endlos-mühsamer Fehlversuche steckenbleibt.
Obwohl die hier angesprochenen Begriffe sprachübergreifend allgemeingültig sind, illustriere ich sie der Einfachheit halber nur mit Vb.Net-Samples - wenn überhaupt.
Meine Definitionen sind ungenau - ich kann keinen Abriss objektorientierter Programmierung leisten.
Sie sind für Anfänger gedacht, denen man evtl. ausgezeichnete Erklärungen gegeben hat - die dann aber doch nur "Bahnhof" verstehen, weil sie mit zB "Konstruktor" nix anfangen können .
Die Liste ist unvollständig - wer Ergänzungen weiß, bitte per PM. Allerdings sag ich euch gleich, dass ich letztendlich nach Gutdünken entscheide, was noch dazukommt.
Obwohl die hier angesprochenen Begriffe sprachübergreifend allgemeingültig sind, illustriere ich sie der Einfachheit halber nur mit Vb.Net-Samples - wenn überhaupt.
Meine Definitionen sind ungenau - ich kann keinen Abriss objektorientierter Programmierung leisten.
Sie sind für Anfänger gedacht, denen man evtl. ausgezeichnete Erklärungen gegeben hat - die dann aber doch nur "Bahnhof" verstehen, weil sie mit zB "Konstruktor" nix anfangen können .
Die Liste ist unvollständig - wer Ergänzungen weiß, bitte per PM. Allerdings sag ich euch gleich, dass ich letztendlich nach Gutdünken entscheide, was noch dazukommt.
Links
(Online-)BuchTipps und anderes
Vb.Net-SchlüsselWorte
Skizze für eine Art "konzentrierten Selbst-Bildungsweg" (viele Links)
(Klassen-)Member
Sammelbegriff aller Elemente, die in einer Klasse vorhanden sein können - es sind genau diese: Methoden, Properties, Events, Felder
Feld
Variable auf Klassenebene
Deklaration
Eine Deklaration bestimmt, dass es etwas gibt. Genau: Eine Deklaration erstellt einen Code-Namen, und weiterer Code kann diesen Namen benutzen. Und der Compiler weiß, was damit gemeint ist.
Bei Variablen, Properties, Methoden-Argumenten und -Rückgabewerten legt die Deklaration auch den Datentyp fest, (meist) mittels
As
- Klausel.Vier Beispiel-Deklarationen (beim Feld ist nach der As-Klausel noch eine Initialisierung angehängt):
VB.NET-Quellcode
- Public Class Car 'Klassen-Deklaration (keine As - Klausel)
- Private _MaxSpeed As Double = 180 'Feld-Deklaration mit Initialisierung
- Public Property Speed As Double 'Property-Deklaration
- Public Sub SpeedUp(ByVal betrag As Double) 'Methode mit Argument, aber ohne Rückgabewert
- Public Function TrySpeedUp(ByVal betrag As Double) As Boolean 'Methode mit Argument und Rückgabewert
Schlüsselwort
Die Programmiersprache besteht im Kern nur aus Schlüsselworten und Operatoren. Alles weitere wurde letztlich durch Deklarationen hinzugefügt.
ZB obiges Snippet enthält die Schlüsselworte:
Public, Class, Private, As, Property, Function
- sind im VS-Editor auch farblich gekennzeichnet - hier zB in blau.Eine vollständige Dokumentation findet sich hier: Vb.Net-SchlüsselWorte - sehr empfehlenswert, die Erklärungen und Beispiele sind meist ausgezeichnet (verständlich und vollständig), und selbst Kenner finden oft noch unbekanntes.
Anweisung / Statement (
/
bedeutet: "ist dasselbe")Kleinste zusammenhängende Einheit von Code, die der Compiler akzeptiert. Üblicherweise eine Codezeile, aber man kann auch mehrere Anweisungen in eine Zeile stopfen.
zugreifen / addressieren
Sammelbegriff, anwendbar auf Member, also auf Methoden, Properties, Feldern, Events
Methoden tut man aufrufen, und übergibt dabei ggfs. Argumente.
Properties kann man abrufen oder auch setzen/zuweisen.
Auch Felder kann man abrufen oder zuweisen.
Events tut man entweder auslösen/feuern oder abonnieren/behandeln.
Methode / Prozedur
Sammelbegriff für
Function
(mit Rückgabewert) und Sub
(ohne Rückgabewert)Argument / Parameter
einer Methode kann kein bis viele Argumente übergeben werden. In der Deklaration der Methode werden diese innerhalb der Klammer aufgeführtDiese Methode hat 2 Parameter, nämlich einen String und ein Integer, und der Rückgabewert ist vom Typ Double
Und so könnte man das aufrufen, und die Argumente "aText" und 42 übergeben - und bekommt etwas zurück:
Signatur
"Signatur einer Methode" bezeichnet die Eindeutigkeit von Anzahl, Reihenfolge und Datentyp ihrer Parameter, sowie ihren Rückgabe-Typ
AnotherDemo()
und MyDemoFunction()
(oberes Listing) haben dieselbe Signatur. Obwohl alle Namen verschieden, ist die Abfolge der auftretenden Datentypen exakt identisch: String, Integer, Double
- also dieselbe Signatur.Hingegen
AnotherDemo2()
verwendet (fast) dieselben Namen wie AnotherDemo()
, hat aber dennoch eine annere Signatur, (schau genau! )Unterschiedliche Signaturen ermöglichen Überladung - gleiche Signaturen ermöglichen Events, denn eine Methode kann nur dann ein Event empfangen, wenn ihre Signatur auf die Event-Signatur passt.
Überladung
Eine Überladung ist einfach eine Methode (oder Property) mit demselben Namen, aber mit anderer Signatur.
Hier 2 weitere Überladungen von
AnotherDemo()
, welches nun also insgesamt 3-fach überladen ist:Event auslösen/feuern
Das geht nur innerhalb der Klasse, wo das Event deklariert ist. Schlüsselwort
RaiseEvent
. Einsteiger brauchen das erstmal nicht. Aber bei Interesse studiere dieses annähernd vollständige Tut: Alles über EventsEvent abonnieren/empfangen
bedeutet, mittm
AddHandler
-Schlüsselwort oder mitte Handles
-Klausel ein Objekt zu veranlassen, sein Event an eine bestimmte (geeignete) Methode zu senden. Dazu gibts inzwischen sogar Video: A ü E - Video-PostDatentyp (und Objekte)
'Datentyp' ist der Oberbegriff für alles, was in einer Deklaration mit dem
As
-Schlüsselwort bezeichnet werden kann. Es gibt 3 Grund-typen: Klasse, Struktur, InterfaceDer Datentyp sagt aus, was ein Objekt kann, etwa
Integer
kann man addieren, String
kann man verkettenEin Datentyp ist die Art des Objekts (quasi der Bauplan), er ist aber kein Objekt.
Ein Objekt entsteht erst, wenn man den Konstruktor (Sub New) des Datentyps aufruft - dann entsteht ein Objekt dieses Datentyps - und das kann was tun:
Ausdruck
Etwas, was einen Wert erzeugt. Ein Wert hat immer einen Datentyp
ZB ein atomarer Ausdruck ist
5
- das erzeugt den Wert 5
, Datentyp Integer
. Code verknüpft nun (Teil-)Ausdrücke miteinander, und bildet so neue Audrücke:
2 + 3
- erzeugt auch den Wert 5
, Integer
.Ausdrücke können Konstanten, Variablen, Schlüsselworte, Operatoren, Properties und Methoden enthalten, und können beliebig kompliziert werden:
2 + 3 - Math.Pow(Math.Sin(45 / 2), Application.StartupPath.Length)
- erzeugt einen Wert, den ich nicht weiß - aber der Datentyp ist Double
(das weiss ich, weil ich den Datentyp kenne, den die Function Math.Pow()
zurückgibt).Variable
Ein Dingens, dem man einen Ausdruck zuweisen kann, um den Wert zu speichern. Der Datentyp der Variable muss dem des Ausdrucks entsprechen, also zumindest kompatibel sein.
Konstruktor /
Sub New()
Klassen und Strukturen können Konstruktoren haben (auch mehrere Überladungen). Eine
Sub New()
wird ausgeführt, wenn mit dem Schlüsselwort New
ein neues Objekt des Datentyps erstellt wird.Objekt / Instanz / Objekt-Instanz und instanzieren / erstellen
Wie gesagt: ein Objekt erstellt man, indem man den Konstruktor eines Datentyps mit dem Schlüsselwort
New
aufruft. Diesen Ausdruck weist man meist einer Variablen dieses Datentyps zu.Das Objekt hat dann den Datentyp, und ist gewissermaßen in der Variable drinne.
Owner
Innerhalb eines Objektes können weitere Objekte enthalten sein - etwa in Variablen gespeichert. Das äussere Objekt dieser Verschachtelung ist der Owner, das innere könnte man als "Child-Objekt" bezeichnen. Der Owner hat nun über die Variable direkten Zugriff auf das Child-Objekt, aber das Child-Objekt hat keinen Zugriff auf den Owner - Beispiel:
VB.NET-Quellcode
- Public Class Car
- Private _MaxSpeed As Double = 180
- Public Property Speed As Double
- Public ReadOnly Property Motor As Motor ' Car "kennt" seinen Motor, aber Motor weiss nicht, in welchem Car es "eingebaut" ist
- Public Sub New()
- Motor = New Motor With {.Power = 100} ' Ein Motor mit mw. 100 KW wird initialisiert
- End Sub
- End Class
- Public Class Motor
- Public Property Power As Double
- '...
- End Class
(In Ausnahmefällen hat ein Child-Objekt doch Zugriff auf den Owner (zB
TreeNode.Parent
, Control.Parent
, ...), aber diese Fälle sind Ausnahmen mit besonderer, dafür vorgesehener Implementierung - normalerweise ist solch ein schlechtes Code-Design - zu enge Kopplung)Initialisierung
Die erste Zuweisung eines Wertes an eine Variable oder Property
Deklaration und Initialisierung geschieht praktischerweise (nicht zwingend) meist in derselben ZeileUninitialisierte Variablen der Grundtypen Interface und Class enthalten (logisch!) nichts -
Nothing
. Uninitialisierte Structure-Vars enthalten einen Default-Wert (etwa bei Integer: 0)Auflistung
Oberbegriff für Variablen, die mehrere Objekte enthalten können. Es gibt viele Auflistungs-Datentypen - mit je spezifischen zusätzlichen Eigenheiten:
Array
, TreenodeCollection
, IntegerCollection
, DataRowCollection
, List(Of T)
, Dictionary(Of TKey, TValue)
, BindingSource
, Stack(Of T)
, IEnumerable(Of T)
, IList(Of T)
, ...Array
Array ist die primitivste aller Auflistungen, aber auch die schnellste. Array-Objekte als solche gibt es gar nicht, denn ein Array hat immer auch einen Datentyp für seine Elemente. Es heisst also nicht "Array", sondern String-Array, oder Integer-Array, und notiert wird es mit angehängten Klammern:
String()
, Integer()
. Anfänger haben oft Schwierigkeiten, Arrays zu erkennen, und verwechseln sie leicht mit dem einzelnen Array-Element - aber ein Integer
ist kein Integer()
!!!Zumal es hier viele Möglichkeiten der Deklaration und Initialisierung gibt - Beispiele für
Integer()
:VB.NET-Quellcode
- Dim ints As Integer() ' uninitialisiert
- Dim ints() As Integer ' uninitialisiert
- Dim ints(3) As Integer ' initialisiert mit vier 0-en (Integer-Default)
- Dim ints() As Integer = New Integer() {0, 1, 2, 3} ' init mit Werten
- Dim ints As Integer() = {0, 1, 2, 3}
- Dim ints = New Integer() {0, 1, 2, 3}
- Dim ints = {0, 1, 2, 3} ' bei eingeschalteter Type-Inference erkennt der Compiler den Datentyp auch ohne ausdrückliche Angabe - einfach anhand der Initialisierung
Datensatz
Oft verarbeitet man Daten in Form von Datensätzen. Ein Datensatz ist einfach eine Zusammenfassung mehrerer verschiedener, zusammengehöriger Werte.
Hierfür erschafft man sich Datensatz-Klassen, also Klassen mit mehreren Variablen (oder Properties), für jeden Wert des Datensatzes eine Property, und die Properties haben natürlich verschiedene Datentypen.
Etwa eine
Person
-Klasse könnte die Werte Name As String
, und GeburtsTag As Date
aufweisen.Datenmodell
Eine Datensatz-Klasse kann als Wert-Datentyp natürlich auch andere Datensatz-Klassen enthalten (auch Listen davon).
Etwa eine
KarnevalsVerein
-Datensatz-Klasse könnte die Werte VereinName As String
und Mitglieder As List(Of Person)
aufweisen.So können beliebig komplexe, zusammenhängende DatensatzKlassen-Systeme entstehen, sowas ist dann ein Datenmodell.
Ein Datenmodell ist also ein System aus Datensatz-Klassen, und das modelliert tatsächlich etwas, also bildet es nach!
Genannte KarnevalsVerein-Klasse bildet ganz genau die Tatsache nach, dass in einem Karnevalsverein viele Personen sind. Und die
List(Of Person).Add/.Remove
-Methoden bilden sogar nach, einem KarnevalsVerein beizutreten oder ihn zu verlassen . Die Bedeutung des Begriffs "DatenModell" ist also ganz wörtlich zu verstehen, und ein Datenmodell stimmt entweder mit der Realität überein, oder es ist unbrauchbar.
Typisiertes Dataset und EntityFramework
Um mit Datenmodellen umzugehen, existieren zwei unterschiedliche Unterstützungs-Technologien - beide sehr mächtig: 1) typisiertes Dataset, 2) EntityFramework (EF).
Beide stellen Assistenten und Designer bereit, um auch sehr komplexe Datenmodelle zu gestalten, und generieren dann das entsprechende System von Datensatzklassen. Das Datensatzklassen-System besteht dann aus für Datenverarbeitung optimierten Klassen und Auflistungen, die vielerlei Standard-Funktionalität gleich mit eingebaut haben (laden, speichern, sortieren, filtern, Databinding, relationale Bezüge ...).
Aber man kann sein Datenmodell auch händisch selbst codieren, wenn man mit stark eingeschränkter Funktionalität auskommt.
Also im engeren Sinne des Begriffs "Datenmodell" gibt es 3 Arten: 1) typDataset 2) EF-Klassen 3) Eigenbau.
Interface
Ein Interface legt nur fest, dass ein Objekt eine bestimmte Methode (oder Property, oder Event) hat. Die Methode selbst ist nicht enthalten, sondern die muss in der Klasse ausprogrammiert sein, die das Interface implementiert. Interfaces entsprechen Verträgen, die eine Klasse einhalten muss, wenn sie das Interface implementiert.
Interfaces haben keinen Konstruktor, und das Schlüsselwort
New
ist nicht anwendbar.Interface-Datentypen erkennt man am
I
-Prefix, zb: IList(Of T)
implementieren
bedeutet im allgemeinen, Code zu schreiben, der Funktionalität bewirkt ("Funktionalität implementieren")
Speziell ein Interface implementieren bedeutet in einer Klasse die durchs Interface vorgeschriebenen Member auch tatsächlich auszuprogrammieren. Schlüsselwort:
Implements
Schlüsselworte
Interface
und Implements
bitte unbedingt nachlesen auf Vb.Net-SchlüsselWorte (Die Site ist englisch, aber die deutsche Entsprechung entblödet sich, auch die Schlüsselworte selbst zu verdeutschen).Lokal
Es gibt 3 Gültigkeits-Ebenen: Namespace-Ebene, Klassen-Ebene und Lokal-Ebene. Lokal bedeutet, dass der deklarierte CodeName nur innerhalb der Methode oder Property gilt. Genau genommen ist lokal sogar noch lokaler, nämlich es gilt nur innerhalb des direkt umgebenden Code-Blocks (entspricht den Einrückungen).
Typisches Schlüsselwort lokaler Deklarationen:
Dim
- paar Beispiele:VB.NET-Quellcode
- Private _ClassNumbs As Integer() = {-2, 0, 2, 5} ' klassen-Ebene
- Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click ' klassen-Ebene
- Dim numbs = {1, 2, 3, 4, 5, 6} ' numbs: methoden-lokal
- For Each numb In numbs ' numb: block-lokal - nur im ForEach
- Dim localFor = numb / 2 ' localFor: block-lokal - nur im ForEach
- MessageBox.Show(localFor.ToString())
- Next
- For i = 0 To numbs.Length - 1 ' i: block-lokal - nur im For
- MessageBox.Show(numbs(i).ToString())
- Next
- Dim index As Integer ' index: methoden-lokal
- For index = 0 To numbs.Length - 1
- If _ClassNumbs(index) > 2 Then Exit For
- Next
- MessageBox.Show(_ClassNumbs(index).ToString())
- End Sub
Gültigkeitsbereich / Scope
Die eigentlich simple Geschichte mit den 3 Gültigkeits-Ebenen verkompliziert sich erheblich durch Vererbung und weitere OOP-Features.
Nämlich zu den 3 Grund-Deklaratoren
Public
, Private
, Dim
treten weitere hinzu, wie: Friend, Shared, Protected, Overloades, Shadows, Overrides, MustOverride, NotInheritable - auf die ich alle nicht eingehe - ich wollte nur den Fachbegriff Gültigkeitsbereich / Scope kundtun .Modifizierer
In Vb sind Modifizierer die Schlüsselworte einer Deklaration, die vor dem Codenamen stehen. Im Gegensatz zum Datentyp, der ggfs. hinter dem Codenamen zu notieren ist.
Es gibt die Scope-Modifizierer:
Public, Protected, Private, Friend
, aber es gibt auch Modifizierer, die das Vererbungs-Verhalten steuern, wie: Overloads, Shadows, Overrides, Overridable, MustOverride, MustInherit, ...
, und es gibt noch Modifier mit noch anderen Aufgaben, wie: Async, Shared,...
Vollständige Liste der Vb.net-Modifier
Global
global zugreifbare Objekte gibt es eigentlich nicht. Einzig Namespaces können global sein, alles andere befindet sich innerhalb von Klassen, die sich wiederum innerhalb von Namespaces befinden. Meist wird "global" gesagt, wenn man eigentlich das Schlüsselwort
Public
meint.(Allerdings kann man ein Objekt
Public Shared
deklarieren, dann ist es immerhin global zugreifbar, indem man seinen vollständigen Namen addressiert (Aber wer solche Feinheiten kennt, der braucht nicht dieses Tut ))Einbinden
Code kann man nicht einbinden. Einbinden kann man nur Dateien. Auf Projekt-Ebene kann man alle möglichen Dateien einbinden, auch - ja - Code-Dateien.
Auf Solution-Ebene kann man Projekte einbinden (proj-Dateien)
Bibliotheken kann man auch nicht einbinden (ausser sie liegen als Datei vor) - auf Bibliotheken tut man verweisen, um sie zu nutzen.
Auch auf eingebundene Projekte muss man verweisen, denn das Zusammenbinden mehrerer Projekte in einer Solution allein bewirkt noch keine Interaktion der Projekte untereinander.
Verweise tut man setzen, nicht einbinden.
Dank auch an @Trade und @ThePlexian
Dieser Beitrag wurde bereits 70 mal editiert, zuletzt von „ErfinderDesRades“ ()