AppRunner

    • Release
    • Open Source

    Es gibt 3 Antworten in diesem Thema. Der letzte Beitrag () ist von siycah.

      Name:
      AppRunner

      Beschreibung:
      In meiner Freizeit widme ich mich intensiv dem Flugsimulator. Ein kleines Hindernis dabei ist jedoch, dass neben dem Simulator selbst auch noch weitere Programme gestartet werden müssen. Dies nimmt nicht nur Zeit in Anspruch, sondern kann auch als umständlich empfunden werden. Daher kam mir die Idee, ein vielseitiges Programm namens AppRunner zu entwickeln, das genau dieses Problem löst.

      Mit AppRunner können beliebig viele Profile erstellt werden. Jedes Profil ermöglicht die Zuweisung spezifischer Programme, die dann mit nur einem Klick automatisch gestartet werden. Dies vereinfacht nicht nur den Prozess erheblich, sondern spart auch wertvolle Zeit, die nun effizienter für das eigentliche Flugerlebnis genutzt werden kann. Das Besondere an AppRunner ist, dass es nicht auf Flugsimulation beschränkt ist – es kann auch für andere Zwecke genutzt werden. Egal, ob es um den Start von Anwendungen für Fotobearbeitung, Videoerstellung oder andere Tätigkeiten geht, AppRunner bietet eine flexible Lösung, um den Start mehrerer Programme mit nur einem Klick zu ermöglichen.

      Screenshot(s):


      Verwendete Programmiersprache(n) und IDE(s):
      C# - Visual Studio 2022 Enterprise

      Systemanforderungen:
      .Net Framework 4.8

      Systemveränderungen:
      Keine

      Download(s):
      Releases · Andy16823/AppRunner (github.com)

      Lizenz/Weitergabe:
      OpenSource (MIT)
      https://github.com/Andy16823/AppRunner​
      Meine Projekte Genesis Game Engine | GFX | smartli.me - Der smarte URL shortener

      Moin Andy,

      Auch wenn das Tool für mich persönlich keinen Nutzen hat, habe ich mir mal den Quellcode angeschaut und wollte gerne etwas Feedback geben.

      Das Repo:
      Mir ist bei deinen Repos aufgefallen, dass du häufig (überwiegend) die Repos zumüllst, mit Binärschrott, der da eigentlich nicht reingehört.
      Du kannst in dem Repo ein .gitignore-File anlegen und darüber Dateien und Ordner aus dem Repo ausschließen. Die werden dann nicht mitversioniert.
      Macht das Repo online übersichtlicher und verringert die Größe des Repos beim Klonen.

      Deine .gitignore-Datei müsste so ungefähr aussehen:

      Quellcode

      1. packages/
      2. AppRunner/bin
      3. AppRunnter/obj


      Du kannst natürlich auch pro Unterordner ein .gitignore erstellen, das ist alles Geschmackssache.

      Code Stil:
      Ich mache hiermit wahrscheinlich ein Fass auf, wo mir sicherlich einige Leute sagen werden, dass ich falsch liege. Deshalb: das ist meine persönliche Meinung.
      Jeder hat seinen eigenen Code-Stil. Ich möchte es dir nur auf den Weg geben, weil die Erfahrung gezeigt hat, dass diese Tipps doch hilfreich sind.


      1. Weniger Verschachtelungen

      Spoiler anzeigen

      Wenn du den Zustand eines Objekts oder einer Variable prüfst, aber nichts machst, wenn diese Bedingung nicht zutrifft, invertiere das if.
      Aus:

      C#-Quellcode

      1. private void toolStripButton3_Click(object sender, EventArgs e)
      2. {
      3. Profile profile = this.Profiles[comboBox1.SelectedIndex];
      4. if (profile != null)
      5. {
      6. if (this.listView1.SelectedItems.Count > 0)
      7. {
      8. foreach (ListViewItem item in this.listView1.SelectedItems)
      9. {
      10. profile.RemoveApp(item.Text);
      11. }
      12. this.LoadApplications();
      13. this.SaveProfiles();
      14. }
      15. }
      16. }


      mach

      C#-Quellcode

      1. private void toolStripButton3_Click(object sender, EventArgs e)
      2. {
      3. Profile profile = this.Profiles[comboBox1.SelectedIndex];
      4. if (profile == null || listView1.SelectedItems.Count <= 0) { return; }
      5. foreach (ListViewItem item in this.listView1.SelectedItems)
      6. {
      7. profile.RemoveApp(item.Text);
      8. }
      9. this.LoadApplications();
      10. this.SaveProfiles();
      11. }


      Schon hast du weniger Zeilen Code und es ist schneller ersichtlich, was du eigentlich vor hast.



      2. Lass das this. weg
      Spoiler anzeigen

      Das this-Schlüsselwort solltest du im Normalfall nie gebrauchen.
      Der Compiler weiß, wo die Sachen liegen. Das this kannst du verwenden, wenn du (warum auch immer) einen Parameter hast, der so heißt wie eine Klassenvariable.


      3. Klassenvariablen-Namen

      Spoiler anzeigen

      Um deine Klassenvariablen von Methodenparametern unterscheiden zu können, solltest du den Variablen einen Präfix geben.

      Bei .net ist das üblicherweise nur ein Unterstrich (_). Ich persönlich weiche gerne davon ab und verwende mittlerweile lieber m_ als Präfix für Membervariablen und s_ für statische Variablen.
      So kann man sofort erkennen, worum es sich handelt.

      Beispiele:

      C#-Quellcode

      1. class MyThing {
      2. private int m_myCounter;
      3. private List<string> m_myStrings;
      4. private static int s_maxElementCount = 50;
      5. }



      4. Speicherverwaltung

      Spoiler anzeigen

      Ja, dotnet nimmt dir einen überwiegenden Teil der Speicherverwaltung ab, aber das heißt nicht, dass der Garbage Collector allwissend oder gar perfekt ist. Im Gegenteil. Wie wir Menschen auch, braucht der manchmal einen Stubs in die richtige Richtung.
      Aus dem Grund solltest du using-statements verwenden, bei allen Objekten, die das IDisposable Interface implementieren.

      aus

      C#-Quellcode

      1. OpenFileDialog openFileDialog = new OpenFileDialog();
      2. if (openFileDialog.ShowDialog() == DialogResult.OK)
      3. {
      4. App application = new App(openFileDialog.FileName);
      5. profile.Applications.Add(application);
      6. LoadApplications();
      7. SaveProfiles();
      8. }


      mach

      C#-Quellcode

      1. using var openFileDialog = new OpenFileDialog();
      2. if (openFileDialog.ShowDialog() == DialogResult.OK)
      3. {
      4. App application = new App(openFileDialog.FileName);
      5. profile.Applications.Add(application);
      6. LoadApplications();
      7. SaveProfiles();
      8. }



      5. Implicit Typing

      Spoiler anzeigen

      Seit Jahren bietet C# (und auch VB) Implicit Typing an. Damit erleichterst du dir die Tipparbeit und lässt den Compiler für seine Brötchen arbeiten.
      Solange der Typ einer Variable klar zu erkennen ist (also eigentlich immer dann, wenn du eine Factory-Methode oder einen Builder verwendest, oder ein Literal oder eine new-Anweisung schreibst, nimm lieber var, statt den vollständigen Typnamen auszutippen.

      Siehe Punkt 4. für ein Beispiel.


      6. Verwende Schlüsselworte statt Klassen

      Spoiler anzeigen

      C# bietet dir diverse Schlüsselwörter als Alias für Framework-Klassen an. Das hat unter anderem den Hintergrund, dass es dein Programm portabler macht. C# funktioniert (längst) nicht nur unter Windows und mit dem .net Framework. Unity, Mono und noch zahlreiche andere Frameworks verwenden C# als Programmiersprache, ohne dass das .net-Framework dahinter steht.

      Anstatt String, verwende lieber string.


      7. Zirkelreferenzen :thumbdown:

      Spoiler anzeigen

      Du hast eine Zirkelreferenz gebaut. Ein ziemlich widerliches Konstrukt, was den Fluss deines Codes absolut zerstört, viele Bugs verursachen kann und von der Lesbarkeit mal ganz ab.

      C#-Quellcode

      1. private void button1_Click(object sender, EventArgs e)
      2. {
      3. CreateProfileForm createProfileForm = new CreateProfileForm(this);
      4. createProfileForm.ShowDialog();
      5. }


      und das alles, nur damit du

      C#-Quellcode

      1. private void button1_Click(object sender, EventArgs e)
      2. {
      3. Profile profile = new Profile(this.textBox1.Text);
      4. this.parent.Profiles.Add(profile);
      5. this.parent.ReloadUIData();
      6. this.parent.SaveProfiles();
      7. this.Close();
      8. }


      aufrufen kannst.

      Wenn du die Form schon als Modal verwenden möchtest, dann ruf sie auch wie ein Modal auf. Anhand des DialogResult kannst du dann in Form1 entscheiden, was genau du damit machen und lassen willst.

      Eine Alternative wäre, dass du ein delegate übergibst, was dann aufgerufen wird.


      8. Unnötige Komplett-Refreshes

      Spoiler anzeigen

      Als Erweiterung von Punkt 7; jedes Mal, wenn du ein neues Profil anlegst, lädst du direkt alle Elemente in der ComboBox neu.
      Das mag bei 5 Stück gut gehen und keinen spürbaren Effekt auf die Performance haben. Sobald du allerdings hunderte (oder einfach nur komplexe) Profile hast, wird dich das ziemlich sicher in den Hintern beißen.

      C#-Quellcode

      1. var myDialog = new CreateProfileForm();
      2. switch (myDialog.ShowDialog(this)) { // das this an dieser Stelle ist keine Zirkelreferenz, sondern sagt Windows, zu welcher Form das Modal gehört!
      3. case DialogResult.OK:
      4. m_profiles.Add(myDialog.GetProfile());
      5. // du könntest im Constructor auch combobox1.DataSource = m_profiles; schreiben. Dann kümmert sich das Control selbstständig um die Items
      6. break;
      7. default:
      8. // ggf. andere Fälle behandeln
      9. break;
      10. }



      Generelles Feedback:

      - Du solltest deinen Usern die Möglichkeit zumindest anbieten, den zu startenden Programmen Argumente übergeben zu können.
      Verwende dazu am besten die ProcessStartInfo-Klasse.

      - Entferne toten Code
      Braucht eh keiner.

      - Dokumentation!
      Du solltest dringend an deiner Dokumentation arbeiten. Vor allem bei deinen public Methoden solltest du auf jeden Fall mehr als nur "Create a new profile with the given name" schreiben ;)
      Dein älteres Ich wird dir danken.

      - Unit Tests
      Verwende - wo sinnvoll - Unit Tests ein, um dein Programm zu testen bevor es an die Öffentlichkeit geht. Die kannst du auch automatisieren.




      Ich hoffe das Ganze kam jetzt nicht zu barsch rüber.
      Quellcode lizensiert unter CC by SA 2.0 (Creative Commons Share-Alike)

      Meine Firma: Procyon Systems
      Meine Privatwebseite: SimonC.eu

      Bitte nicht wundern, wenn meine Aktivitäten im Forum etwas langsamer sind, ich baue gerade mein Nebengewerbe zum Vollgewerbe aus.
      Ich versuche auf euch zurückzukommen :)

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

      Kein Problem, sehr gerne! Wenn du dazu Rückfragen hast, schieß mir gerne sonst eine PN. Müssen den Faden hier nicht unnötig damit zumüllen ;)
      Quellcode lizensiert unter CC by SA 2.0 (Creative Commons Share-Alike)

      Meine Firma: Procyon Systems
      Meine Privatwebseite: SimonC.eu

      Bitte nicht wundern, wenn meine Aktivitäten im Forum etwas langsamer sind, ich baue gerade mein Nebengewerbe zum Vollgewerbe aus.
      Ich versuche auf euch zurückzukommen :)
    • 2 Benutzer haben hier geschrieben