TweakPC

Zurück   Computer Hardware Forum - TweakPC > Games und Software > Programmiersprachen

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 20.05.2015, 21:42   #1 (permalink)
Fingerabzähler
 

Registriert seit: 13.05.2015
Beiträge: 8

Siremekuvo befindet sich auf einem aufstrebenden Ast

Standard Wie kann ich den Code optimieren?

Hallo Leute,

bin ein wenig am Verzweifeln, weil ich folgenden Code nicht toll finde. Es funktioniert alles einwandfrei, aber ich habe das Gefühl, der objektorientierten Programmierung nicht gerecht zu werden.

Dies ist der Code:

Code:
using System.Windows.Forms;

    public class MyFlugzeugspiel
    {
   
        public static void Main(string[] args)
        {

            PictureBox flugzeug;

            MyFlugzeug myFlugzeug = new MyFlugzeug(global::Flugzeugspiel.Properties.Resources.MyRedFlugzeug, null, 0);

            flugzeug = myFlugzeug.getAircraft(10, 150, 98, 27);
       
            ScrollingBackground himmel = new ScrollingBackground("THE FLIGHTER", 1000, 650, flugzeug, null, flugzeug, 5);
                  

        }
    }
Code:
using System.Windows.Forms;
using System.Drawing;


    public abstract class Flugzeug : Form
    {
        
        protected PictureBox picBoxImage;
        private Bitmap myFlightPic;

        public Flugzeug(Bitmap myFlugzeug)
        {

            this.myFlightPic = myFlugzeug;

        }

        public PictureBox getAircraft(int x, int y, int width, int height)
        {

            // Flugzeug wird erschaffen
            picBoxImage = new PictureBox();
            picBoxImage.Image = myFlightPic;
            picBoxImage.BackColor = Color.Transparent;
            picBoxImage.SetBounds(x, y, width, height);

            return picBoxImage;

        }
    
    }
Code:
using System.Drawing;
using System.Windows.Forms;

    public class MyFlugzeug : Flugzeug
    {

        private int finenessOfAirplaneMotion;

        public MyFlugzeug(Bitmap myFlightPic, PictureBox picBoxImage, int finenessOfAirplaneMotion)
        : base(myFlightPic)
        {

            this.picBoxImage = picBoxImage;
            this.finenessOfAirplaneMotion = finenessOfAirplaneMotion;
       
        }
    
        protected void flugzeugBewegen_KeyDown(object sender, KeyEventArgs e)
        {

            if (e.KeyCode == Keys.W)
            {

                if (picBoxImage.Top > 10)
                {

                    picBoxImage.Top -= this.finenessOfAirplaneMotion;

                }

            }

            if (e.KeyCode == Keys.S)
            {

                if (picBoxImage.Top < 315)
                {

                    picBoxImage.Top += finenessOfAirplaneMotion;

                }


            }

        }

    }
Code:
using System.Drawing;

    public class FeindFlugzeug : Flugzeug
    {
    
        public FeindFlugzeug(Bitmap myFlightPic) : base(myFlightPic)
        {
        }   
    
    }
Code:
using System.Drawing;
using System.Windows.Forms;


    public class ScrollingBackground : MyFlugzeug
    {

        public ScrollingBackground(string name, int size1, int size2, PictureBox flugzeug, Bitmap myFlightPic, PictureBox picBoxImage, int finenessOfAirplaneMotion)
            : base(myFlightPic, picBoxImage, finenessOfAirplaneMotion)
        {

            // Windows-Fenster wird erschaffen
            this.Text = name;
            this.Size = new Size(size1, size2);
            this.StartPosition = FormStartPosition.CenterScreen;
            this.FormBorderStyle = FormBorderStyle.FixedSingle;
            this.MaximizeBox = false;
            this.Controls.Add(flugzeug);
            this.KeyDown += new KeyEventHandler(this.flugzeugBewegen_KeyDown);      
            this.ShowDialog();
     

        }

    }
