Vererbung Anfänger Programm bitte um Kritik&Anregungen

JDownHD

Mitglied
Hallo,

da ich mehr Anfänger als Programmgestalter bin habe ich es hier rein gesetzt 😉

Ich bin neu hier im Forum sowie in der "Welt des Programmierens", ich habe vor drei Tagen damit begonnen meine erste Programmiersprache anzueignen – Java.
Ich habe mir das Ziel gesetzt ein Programm zu entwickeln mit welchem man Freunde archivieren kann, sprich ein Adressbuch für alte Schulfreunde o.ä.

Nun habe ich also begonnen und wollte eure Meinung dazu hören…
  • Was kann man besser machen
  • wie kann man den Stil verschönern
  • Macht es überhaupt sin es so Anzulegen
  • und was euch noch so an Kritikpunkten einfällt 😉
Ich habe also nun damit begonnen den Code zu schreiben und bin immer mal wieder auf kleine Hindernisse gestoßen das größte was sich mir stellte war, dass es in Java wohl nur bedingt möglich ist eine Mehrfachvererbung zu erlangen. Dies habe ich nun so gelöst das ich von Klasse zu Klasse vererbt habe, so dass ich am Ende alle unter einem Hut hatte → kann man das besser lösen?

Ich habe den Java Code hochgeladen weil er für hier zu lang wäre.


Ich bitte um Kritik und Anregungen :rtfm:
Dankeschön!
 
Zum Thema Mehrfachvererbung. Meistens reicht es wenn man ein oder mehrere Interface's implementiert und nur eine oder gar keine abstrakte Basisklasse erweitert.
 
Ich habe also nun damit begonnen den Code zu schreiben und bin immer mal wieder auf kleine Hindernisse gestoßen das größte was sich mir stellte war, dass es in Java wohl nur bedingt möglich ist eine Mehrfachvererbung zu erlangen. Dies habe ich nun so gelöst das ich von Klasse zu Klasse vererbt habe, so dass ich am Ende alle unter einem Hut hatte → kann man das besser lösen?
Ja definitiv.
Vererbung setzt man in der Regel ein wenn man sachen kann "A ist ein B", also z.b. "Pferd ist ein Tier". Die Oberklasse ist Tier und Pferd erbt davon.

Java:
public class Internet extends Adresse {
Das macht bei keinen Sinn. Warum willst überhaupt überall vererben lassen?
Machs doch lieber so irgendwie:

Java:
public class AdressbuchEintrag {
  private Person person;
  private Adresse adresse;
  private Geburtstag geburtstag;
  private Internet internet;
  private Telefonnummern telefonnummer;

