Coden in C#

Hi,
ich möchte eine simple KonsolenAnwendung Coden.
StartMenue (1,2,3)

  1. einen string hinzufügen
  2. liste ansehen
  3. Exit

relativ einfach.
do-while-schleife, dann theoretisch 3 Methoden + (weitere Methoden(vlt Textausgaben etc.) in der „hinzufügen()“ Methode).

theoretisch simple, alle Methoden in die Main klasse klatschen. aber ich will es „perfekt“ machen. wenn es möglich ist.

Vlt in mehreren Klassen unterteilen? Redundanzen vermeiden bei Korrekturen, Anpassungen, oder eventuellen Erweiterungen im nachhinein.

List <-string-> liste;
und
boolean zustand z=true; (für die do-while-schleife, um sie später noch zu verlassen).

Hallo!

Und hast du dazu auch ne Frage?

Ich würde sagen, dein Projekt ist gradezu winzig, daher würde ich das nicht künstlich durch Aufteilung in Klassen aufblähen. Wobei das auch davon abhängt, was du eigentlich zukünftig mit dem Code vor hast.

Ansonsten: Zeig einfach mal deinen Code. Das sieht ja sehr nach Einstieg ins Programmieren aus, da hast du sicher noch ganz andere Dinge im Code, die man optimieren kann. Dafür hilft es ungemein, wenn andere mal drüber schauen.

hier mal reinschnuppern?

https://duckduckgo.com/?q=c%23+gui+für+console+ncurses&t=newext&atb=v305-1&ia=web

http://sushihangover.github.io/cursessharp-c-number-ncurses-updated/

ja, gerne zeige ich den code, gleich sobald ich daheim bin. Ich habe dieses Beispiel mit Absicht so simple gehalten.
später möchte ich es erweitern, in dem ich string lösche. und noch vieles mehr. aber mir ist es wichtig, sinnvoll zu coden.
eine Konsolen Anwendung welche eine Datenbank an Säugetieren anlegt, löscht oder bearbeitet etc. . zunächst einmal egal, ohne Serialisierung.

dafür nehme ich einen eine Do-While-Schleife, ->startet hauptBildschirm(), dort mit if-else auf meine 3 Punkte(liste ansehen(), string in meine listeHinzufügen() und Exit() ) zugreifen.
Klar wird dieser testProjekt später keine flugzeuge durch reifen fliegen lassen, aber datenbank mit konsolenAnwendung sollte… mutierbar sein.

was würdest du anders machen?

ich verstehe nicht was genau du mit den links meinst? diese driften doch einwenig ab von meinem vorhaben?

using System;
using System.Collections.Generic;
using System.IO;
using System.Xml.Serialization;

namespace Faenger
{
class Program
{
static List bummel=new List();

    static void Main(string[] args)
    {
  
        intro();
        menue();
    }
    public static void intro()
    {

        Console.Clear();
        Console.WriteLine("mein magisches Programm!" +
            "\nbesser als alles andere in der welt" +
            "\n\n\nversion 1.1");
    }
    public static void menue() {
        
        intro();
        Console.WriteLine("\n\n`+`: Notiz hinzugügen" +
            "\n\n`Enter`: Liste ansehen" +
            "\n\n´Escape´: Abbruch\n\n`-`: Liste Leeren");
        ConsoleKeyInfo a = Console.ReadKey();
        if (a.Key.ToString() == "OemPlus") { add(); }
        if (a.Key.ToString() == "OemMinus") { löschen(); }
        if (a.Key.ToString() == "Enter") { ansicht(); }
        if (a.Key.ToString() == "Escape") { exit(); }

        else menue();
    }
    public static void add()
    {
        intro();
        Console.WriteLine("\nHier bitte text eingeben\n\n\n");
        String a= Console.ReadLine();
        bummel.Add(a);

        if (a != ("")&&(a!="exit")) { add(); }

        else { menue(); }
    }
    public static void exit()
    {
        Console.Clear();
        Console.WriteLine("tschüssssssss"); 
        Console.ReadKey();
        Environment.Exit(0);
        menue();
    }
    public static void löschen()
    {
        Console.Clear();
        intro();
        Console.WriteLine("gelöscht");
        bummel.Clear();
        Console.ReadKey();
        menue();
    }
    public static void ansicht()
    {
        intro();
        foreach (string element in bummel) 
        { 
        Console.WriteLine($"{element} ");
        }
        Console.ReadKey();
        menue();
    }
}

}

Ich kenne das so, dass man Menüs üblicherweise mit switch-case macht, nicht mit Verzweigungen. Es „verzweigt“ sich ja auch nichts richtig.