Wer Java kann, kann auch C#. Ist genau dasselbe. Hoffe, ihr erschreckt nicht an der Fülle des Codes. Aber kürzer konnte ich es jetzt nicht zusammenfassen.

Dieser Code funktioniert einwandfrei.
Aber was mir nicht gefällt, ist folgendes:

Code:
     flugzeug = myFlugzeug.getAircraft(10, 150, 98, 27);
       
            ScrollingBackground himmel = new ScrollingBackground("THE FLIGHTER", 1000, 650, flugzeug, null, flugzeug, 5);
Ich möchte gerne, dass eben die Methode getAircraft so aussieht: getAircraft(10, 150, 98, 27, 5);
Die 5, also finenessOfAirplaneMotion sollte nicht der Konstruktor haben, sondern eben die Methode getAircraft. Die sollen doch zusammen sein, ist doch viel schöner.
Da ja vieles von der Hauptklasse Flugzeug, aber auch von MyFlugzeug geerbt wird, muss ich natürlich jedesmal, wenn der Konstruktor einer Subklasse aufgerufen wird, die der Hauptklasse auch aufrufen, ist ja klar, weil ja erst die Hauptklasse konstruiert werden muss, bevor ich überhaupt die Subklasse nutzen kann.

Aber, was mir dort nicht gefällt, ist folgendes:

Code:
     MyFlugzeug myFlugzeug = new MyFlugzeug(global::Flugzeugspiel.Properties.Resources.MyRedFlugzeug, null, 0);

     ScrollingBackground himmel = new ScrollingBackground("THE FLIGHTER", 1000, 650, flugzeug, null, flugzeug, 5);
Ständig diese Null-Lückenfüller. Wie kann man diese schrecklichen Lückenfüller umgehen?
Man kann doch z. B. keinen anderen Entwickler zumuten, meine Klassen zu verwenden, oder?

Oder ist das normal? Macht man das so?

Hänge momentan ein wenig, wie ich meinen Programmierstil wesentlich verbessere.

Ich würde mich echt auf eure etwaigen Codebeispiele und Antworten freuen und bedanke mich recht herzlich.

Ich wünsche euch was!

LG Siremekuvo
Siremekuvo ist offline   Mit Zitat antworten
Für diesen Beitrag bedankt sich:
MisterSchue (23.09.2016)
Alt 21.05.2015, 13:25   #2 (permalink)
Blödmarktkundenberater
 
Benutzerbild von Exit
 

Registriert seit: 10.04.2002
Beiträge: 10.666

Exit hat eine strahlende Zukunft
Exit hat eine strahlende ZukunftExit hat eine strahlende ZukunftExit hat eine strahlende ZukunftExit hat eine strahlende ZukunftExit hat eine strahlende Zukunft

Standard AW: Wie kann ich den Code optimieren?

1. ScrollingBackground erbt von Flugzeug
Der Sinnzusammenhang erschließt sich mir nicht wirklich.

Du solltest hier überlegen, ob ScrollingBackground ein Flugzeug ist ("Ist ein" - Beziehung = erben) oder ob es eine Property Flugzeug (vielleicht sogar "Flugzeuge") hat.

Vererbung sollte man grundsätzlich möglichst sparsam einsetzen, da sich darauf spätestens beim Refactoring diverse Probleme ergeben können.

2. Alles erbt von Form?
Scheint ein ähnliches "erben" Problem zu sein, zumindest wenn mit "Form" System.Windows.Forms.Form gemeint ist. Theoretisch würde ich eigentlich nur 1 Form (=Windows Formular Fenster) erwarten, in dem dann der Inhalt dargestellt wird.

3. "null" übergaben kann man vermeinden, indem du mehrere Konstruktoren in Deinen Klassen zulässt.

zum Beispiel:

