Laden...

Programmidee: "Bundesligatabellenersteller" - Fragen zur Umsetzung

Erstellt von Machiavelli vor 9 Jahren Letzter Beitrag vor 9 Jahren 4.067 Views
Thema geschlossen
M
Machiavelli Themenstarter:in
2 Beiträge seit 2014
vor 9 Jahren
Programmidee: "Bundesligatabellenersteller" - Fragen zur Umsetzung

Hallo,
ich beschäftige mich seit kurzer Zeit mit C#, habe aber durchaus Kenntnisse in anderen Sprachen. Da ich seit längerer Zeit nichts mehr programmiert habe, will ich jetzt das Programmieren wieder "neu" erlernen. Das ursprüngliche Problem bei mir war, dass ich die Lust nach einer Zeit verloren habe. Und die Lust habe ich verloren, da ich
[1] die falsche Programmiersprache gewählt habe
[2] die falsche Programmrichtung gewählt habe
Nach längerem Recherchieren im Internet habe ich festgestellt, dass sich C# gut eignet für Game Development. Ich hoffe, dies entspricht der Wahrheit.

Nun zu meinen Problem. Ich habe mir vorgenommen ein Programm zu erstellen, welches es möglich macht, Bundesligatabellen zu erstellen und diese dann noch ggf. ändern zu können. Um es mir nicht noch schwerer zu machen, möchte ich nicht, dass das Programm Tabellen abspeichern kann, das könnte ich später noch machen. Mir geht es schließlich darum, dass ich den Syntax dieser Sprache vertiefe und verstehe.

Dieses Programm basiert auf eine Konsolenanwendung, bin aber gerne frei, es später auch auf Windows Forms auszuprobieren.

Zur Repräsentation von einer Tabelle hätte ich mir das in etwa so vorgestellt:

Es gibt ein Feld des Typs VEREIN. Dieses Feld speichert alles Bundesligavereine. Die Klasse VEREIN dagegen speichert alle relevanten Daten, wie z.B. Platz, Name, Anzahl_Tore, Anzahl Punkte, etc. - mehr dazu siehe im UML-Klassendiagramm. Mit Hilfe einer For-Schleife durchlaufe ich alle Elemente des Feldes und gebe alle Informationen aus, die ich brauche.

Ale Menüpunkte hätte ich mir vorgestellt:

[0] Tabelle ansehen
[1] Tabelle hinzufuegen
[2] Tabelle ändern
[3] Programm schließen

Der Benutzer sollte in der Lage sein, die jeweilige Option per Input einzugeben und somit entscheiden, welche Option er haben möchte. Es sein angemerkt, dass er die Tabelle nur ansehen kann, wenn eine Tabelle besteht!

Mein "Ideen-Diagramm" würde so aussehen:

Datei angehängt!

Wenn Ihr die Idee total überzogen findet für einen ziemlichen Anfanger, lasst es mich wissen! Wie findet Ihr die Umsetzung, würde mich um Feedback freuen!

Danke.
Machiavelli

2.223 Beiträge seit 2005
vor 9 Jahren

Hallo Machiavelli und herzlich willkommen hier im Forum,

Wie es auf den ersten blick scheint, sollte das ganze sich sehr leicht entwicklen lassen, jedoch würde ich an deiner stelle die speichern Funktion ebenfalls implementieren. Zur not kannst ja auch eine CSV oder XML Datei zum speichern nehmen, das macht ganze nicht unbedingt komplizierter.

Viele Grüße
Lars

