Laden...

WinForms: Wie kann ich den Code optimieren?

Erstellt von Serun vor 8 Jahren Letzter Beitrag vor 8 Jahren 3.103 Views
S
Serun Themenstarter:in
16 Beiträge seit 2015
vor 8 Jahren
WinForms: 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:


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);
                  

        }
    }


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;

        }
    
    }


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;

                }


            }

        }

    }


using System.Drawing;

    public class FeindFlugzeug : Flugzeug
    {
    
        public FeindFlugzeug(Bitmap myFlightPic) : base(myFlightPic)
        {
        }   
    
    }


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();
     

        }

    }

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:

     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:

     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 Serun

P
1.090 Beiträge seit 2011
vor 8 Jahren

Zuerst einmal ich hab schon deutlich schlimmeres gesehen.

"Schlecht" ist es Trotzdem.
Was du dir direkt mal anschauen kannst sind die wiki:Prinzipien objektorientierten Designs und wiki:Entwurfsmuster .

Im Detail möchte ich da jetzt eigendlich nicht eigehen würde wohl was länger werden.

Ein paar Anmerkungen vieleicht noch.

Du benutzt an ein paar Stellen unnötig die Vererbung. (Flugzeug muss nicht von Form erben, das kannst du z.B. mit einer Factory (Entwurfsmuster) bekommen).

Du kannst auch mehrer Konstrukter mit unterschiedlichen Parameten anbieten. (Sollte deine "NULL" angaben erüberigen.)

Sollte man mal gelesen haben:

Clean Code Developer
Entwurfsmuster
Anti-Pattern

5.658 Beiträge seit 2006
vor 8 Jahren

Hi Serun,

ich würde dir für den Einstieg diesen Artikel empfehlen: [Artikel] Drei-Schichten-Architektur.

Was du machst, ist genau das Gegenteil von Schichtentrennung. Deine einzelnen Schichten sind nicht unabhängig voneinander und können auch nicht unabhängig voneinander weiterentwickelt oder getestet werden.

Christian

Weeks of programming can save you hours of planning

S
Serun Themenstarter:in
16 Beiträge seit 2015
vor 8 Jahren

Hey Leute,
danke für eure Antworten!
Ja, ist schlimm, aber ich lese eure vorgeschlagenen Artikel durch und überarbeite es dann nochmal!

LG