  /** Konstruktor + Getter */
}
Dann kannst du dir das ganze vererben sparen.

private
 
Was soll man denn da kritisieren? Die Kust von Eclipse getter und setter zu generieren? 😉

Aber von der Logik her ist es völlig daneben. Wieso sollte Internet eine Adresse sein, NameGebDatum - eine Telefonnummer und Person - ein Datum? :bahnhof:

Mach die Lieber für jeden einzelnen Eintrag ein eigenes Object, dann hast du sowas wie:
Java:
class Person {
  private String name;
  private List<ContactEntry> contactEntrys;
}
o.ä.
 
a definitiv.
Vererbung setzt man in der Regel ein wenn man sachen kann "A ist ein B", also z.b. "Pferd ist ein Tier". Die Oberklasse ist Tier und Pferd erbt davon.
[...]
Das macht bei keinen Sinn. Warum willst überhaupt überall vererben lassen?

ja da hast du wohl recht! 😀
Ziel des ganzen war eigentlich ein wenig mehr durch die Vererbung durchzusteigen aber die Zielsetzung war bzw. ist wohl die Falsche... Ich werde mich noch einmal daran setzen und es anpassen bzw. neu Schreiben 😉

Die Vererbung werde ich dann mit Tieren üben, dass ist eine sehr gute Idee - die auch noch sinn macht 😀
 
Du kannst auch direkt im Forum hochladen.
Davon abgesehen wäre es wenn du so viele Strings hast vorteilhaft ein Array zu verwenden und mit Konstanen darauf zuzugreifen. Damit bist du oft wesendlich flexibler.
 
Schau dir vielleicht das Open book von galileo press zum Thema OOP auch an. Link such ich später noch raus. Ist aufm tablet eher müßig.

Edit: Hier noch der Link: Galileo Computing :: Objektorientierte Programmierung - Das umfassende Handbuch

Da sind Vererbungskonzepte ect. sehr gut erklärt.

Falls es dein Budget zulässt würde ich dir noch gerne das Buch Java von Kopf bis Fuß empfehlen. Ist ziemlich teuer (50€) aber mit Abstand das beste Einsteigerwerk was ich je gelesen habe!

Dort wird einem zum einen Java näher gebracht wobei auch gägnige Konzepte in sinnvoller Art und Weise mit guten Beispielen vermittelt werden.

Java von Kopf bis Fuß: Amazon.de: Kathy Sierra, Bert Bates, Lars Schulten, Elke Buchholz: Bücher
 
Zuletzt bearbeitet von einem Moderator:
SUPER!
Danke für die ganzen Tipps! Ich werde mich mir das alles zu gemüte führen und dann später mal posten was dabei rausgekommen ist 😉

Edit: soo ich habe was kleines zur Vererbung gemacht und hoffe dieses mal etwas Sinnvolles erschaffen zu haben 😉 Kritik ist erbeten und erwünscht!

Code im Anhang.
Edit: .rar wird nicht unterstützt...
 

Anhänge

Zuletzt bearbeitet:
Was soll man denn da kritisieren? Die Kust von Eclipse getter und setter zu generieren? 😉

Aber von der Logik her ist es völlig daneben. Wieso sollte Internet eine Adresse sein, NameGebDatum - eine Telefonnummer und Person - ein Datum? :bahnhof:

Mach die Lieber für jeden einzelnen Eintrag ein eigenes Object, dann hast du sowas wie:
Java:
class Person {
  private String name;
  private List<ContactEntry> contactEntrys;
}
o.ä.

Das Ziel war es am Ende alle Daten über z.B. den Namen abrufen zu können...
Also man gibt den Namen "Max" ein und erhält alle dazugehörigen Daten( Adresse Tel-Nr. usw.).

Vondaher dachte ich das die immer Erben müssten um am ende alles in einer Klasse zu haben... 😀
 
Von der Logik her schon besser. Nur solltest du überlegen, ob es wirklich sinnvoll ist zu vererben. Du erweiterst in Auto bloß um 2 und in Motorrad um 1 Variable und die ensprechenden Get/Setter. Da wäre es wahrscheinlich besser nur Kraftfahrzeuge zu erzeugen und bei Motorräder Türen auf 0 zu setzen. Das würde auch Polymorphie unterstützen, also dass Autos, Motorräder und direkte Kraftfahrzeug-Instanzen zusammen als Kraftfahrzeug gespeichert werden, ohne hinterher unterscheiden zu müssen, worum es sich jetzt genau handelt.

Und ich finde deine Variablenamen nicht soooo gut. Bei tueren denkt man als Erstes an ein Array mit Tür-Instanzen. Wenn du sie tuerenAnzahl nennen würdest, wäre es klarer. Genauso könntest du anhKupplung in hatAnhKupplung umbennen.
 
@Volvagia

Okay also man sollte so wenig wie möglich Vererben, habe ich das jetzt richtig Verstanden?
Man sollte so viele Eigenschaften wie es geht in eine Klasse packen und nur wenn man - um bei diesem Beispiel zu bleiben - bei der Klasse Auto mehrere spezifische Eigenschaften hinzufügen will eine Klasse Auto erstellen. Ansonsten setzt man halt die Werte die für das Auto oder das Motorrad nicht zutreffen auf z.B. 0.

////////////////////////////////////////////////////////////////////////

Wie bekomme ich es denn hin einen Kontakt anzulegen mit Namen, Adresse, Telefonnummer usw. und dann nur über den Namen auf den Rest zugreifen bzw. alle anderen Eigenschaften einsehen zu können?
 
Das wäre wohl eher ein Anwendungsfall für eine Map:

Java:
Kontakt k1 = new Kontakt("Fu3L", ....);
Kontakt k2 = new Kontakt("JDownHD",....);

//Lege die zuvor erzeugten Kontaktinstanzen in einer Map ab:
Map<String, Kontakt> kontakte = new HashMap<String, Kontakt>();
kontakte.put("Fu3L", k1);
kontakte.put(k2.getName(), k2);

//Lies mithilfe eines Namens das Kontaktobjekt aus der Map aus und gib es aus
//(Damit was sinnvolles bei rauskommt, musst du die toString Methode in deiner Kontaktklasse überschreiben!
System.out.println(kontakte.get("JDownHD"));

Es wäre natürlich auch anders möglich auf die Daten zuzugreifen:

Java:
Kontakt ergebnis = kontakte.get("JDownHD");
System.out.println(ergebnis.getAdresse());
 
Wie wäre es damit?

Java:
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;

public class ContactList
{
	private static final byte IDENTIFIER = Contact.NAME_PARM;
	