Code:
public class Person
    {
        private string nachname;
        private string vorname;
        private DateTime geburtsdatum;
        
        public Person(string nachname)    // 1. Konstruktor
        : this(nachname, null, DateTime.MinValue)
        {
            // hier wird der Konstruktor 4 aufgerufen
            // Dies hat den Vorteil, dass man nicht in jedem Konstruktor die Properties erneut zuweisen muss.
        }
        
        public Person(string nachname, string vorname)    // 2. Konstruktor
        : this(nachname, vorname, DateTime.MinValue)
        {
            // hier wird der Konstruktor 4 aufgerufen
            // Dies hat den Vorteil, dass man nicht in jedem Konstruktor die Properties erneut zuweisen muss.
        }
        
        public Person(string nachname, DateTime geburtsdatum) // 3. Konstruktor
        {
            // hier wird kein anderer Konstruktor aufgerufen
            this.nachname = nachname;
            this.geburtsdatum = geburtsdatum;
        }
        
        public Person(string nachname, string vorname, DateTime geburtsdatum) // 4. Konstruktor
        {
            this.nachname = nachname;
            this.vorname = vorname;
            this.geburtsdatum = geburtsdatum;
        }
    
    }
    
    // Anwender erbt von Person - bietet aber selbst nur 2 Konstruktoren nach aussen an.
    public class Anwender : Person
    {
        private string spitzname;

        
        public Anwender(string nachname)
            : base(nachname)
        { 
            // Verwendet Konstruktor 1 (welcher intern dann Konstruktor 4 aufruft)
        }

        public Anwender(string nachname, string vorname, DateTime geburtstag, string spitzname)
            : base(nachname, vorname, geburtstag)
        {
            // Verwendet Konstruktor 1 (welcher intern dann Konstruktor 4 aufruft)
            this.spitzname = spitzname;
        }
    }

    public class Test
    {
        public Test()
        {
            var horst = new Anwender("Hützelmann", "Horst", DateTime.Parse("1.1.1990"), "Hützel");
            var mustermann = new Anwender("Mustermann");

            // dies geht nicht, da nur die Klasse Person so einen Konstruktor hat, aber die Klasse Anwender nicht!
            // var gehtNicht = new Anwender("GehtNicht", DateTime.Now);
        }
    }
Ansonsten habe ich wie gesagt dass Gefühl, dass etwas bei Deiner Vererbung nicht stimmt. Warum erben alle von Form? Theoretisch sollte es nur ein Form sein, in dem Du dann Deine "Flugzeug" Instanzen hinzu fügst.

Aber ich kenne Dein Programm ja nicht - vielleicht ist es ja auch richtig.
Power is nothing without Control!
Hauptsystem
Exit ist offline   Mit Zitat antworten
Für diesen Beitrag bedankt sich:
MisterSchue (23.09.2016)
Alt 21.05.2015, 14:30   #3 (permalink)
Blödmarktkundenberater
 
Benutzerbild von Exit
 

Registriert seit: 10.04.2002
Beiträge: 10.666

Exit hat eine strahlende Zukunft
Exit hat eine strahlende ZukunftExit hat eine strahlende ZukunftExit hat eine strahlende ZukunftExit hat eine strahlende ZukunftExit hat eine strahlende Zukunft

Standard AW: Wie kann ich den Code optimieren?

Vielleicht noch etwas zum Thema Vererbung und die Probleme, wenn man es "falsch" macht.

Code:
    
    public class Telefon
    {
        private string nummer;
        public Telefon(string nummer)
        {
            this.nummer = nummer;
        }
    }

    public class Person : Telefon
    {
        private string name;
        public Person(string name, string nummer)
            : base(nummer)
        {
            this.name = name;
        }
    }
Diese Konstruktion erfüllt zwar ihren Zweck (zu jeder Person kann eine Telefon hinterlegt werden), aber sie ist vom logischen falsch und macht spätere Anpassungen und Erweiterungen nur unnötig schwer.

Die Bedeutung dieser Konstruktion wäre ja:
Jede "Person" ist ein "Telefon" - was vom logischen ja Quatsch ist.

Besser wäre folgende Konstruktion:

Code:
    public class Telefon
    {
        private string nummer;
        public Telefon(string nummer)
        {
            this.nummer = nummer;
        }
    }

    public class Person
    {
        private string name;
        private Telefon telefon;
        public Person(string name)
        {
            this.name = name;
        }

        public Telefon Telefon
        {
            get { return this.telefon; }
            set { this.telefon = value; }
        }
    }