M
Machiavelli Themenstarter:in
2 Beiträge seit 2014
vor 9 Jahren

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Bundesliga
{
    class Program
    {
        static void Main(string[] args)
        {
            String[] Menue = new String[4] { "Tabelle ansehen", "Tabelle hinzufuegen", "Tabelle aendern", "Programm schließen" };
            VEREIN [] vereine = new VEREIN[18];
            String Eingabe;

        outside:
            Console.WriteLine("Hier gehts weiter");

            for (int i = 0; i < 4; i++)
            {
                Console.WriteLine("[{0}] {1}", i, Menue[i]);
            }

            Console.WriteLine("Bitte geben sie eine Option ein:");
            Eingabe = Console.ReadLine();

            if (Eingabe == "0") //Falls "Tabelle ansehen" gewählt wurde
            {
                for (int i = 0; i < 18; i++)
                {
                    Console.WriteLine("Platz: {0} {1} {2} Siege: {3} Niederlage: {4} Unentschieden: {5} TD: {6} Punkte: {7}", i + 1, vereine[i].gibName(), vereine[i].gibAnzahlSpiele(), vereine[i].gibAnzahlSiege(),
                        vereine[i].gibAnzahlNiederlage(), vereine[i].gibAnzahlUnentschieden(), vereine[i].gibTordifferenz(), vereine[i].gibAnzahlPunkte());
                }
                Console.ReadKey();

            }

            else if (Eingabe == "1") //falls "Tabelle hinzufuegen gewählt wurde
            {
                for (int i = 0; i < 18; i++)
                {
                    Console.WriteLine("Bitte geben Sie folgende Infos für Platz {0} ein: Name des Vereins, Anzahl an Spiele, Anzahl Siege, etc.", i + 1);
                    Console.WriteLine("Bitte geben sie den Namen des Vereins an:");
                    String name = Console.ReadLine();
                    Console.WriteLine("Bitte geben sie die Anzahl an Spielen an, die der Verein bereits absolviert hat, ein.");
                    int anzahl_Spiele = Convert.ToInt16(Console.ReadLine());
                    Console.WriteLine("Geben sie die Anzahl an Siegen an, die das Team hat.");
                    int anzahl_Siege = Convert.ToInt16(Console.ReadLine());
                    Console.WriteLine("Bitte geben Sie nun die Anzahl der Unentschieden ein.");
                    int anzahl_Unentschieden = Convert.ToInt16(Console.ReadLine());
                    Console.WriteLine("Bitte geben Sie die Anzahl an Niederlagen ein.");
                    int anzahl_Niederlagen = Convert.ToInt16(Console.ReadLine());
                    Console.WriteLine("Geben Sie nun die Anzahl an Toren ein, die das Team geschossen hat");
                    int anzahl_Tore = Convert.ToInt16(Console.ReadLine());
                    Console.WriteLine("Geben sie nun die Tordifferenz ein.");
                    int tordifferenz = Convert.ToInt16(Console.ReadLine());
                    Console.WriteLine("Geben Sie nun die Punkte Ihres Teams ein");
                    int anzahl_Punkte = Convert.ToInt16(Console.ReadLine());
                    vereine[i] = new VEREIN(i + 1, name, anzahl_Spiele, anzahl_Siege, anzahl_Unentschieden, anzahl_Niederlagen, anzahl_Tore, tordifferenz, anzahl_Punkte);
                }
                goto outside;

            }
            else if (Eingabe == "2") //falls Tabbelle aendern gewählt wurde
            {
           
            }
            else { Environment.Exit(0); } //Programm schließen
        }

    } 

}


public class VEREIN
{
    private int Platz;
    private String Name;
    private int Spiele;
    private int Siege;
    private int Unentschieden;
    private int Niederlagen;
    private int Tore;
    private int Tordifferenz;
    private int Punkte;

    public VEREIN(int PL, String n, int SP, int SG, int UN, int NI, int TO, int TD, int PU)
    {
        Platz = PL;
        Name = n;
        Spiele = SP;
        Siege = SG;
        Unentschieden = UN;
        Niederlagen = NI;
        Tore = TO;
        Tordifferenz = TD;
        Punkte = PU;
    }

    public int gibPlatz() { return Platz; }
    public String gibName() { return Name; }
    public int gibAnzahlSpiele() { return Spiele; }
    public int gibAnzahlSiege() { return Siege; }
    public int gibAnzahlUnentschieden() { return Unentschieden; }
    public int gibAnzahlNiederlage() { return Niederlagen; }
    public int gibAnzahlTore() { return Tore; }
    public int gibTordifferenz() { return Tordifferenz; }
    public int gibAnzahlPunkte() { return Punkte; }
}

So hätte ich mir das ungefähr vorgstellt. Der Code ist noch nicht ganz fertig, würde diesen aber schon mal zur "Besichtigung" freigeben. Gibt es Verbesserungsvorschläge?

2.223 Beiträge seit 2005
vor 9 Jahren

das sieht aber sehr unübersichtlich aus, versuche doch einmal das ganze ein wenig mehr in verschiedenen schichten aufzutrennen.

Auch aufgrund, deiner möglichen Weiterentwicklung in Richtung einer Windows Forms GUI würde eine auftrennung in verschiedenen Schichten sinn ergeben.
Wenn du jetzt nicht an die Trennung denkst, würdest du das komplette Programm noch einmal erneut entwickeln, sobald du deine GUI in Windows Forms umsetzt möchtest.

Versuche doch einmal dein Programm in die drei typischen Bereiche aufzuteilen

  • Datenzugriff ... auch wenn aktuell noch keine Speicherung stattfindet
  • Businesslogik ... die reine Logik deines Programms
  • View ... deinen jeweilige Schnittstelle zum Benutzer des Programms

Für jede Schicht hast Du mindestens eine Klasse und die Main Methode würde das ganze eigentlich nur starten.

Zusätzlich finde ich das ganze auch ein wenig zu statisch
Ich weiß, dass sich dies jetzt ein wenig kreiert anhört, aber stell dir mal vor
in der Bundesliga dürften Plötzlich 20 statt 18 Vereine dran teilnehmen
oder Du möchtest die Menüpunkt Speichern und Laden einführen.

An wie vielen stellen müsstest du bei diesen eigentlich recht kleinen Änderungen deinen Code ändern.

