Ich habe mehrere Fragen zu gutem Stil bei (objektorientierter) Programmierung anhand des u.g. Beispielprogramms in C#.
Ich habe mir ein Konsolenprogramm (ich bin noch relativ unerfahren) in C# geschrieben, bei dem diese Fragen aufgetaucht sind. Die beiden Klassen Program.cs und Farzeug.cs stehen ganz unten im Post. Dieses Programm erzeugt ein neues Objekt "MeinAuto" der Klasse Fahrzeug und man kann dann noch die Farbe angeben, in der MeinAuto lackiert werden soll.
Konkretes zu meinen Fragen:
1) Bevor das Fahrzeug lackiert werden kann, soll überprüft werden, ob die vom User angegebene Farbe überhaupt verfügbar ist. Wenn sie nicht verfügbar ist, soll der User darüber informiert werden und erneut aufgefordert werden, eine Farbe anzugeben. Ich habe dafür die Methode "FarbeÜberprüfen" geschrieben. Ist das vernünftig oder sollte die Überprüfung innerhalb der Methode "Lackieren" gehandhabt werden?
Ist das vernünftig, zur Überprüfung die boolean-Variable "farbeverfügbar" zu benutzen oder sollte ich möglichst eine eigene Exception schreiben? Wenn ja, wo im Programm soll ich try-catch benutzen? Ich hatte mal in einem anderen Programm gedacht, es sei das Beste, eine Exception im Setter der int-Variable "Anzahl" abzufangen, weil die Exception dann abgefangen wird, egal an welcher Stelle im Programm die Variable gesetzt wird. Allerdings wurde die Exception schon geworfen, als ich im Programm die Variable "Anzahl" = Convert.ToInt32(Console.ReadLine()) setzen wollte - was ich übrigens nicht ganz verstehe, weil ich dachte, dass Variablen, die einen setter haben, immer erst im setter gesetzt werden. Daher bin ich davon ausgegangen, dass wenn ich den setter mit einem try-catch-Block umschließe, jede entsprechende Exception, die beim setzen dieser Variable geworfen wird, gefangen wird. Ist allerdings anscheinend nicht der Fall. Kann mir das jemand erklären bitte?
2) Tjo, eigentlich ziemlich grundlegend, aber ich finde ums verrecken nix dazu. In der Methode FarbeÜberprüfen wäre es doch gut, wenn ich true zurückgeben könnte und diese Ausgabe von der Funktion Lackieren() entgegengenommen würde, wenn die Farbe verfügbar ist anstatt die Hilfsvariable farbeverfügbar und break; zu verwenden, oder? Wie geht das?
3) Bei einer Liste kann man ja mit Liste.TrueForAll oder so ähnlich prüfen, ob ein Element dazugehört, oder? Gibt es so eine Funktion nicht für Arrays? Weil an Arrays mag ich in C#, dass man die zugehörigen Elemente direkt beim deklarieren der Array-Variable setzen kann. Will ja mein Programm nicht mit unzähligen Liste.Add(bla) vollschreiben müssen.
4) Ich habe die Variable "angegebeneFarbe" in der Methode deklariert, in der sie verwendet wird. Sollte man das tun oder sollte man sämtliche Variablen immer am Anfang einer Klasse deklarieren?
Program.cs
Fahrzeug.cs
Edit: Syntax Hightlighting ist hier im Forum nicht möglich?
- Wie überprüft man Variablen vernünftig auf Korrektheit?
- Wie benutzt man den Rückgabewert einer Funktion?
- Wie überprüft man bei einem Array am elegantesten, ob ein bestimmter Wert enthalten ist?
- Was ist der richtige Ort für Variablendeklarationen und Methoden?
- Kann man die Lesbarkeit und Wartbarkeit des u.g. Programms verbessern?
- Hat jemand einen Link zu einem Kompendium zu gutem Programmierstil o.ä.?
Ich habe mir ein Konsolenprogramm (ich bin noch relativ unerfahren) in C# geschrieben, bei dem diese Fragen aufgetaucht sind. Die beiden Klassen Program.cs und Farzeug.cs stehen ganz unten im Post. Dieses Programm erzeugt ein neues Objekt "MeinAuto" der Klasse Fahrzeug und man kann dann noch die Farbe angeben, in der MeinAuto lackiert werden soll.
Konkretes zu meinen Fragen:
1) Bevor das Fahrzeug lackiert werden kann, soll überprüft werden, ob die vom User angegebene Farbe überhaupt verfügbar ist. Wenn sie nicht verfügbar ist, soll der User darüber informiert werden und erneut aufgefordert werden, eine Farbe anzugeben. Ich habe dafür die Methode "FarbeÜberprüfen" geschrieben. Ist das vernünftig oder sollte die Überprüfung innerhalb der Methode "Lackieren" gehandhabt werden?
Ist das vernünftig, zur Überprüfung die boolean-Variable "farbeverfügbar" zu benutzen oder sollte ich möglichst eine eigene Exception schreiben? Wenn ja, wo im Programm soll ich try-catch benutzen? Ich hatte mal in einem anderen Programm gedacht, es sei das Beste, eine Exception im Setter der int-Variable "Anzahl" abzufangen, weil die Exception dann abgefangen wird, egal an welcher Stelle im Programm die Variable gesetzt wird. Allerdings wurde die Exception schon geworfen, als ich im Programm die Variable "Anzahl" = Convert.ToInt32(Console.ReadLine()) setzen wollte - was ich übrigens nicht ganz verstehe, weil ich dachte, dass Variablen, die einen setter haben, immer erst im setter gesetzt werden. Daher bin ich davon ausgegangen, dass wenn ich den setter mit einem try-catch-Block umschließe, jede entsprechende Exception, die beim setzen dieser Variable geworfen wird, gefangen wird. Ist allerdings anscheinend nicht der Fall. Kann mir das jemand erklären bitte?
2) Tjo, eigentlich ziemlich grundlegend, aber ich finde ums verrecken nix dazu. In der Methode FarbeÜberprüfen wäre es doch gut, wenn ich true zurückgeben könnte und diese Ausgabe von der Funktion Lackieren() entgegengenommen würde, wenn die Farbe verfügbar ist anstatt die Hilfsvariable farbeverfügbar und break; zu verwenden, oder? Wie geht das?
3) Bei einer Liste kann man ja mit Liste.TrueForAll oder so ähnlich prüfen, ob ein Element dazugehört, oder? Gibt es so eine Funktion nicht für Arrays? Weil an Arrays mag ich in C#, dass man die zugehörigen Elemente direkt beim deklarieren der Array-Variable setzen kann. Will ja mein Programm nicht mit unzähligen Liste.Add(bla) vollschreiben müssen.
4) Ich habe die Variable "angegebeneFarbe" in der Methode deklariert, in der sie verwendet wird. Sollte man das tun oder sollte man sämtliche Variablen immer am Anfang einer Klasse deklarieren?
Program.cs
Code:
using System;
namespace Fahrzeuge
{
class Program
{
static void Main(string[] args)
{
Fahrzeug MeinAuto = new Fahrzeug("Toyota Auris", 4);
Console.WriteLine("Mein Auto ist ein {0} und hat {1} Räder.", MeinAuto.Modell, MeinAuto.RäderAnzahl);
MeinAuto.Lackieren();
Console.WriteLine("{0} ist jetzt {1} lackiert", MeinAuto.Modell, MeinAuto.Farbe);
Console.WriteLine("Zum Beenden Taste drücken.");
Console.ReadKey();
}
}
}
Fahrzeug.cs
Code:
using System;
namespace Fahrzeuge
{
class Fahrzeug
{
public string Farbe;
private bool farbeverfügbar = false;
public string Modell { get; protected set; }
public int RäderAnzahl { get; protected set; }
public Fahrzeug(string modell, int räderAnzahl)
{
Modell = modell;
RäderAnzahl = räderAnzahl;
}
public void Lackieren()
{
string angegebeneFarbe;
Console.WriteLine("In welcher Farbe soll der {0} lackiert werden?", this.Modell);
angegebeneFarbe = Console.ReadLine();
FarbeÜberprüfen(angegebeneFarbe);
if (farbeverfügbar == true)
{
this.Farbe = angegebeneFarbe;
}
else
{
Console.WriteLine("Farbe nicht verfügbar. Bitte eine andere Farbe wählen");
Lackieren();
}
}
private void FarbeÜberprüfen(string angegebeneFarbe)
{
string[] möglicheFarben = /* optional: new string[5] */ { "blau", "gelb", "grün", "rot", "schwarz" };
for (int i = 0; i <= 4; i++)
{
if (angegebeneFarbe == möglicheFarben[i])
{
Farbe = möglicheFarben[i];
farbeverfügbar = true;
break;
//return true;
}
else
{
farbeverfügbar = false;
//return false;
}
}
}
}
}
Edit: Syntax Hightlighting ist hier im Forum nicht möglich?