Jetzt hat jede Person ein Telefon - sie ist aber kein Telefon mehr.

Damit ist es auch wesentlich einfacher, bei einem vielleicht nötigen Refactoring, aus dem einen Telefon eine Liste von Telefonen zu machen.

Geändert von Exit (21.05.2015 um 22:22 Uhr)
Exit ist offline   Mit Zitat antworten
Für diesen Beitrag bedankt sich:
MisterSchue (23.09.2016)
Alt 21.05.2015, 17:28   #4 (permalink)
Fingerabzähler
 

Registriert seit: 13.05.2015
Beiträge: 8

Siremekuvo befindet sich auf einem aufstrebenden Ast

Standard AW: Wie kann ich den Code optimieren?

Sehr interessant und lehrreich!
Danke dir!
Siremekuvo ist offline   Mit Zitat antworten
Alt 21.05.2015, 22:26   #5 (permalink)
Blödmarktkundenberater
 
Benutzerbild von Exit
 

Registriert seit: 10.04.2002
Beiträge: 10.666

Exit hat eine strahlende Zukunft
Exit hat eine strahlende ZukunftExit hat eine strahlende ZukunftExit hat eine strahlende ZukunftExit hat eine strahlende ZukunftExit hat eine strahlende Zukunft

Standard AW: Wie kann ich den Code optimieren?

Kein Problem, meld Dich einfach wenn Du Fragen hast oder mal nicht weiter kommst. Ich kann zwar nicht 100% versprechen Dir helfen zu können, aber ich geb mir Mühe

Ich muss aber zugeben - ich habe Hardware als Hobby, verdiene mein Gehalt aber als Software Entwickler (C# und alles was so dazu gehört).
Exit ist offline   Mit Zitat antworten
Alt 21.05.2015, 23:29   #6 (permalink)
Fingerabzähler
 

Registriert seit: 13.05.2015
Beiträge: 8

Siremekuvo befindet sich auf einem aufstrebenden Ast

Standard AW: Wie kann ich den Code optimieren?

Das ist echt super nett von dir.
Finde beides auch sehr interessant und kann nicht genug bekommen vom Programmieren.
Besonders wenn man sich mit erfahrenen Programmierern austauschen und was lernen kann, ist das ein tolles Gefühl, weil man seinem Traun, ein sehr guter Programmierer zu werden, immer näher rückt !

PS: Ich habe jetzt auch eine Stelle als Softwareentwickler bekommen. Bin aber noch ganz am Anfang und hoffe, dass ich auch in meiner Arbeit aus dem schrecklichen Code, den ich fabriziere, mal ordentlichen schreiben kann. Meine Sprache wird das gute alte Delphi sein !
Siremekuvo ist offline   Mit Zitat antworten
Antwort

Stichworte
code, optimieren


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 
Themen-Optionen
Ansicht

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist aus.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an


Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
System optimieren RoE187 Kaufberatung 23 06.03.2008 08:47
C2D 6600 auf Asrock Mainboard. Was kann ich alles optimieren? tweakpchardwareforumuser CPUs und Mainboards allgemein 2 21.12.2006 21:54
Das Gerät kann nicht gestartet werden. (Code 10) Skywalker Grafikkarten und Displays allgemein 1 13.05.2005 11:10
Geforce fx 5900XT kann man diese noch optimieren?? Gast NVIDIA GeForce Grafikkarten 3 16.07.2004 12:47
RAMgeschwindigkeit optimieren Troy Mc lur RAM Arbeitsspeicher 12 23.06.2004 19:41


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:37 Uhr.






Powered by vBulletin® Version 3.8.10 (Deutsch)
Copyright ©2000 - 2024, vBulletin Solutions, Inc.
SEO by vBSEO 3.5.2 ©2010, Crawlability, Inc.
Impressum, Datenschutz Copyright © 1999-2015 TweakPC, Alle Rechte vorbehalten, all rights reserved