	private List<Contact> contacts;
	private Map<String, Contact> contactCache;
	
	public ContactList()
	{
		super();
		contacts = new LinkedList<Contact>();
		contactCache = new HashMap<String, Contact>();
	}
	public synchronized void addContact(Contact contact)
	{
		if(contact == null)
			throw new NullPointerException();
		
		contacts.add(contact);
		updateCache(contact);
	}
	public synchronized void addContact(String... data)
	{
		Contact contact = new Contact();
		for(byte b = 0, size = (byte) data.length; b < size; b++)
			contact.setParameter(data[b], b);
		addContact(contact);
	}
	public synchronized Contact getContact(String identifier)
	{
		Contact contact = contactCache.get(identifier);
		if(contact != null && contact.getParameter(IDENTIFIER).equals(identifier))
			return(contact);
		
		for(Contact c:contacts)
		{
			if(c != null && c.getParameter(IDENTIFIER).equals(identifier))
			{
				updateCache(c);
				return(c);
			}
		}
		return(null);
	}
	private void updateCache(Contact c)
	{
		String identifer = c.getParameter(IDENTIFIER);
		if(identifer != null && identifer.trim().length() != 0)
			contactCache.put(identifer, c);
	}
	public static void main(String[] args)
	{
		ContactList contactList = new ContactList();
		contactList.addContact("Volvagia", "2345", "Brunn@Gebirge", "178.77.101.236");
		
		Contact contact = contactList.getContact("Volvagia");

		System.out.println("Name:\t" + contact.getParameter(Contact.NAME_PARM));
		System.out.println("PLZ:\t" + contact.getParameter(Contact.PLZ_PARM));
		System.out.println("Ort:\t" + contact.getParameter(Contact.LOCATION_PARM));
		System.out.println("Homep.:\t" + contact.getParameter(Contact.WEBSITE_PARM));
		
	}
}


import java.util.HashSet;

public class Contact
{
	public static final byte NAME_PARM = 0;
	public static final byte PLZ_PARM = NAME_PARM + 1;
	public static final byte LOCATION_PARM = PLZ_PARM + 1;
	public static final byte WEBSITE_PARM = LOCATION_PARM + 1;
	
	private static final byte PARM_COUNT = WEBSITE_PARM + 1;
	
	private static final byte FIRST_PARM = NAME_PARM;

	private static final String DEFAULT_NULL_STRING = "";

	private static final HashSet<Byte> NUMBERS_ONLY_SET = new HashSet<Byte>() {
		{
			add(PLZ_PARM);
		}
	};
	
	private String[] data;
	
	public Contact()
	{
		super();
		data = new String[PARM_COUNT];
	}
	public String getParameter(byte field)
	{
		if(field < FIRST_PARM || field > (PARM_COUNT - 1))
			throw new IllegalArgumentException("Field out of bounds. :'(");
		return(data[field] != null ? data[field] : DEFAULT_NULL_STRING);
	}
	public void setParameter(int parm, byte field)
	{
		setParameter(String.valueOf(parm), field);
	}
	public void setParameter(String parm, byte field)
	{
		if(field < FIRST_PARM || field > (PARM_COUNT - 1))
			throw new IllegalArgumentException("Field out of bounds. :'(");
		
		if(NUMBERS_ONLY_SET.contains(field) && !isNumberic(parm))
			throw new IllegalArgumentException("Parameter isn't numeric on a numeric Field. :O");
		data[field] = parm;
	}
	