UND ZUGUTERLETZT BITTE KEIN GOTO BENUTZEN, da dies nicht gerade die Lesbarkeit des Codes verbessert

Viele Grüße
Lars

849 Beiträge seit 2006
vor 9 Jahren

Hallo, du solltest die auch die Standart schreibweisen von c# aneignen.

  
  
private int Platz;  
  
 public int gibPlatz() { return Platz; }  
  
  

sollte dann eher so aussehen:



private int _platz;

public int Platz {get{return _platz;}}


oder kurz:



public int Platz {get;set;}


wobei du im letzteren fall auch das schreiben zulässt.

C
1.214 Beiträge seit 2006
vor 9 Jahren

Naja, besonders viel Code ist es nicht, also kann man auch nicht so besonders viel dazu sagen. Ich kann dir schon mal Punkte nennen, die mir auf den ersten Blick nicht gefallen:

  • Deine Namensgebung ist nicht standardkonform und sehr ungewohnt. Es gibt gewisse Coding Rules, an die sich die meisten halten. In C# ist Pascal Case üblich, die ersten Buchstaben eines Wortes werden also groß geschrieben, die anderen klein, z.B. Verein oder VereinsTabelle. Parameternamen werden üblicherweise klein geschrieben. Private Variablen könnte man mit einem Unterstrich beginnen.

  • Das ist jetzt mehr oder weniger Geschmackssache, aber ich mag deutsche Bezeichner überhaupt nicht. Wenn du das komplett durchziehst, z.B. "gibPlatz" statt "getPlatz", ist es zwar etwas konsequenter, schaut aber zumindest sehr komisch aus und wird bei längeren Funktionsnamen noch seltsamer, wo man das auf Englisch viel eleganter ausdrücken könnte. Und dann wird es immer inkonsistent sein, weil alle Bibliotheken englische Bezeichner verwenden. Was auch gut ist, weil ich glaub, mit einer Bibliothek, die tschechische oder norwegische Bezeichner verwendet, würdest du auch selber keinen Spass haben. Und die allermeisten deiner möglichen Kollegen werden sowieso Englisch programmieren. Der einzige Grund, mal deutsche Bezeichner zu verwenden ist, wenn man ein domänenspezifisches Programm für einen Kunden schreibt und nur Probleme damit hätte, die ganzen Fachbegriffe sinnvoll zu übersetzen und dann damit zurechtzukommen. Sonst würde ich mir deutsche Bezeichner erst gar nicht angewöhnen.

  • goto ist verpönt, fast schon eine Todsünde.

  • Verwende sinnvolle Parameternamen. Die Parameterliste ist die Schnittstelle deiner Klassen. Was soll sich jemand denken, der die Implementierung nicht sieht, nur einen Parameternamen "UN" oder "NI"?

  • Ich finde, da sieht man ganz gut, dass Konsolenanwendungen für sowas nicht wirklich geeignet sind. Das macht weder beim Programmieren, noch beim Benutzen Spass. Ich würd eher gleich auf Winforms oder WPF umsteigen.

B
112 Beiträge seit 2008
vor 9 Jahren

Neben den schon gegebenen Ratschlägen würde ich auch schon im jetzigen Zustand des Programms wenigstens die Punkte und den Tabellenplatz ausrechnen lassen, wozu ist der Rechenknecht denn da?

Richtig schön wird es m.E. allerdings erst, wenn Du die Spielergebnisse eingeben kannst und den Rest macht der Computer. Das geht natürlich keinesfalls ohne Speicherung, XML oder CSV sollte es für den Anfang aber tun.

Und in einem späteren Ausbauzustand möchtest Du dem DFB das Haus anzünden wegen dieser ekligen Punktabzüge, wenn sich ein Verein daneben benommen hat.

16.833 Beiträge seit 2008
vor 9 Jahren

Ich hab mir das jetzt überlegt und mal andere, ähnliche Threads gesucht und die wurden alle geschlossen. Also schließe ich den Thread - in Absprache auch mit einem anderen Mod - ebenso.
Das hier ist eine Mischung aus absoluten Grundlagen der Programmierung bzw. OOP und Code Review - beides hier nicht erwünscht [Hinweis] Wie poste ich richtig? 1.1.1 und 4.*

Eigentlich hat der ganze Code nichts mit guter C# Programmierung zutun. Weder das OOP (und vor allem kein goto!) noch mit den üblichen C# Regeln, wie der Benennung von Klassen und Methoden.
Aus den ganzen Punkten heraus schließ ich den Thread auch mit der Bitte, dass Du Dich an die Grundlagen von C# ran machst und auch den Stil von OOP lernst.
Weil so drauf los ohne wirklich eine moderne Hochsprache zu können bringt das ganze nichts und der Thread wird wahrscheinlich endlos weiter gehen.

Hilfe für den Einstieg: [FAQ] Wie finde ich den Einstieg in C#?

Thema geschlossen