Ich weiß auch nicht, was du genau mit „Datenbank“ meinst, aber mir sind keine Fälle außerhalb der Schule bekannt, bei denen man eine (richtige) Datenbankanbindung mittels Konsole realisiert.

tschüss schreibt sich nur mit Doppel-s. :stuck_out_tongue: Und ja, es hat nichts mit Programmierung zu tun, aber trotzdem solltest du darauf achten, keine Rechtschreibfehler bei deinen Ausgaben zu haben.
„Welt“ schreibt sich groß, „leeren“ dafür klein, und bei „hinzufügen“ hast du dich einfach vertippt.

abgesehen von deiner switch Analyse, ist der Rest nicht weiterbringend. Es geht hier auch nicht um Rechtschreibung. XML…und Datenbanken etc? Mir geht es darum, dass ich, wenn ich was größeres beginne, richtig starten kann, also einfache Fehler vermeiden kann. hat es Konsequenzen wenn ich alles (Methoden) in eine klasse schreibe (für den von mir genannten Horizont)?

und ja, meine Konsolen Anwendung ist natürlich quatsch.

Hi!

Du hast mehrere Konstruktionen wie

public static void add(){
    ...
    menue();
}

In dem Moment, in dem hier menue() aufgerufen wird, bleibt die Funktion add() stehen, und wartet darauf, dass menue() fertig wird. Allerdings ruft menue() dann z.B. auch add() erneut auf, und wartet drauf, dass dieses fertig wird.
Grundsätzlich kann eine Funktion auch z.B. sich selbst aufrufen, oder eine andere bereits laufende Funktion. Dabei wird dann sozusagen eine neue Kopie der Funktion aufgerufen. Das nennt sich „rekursiver Aufruf“. Aber da du so eine wartende Funktion nach der anderen erzeugst, füllst du dir den Speicher - und manche Programmiersprache hat auch ein Limit für die Anzahl der rekursiven Aufrufe.

In deiner menue()-Funktion sollte eine while-Schleife laufen, die je nach Benutzereingabe die ein oder andere Funktion aufruft. Diese wiederum sollte nach Abschluss ihrer Tätigkeit nicht wieder menue() aufrufen, sondern nichts tun - das Programm kehrt dann automatisch zum wartenden menue() zurück.

Zu deiner eigentlichen Frage:

Man kann das ganze in z.B. zwei Klassen aufteilen: Eine für den ganzen Kommandozeilenkram, und eine, die die Daten verwaltet. Denn nächste Woche willst du kein Kommandozeilenprogramm mehr, sondern ein Programm mit ner schönen GUI, oder eins, das über das Netzwerk gesteuert wird. Dann brauchst du jeweils neue Klassen genau dafür, aber nicht für das eigentliche Verwalten deiner Liste.

Deine Liste andererseits… könnte nun ja auch Methoden zum Speichern und Laden gebrauchen, ggf. willst du auch prüfen, ob ein Eintrag schon vorhanden ist, und so weiter. Wie das im Detail geht, damit sollte die Kommandozeilen-/GUI-/Netzwerkklasse nichts zu tun haben, sie sollte nur die Methoden aufrufen.

1 Like

joa, damit kann ich sehr viel anfangen. Prima, aber die gui(Grafisch) oder Netzwerk ist momentan nicht von interesse für mich.
Deine anmerkung zu menue() und add() verstehe ich, werde das mit do-while handeln. switch case anstatt mit ifElse machen.
Speichern , laden etc sind auch anvisiert, ja.
das mit den 2 klassen habe ich aber noch nicht ganz verstanden. wieso und wie?
danke!

Nun, eine Klasse ist eine Sammlung von Funktionen und Variablen, die thematisch zusammengehören. Ein Thema bei dir ist das Kommandozeileninterface, das Verwalten der Liste ein anderes. Das meine ich ja mit GUI. Wenn du eine machst, kannst du die Klasse zur Verwaltung der Liste einfach einbinden.

Ich meine, du hast ja gefragt, und so eine Aufteilung wäre eine Idee.

1 Like

Der Hinweis mit der Aufteilung hat langfristig Sinn, wenn man das Programm (öfter) erweitern oder ändern muss: dann hat man im Idealfall nur eine Stelle zum verändern. Und bei „static List bummel=new List();“ scheinen spitze Klammern mit passendem Datentyp zu fehlen…

Dieses Thema wurde automatisch 30 Tage nach der letzten Antwort geschlossen. Es sind keine neuen Nachrichten mehr erlaubt.