	private boolean isNumberic(String parm)
	{
		for(int i = 0, size = parm.length(); i < size; i++)
		{
			char c = parm.charAt(i);
			if(!Character.isDigit(c))
				return(false);
		}
		return(true);
	}
	
}

Natürlich ist Vererben nichts schlechtes, aber du musst bedenken, dass zu viele (eigendlich nicht nötige) Klassen das Projekt leicht auch genauso unleserlich wie zu wenige machen kann. In dem Beispiel ist es natürlich kein großes Use Case, aber stell dir vor du machst dann noch weiter: Fortbewegungsmittel, Fliegende/Schwimmende/FahrendeFortbewegunsmittel, Flugzeug, Zeppelin, Hubschrauber, Rakete, FliegenderTeppich, Schiff, UBoot, LKW, PKW, Motorad, Moped, Einrad und keins davon erweitert die vorherige Superklasse um etwas wirklich relevantes.
 
@Volvagia: Ich hatte schon Bedenken, ich würde mal wieder Anfängerüberforderung betreiben, indem ich ne Map ins Spiel bringe (wie mit dem Enum beim Umrechner)... Dank dir bin ich jetzt fein raus^^ 😀
(Sieht aber nachm schnellen Drüberlesen ziemlich gut aus 😉)
 
Zuletzt bearbeitet:
@Volvagia: Ich hatte schon Bedenken, ich würde mal wieder Anfängerüberforderung betreiben, indem ich ne Map ins Spiel bringe (wie mit dem Enum beim Umrechner)... Dank dir bin ich jetzt fein raus^^ 😀
(Sieht aber nachm schnellen Drüberlesen ziemlich gut aus 😉)

haha ja ich denke nach einer Woche Java werde ich es dann auch verstehen...
Aber ich denke bevor ich mich jetzt sofort in sowas hineinwerfe werde ich doch erst einmal ein Video Training Komplett durchgehen 😉

Aber vielen Dank für die mühe!!
Ich werde es mir am Sonntag mal zu Gemüte führen und den Samstag zum lernen nutzen.
Ich bin mir nur noch nicht sicher ob ich schneller Lerne indem ich mir selber Aufgaben stelle und sie dann versuche zu bewältigen oder aber ob ich das V2B Training durchgehe und danach mit "Projekten" anfange... :bahnhof:
 
Ich denke das ist von Mensch zu Mensch unterschiedlich und muss jeder für sich herausfinden.
Du könntest auch einfach versuchen herauszufinden was jede Zeile macht, was übrig bleibt findest du schnell per Google heraus. Wenn noch etwas übrig bleibt frag einfach, aber versuche es. Das Meiste sind nur Methodenaufrufe von vorgefertigten Klassen aus den SDK und Zugriff auf Arrays etc, was man eigendlich tagtäglich macht.
 
Hallo,

ich muss sagen wow was du alles nach ein paar Tagen kannst JDownHD. Vielleicht stell ich mir auch einfach nur an.

Ich würde gerne wissen, ob du irgendwelche Bücher benützt oder natürlich wie du schon gesagt hast bei V2B schaust (Was ist erstmal googeln musste).

Vielleicht könntest du es posten oder natürlich mir auch per pm schreiben. Am besten so präzise wie möglich. Danke.
 
Zuletzt bearbeitet:
@Volvagia: Ich bin mir nicht sicher, ob das ein gutes Beispiel ist um einen Anfänger OO beizubringen. Ích halte eigentlich wenig davon alle Eigenschaften einer Entität als String Array zu halten.
 
Natürlich ist es nicht so gut wenn man eine Zahl später als Zahl weiterverarbeiten will, aber die Möglichkeit hielt ich für eher unwahrscheinlich, da Kontaktdaten ja eigendlich immer nur zur Info als Text da sind. Und ich dachte dabei an die Darstellung und da kann es ja durchaus sehr nützlich sein. JTable z. B.
Leider hab ich an die Möglichkeit bei der ContactList garnicht mehr gedacht, deshalb gibt es keinen Zugriff per ID und ich verwende eine LinkedList. 😳
 

Zurück
Oben