Computer Hardware Forum - TweakPC

Computer Hardware Forum - TweakPC (https://www.tweakpc.de/forum/)
-   Programmiersprachen (https://www.tweakpc.de/forum/programmiersprachen/)
-   -   Wie kann ich den Code optimieren? (https://www.tweakpc.de/forum/programmiersprachen/100215-wie-kann-ich-den-code-optimieren.html)

Siremekuvo 20.05.2015 22:42

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][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][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][CODE]
using System.Drawing;

public class FeindFlugzeug : Flugzeug
{

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

}
[/CODE][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();


}

}
[/CODE]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);[/CODE]Ich möchte gerne, dass eben die Methode [B]getAircraft[/B] so aussieht: [B]getAircraft(10, 150, 98, 27, 5);[/B]
Die 5, also [B]finenessOfAirplaneMotion[/B] sollte nicht der Konstruktor haben, sondern eben die Methode [B]getAircraft[/B]. Die sollen doch zusammen sein, ist doch viel schöner.
Da ja vieles von der Hauptklasse [B]Flugzeug[/B], aber auch von [B]MyFlugzeug[/B] 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);[/CODE]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

Exit 21.05.2015 14:25

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

[/code]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.

Exit 21.05.2015 15:30

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;
}
}
[/code]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; }
}
}
[/code]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.

Siremekuvo 21.05.2015 18:28

AW: Wie kann ich den Code optimieren?
 
Sehr interessant und lehrreich!
Danke dir!

Exit 21.05.2015 23:26

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

Siremekuvo 22.05.2015 00:29

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


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:34 Uhr.

Powered by vBulletin® Version 3.8.10 (Deutsch)
Copyright ©2000 - 2024, vBulletin Solutions, Inc.
SEO by vBSEO 3.5.2 ©2010, Crawlability, Inc.