Erste Schritte Verwirrung in der Namensgebung

babuschka

Top Contributor
Hi,

ich finde es sehr verwirrend, daß die gleichen Dinge (hier ein Objekt) in Java tw. unterschiedlich angesprochen werden und es dann funktioniert, weil es nur ein Objekt gibt, von dem die Rede sein kann. Das ist für mich irgendwie so, als würde ich den Hans, der vor mir steht, plötzlich mal als Peter anreden, weil ja eh nur einer da ist, den ich meinen kann...
Zur Verdeutlichung poste ich hier mal mein aktuelles, noch recht kurzes Codebeispiel, an dem ich das gerade noch überblicke.
Java:
class TrackPopulation4
{
	public static void main(String args[]) {
		City smackoverAR = new City();
		smackoverAR.population = 2232;
		smackoverAR = doBirth(smackoverAR);
		System.out.println(smackoverAR.population);
	}
		public static City doBirth(City aCity) {
		City myCity = new City();
		myCity.population = aCity.population+1;
		return myCity;
	}
}

Wie gesagt, hier überblick ich das so gerade noch, wenn auch nur etwas mühsam und es funktioniert alles, weil es die ganze Zeit nur eine Instanz der City-Klasse gibt (okay, die doBirth-Methode erzeugt dann noch eine, aber die bekommt dann wieder die Eigenschaft von aCity, die wiederum identisch ist mit der Eigenschaft von smackoverAR.)
Wie würde ich das machen, wenn ich eine etwas größere Klasse vor mir habe? Festzustellen, wie viele Instanzen einer Klasse es gibt, ist eine Aussicht, die mich nicht entzückt...
Kann mir da irgendeiner weiterhelfen?
Gruß,

Javaswillerdenn
 
B

Beni

Gast
Die Begründung "weil es nur eine Instanz gibt" kann ich nicht so stehen lassen. Es funktioniert, weil eine Referenz immer nur auf ein Objekt zeigen kann. Zuerst zeigt "smackoverAR" auf die eine Stadt, danach auf die andere. Der Wechsel findet nicht zufällig statt, sondern weil du eine Zuweisung eingebaut hast.

Für deine Frage gibt es aber mehr als eine Antwort:
  • Es ist eine Verständnisfrage. Deine Erklärung wieso das Beispiel funktioniert ist... seltsam bis falsch. Da hilft vorallem Übung und Literatur.
  • Nur weil man etwas tun kann, muss man es nicht tun. Du findest diesen Beispielcode nicht gut? Dann verwende ihn nicht! Es gibt ganze Bücher die beschreiben, was man alles nicht tun sollte.
  • Guter Code zeichnet sich auch dadurch aus, dass jede Variable/Methode/Klasse nur eine Aufgabe hat. Welche Aufgabe hat "smackoverAR"? Nenne die Variable anders, so dass die Aufgabe aus dem Namen ersichtlich wird. Wenn du keinen Namen finden kannst, dann stimmt vielleicht etwas mit der Aufgabe nicht.
  • Objekt Orientieres Programmieren macht auch einiges einfacher: wieso erstellst du eine neue Stadt wenn jemand geboren wird? Das macht man in der Realität auch nicht so, aus gutem Grund. Viel natürlicher wäre es, das "population" Feld einfach um 1 zu erhöhen.

Festzustellen, wie viele Instanzen einer Klasse es gibt, ist eine Aussicht, die mich nicht entzückt
Verständlich, aber mir fällt auch kein guter Grund ein wieso man diese Information überhaupt benötigt.
 
Zuletzt bearbeitet von einem Moderator:

babuschka

Top Contributor
Hallo Beni,

alles klar - naja, eigentlich nicht wirklich ;-) Ich denke, das wird einfach mit der Zeit kommen.
Nur um Deine zwei Gegenfragen zu beantworten:
- "smackoverAR" bezeichnet die Stadt smackover in Arkansas, um die bzw. um deren Bevölkerung geht es in dem Beispiel.
- Warum da eine neue Instanz der City-Klasse erstellt wird? Gute Frage, müsste man den Autor fragen... da werden mehrere Möglichkeiten aufgezeigt, Informationen zu übergeben und das ist eben eine.
Gruß,

Javaswillerdenn
 
C

Conventions

Gast
Nur so nebenbei : dein Code ist so ziemlich ungünstig. Die Methode doBirth() sollte in der Klasse City stehen und dort die private Member incrementen. Stattdessen ist aber die Membervariable public und du veränderst sie von außen.
Das ist weder sauberer noch überhaupt irgendwie lesbarer oder nachvollziehbarer Code. Und so wirst du das auch nirgends finden außer bei anderen Anfängern.
 
N

nillehammer

Gast
Conventions hat gesagt.:
Nur so nebenbei : dein Code ist so ziemlich ungünstig[...]
Der Code stammt glaube ich aus Java für Dummies. Ein Buch mit offenbar mäßiger Qualität...

Ich denke, dass vielfach die Verwirrung von Anfängern mit der Sprache Java garnicht von Java herrührt, sondern von schlechten Büchern/Lehrern/Dozenten. Mangels eigenen Verständnisses/mangels didaktischer Fähigkeiten werden häufig Sachen vorgeführt, die zwar gehen, aber
a) so nicht gemacht werden sollten
b) eher verwirren, als zu erklären.

In diesem konkreten Fall sollte übrigens erklärt werden, dass eine Methode auch neue Objekte zurück geben kann. Und dazu so ein Code,... würg!
 
Zuletzt bearbeitet von einem Moderator:

babuschka

Top Contributor
Hallo nillehammer,

Stimmt genau. Um das Buch geht's. Ich hab eigtl bisher gute Erfahrungen mit der Buchreihe, deshalb hab ich mir das für den Anfang besorgt. Naja, nichts ist perfekt...
Gruß,

Javaswillerdenn
 

njans

Top Contributor
Java:
class TrackPopulation4
{
    public static void main(String args[]) {
        City smackoverAR = new City();
        smackoverAR.population = 2232;
        smackoverAR = doBirth(smackoverAR);
        System.out.println(smackoverAR.population);
    }
        public static City doBirth(City aCity) {
        City myCity = new City();
        myCity.population = aCity.population+1;
        return myCity;
    }
}

Was generell ein Problem hier ist: Semantik Struktur.
Das erste Problem ist eben,dass die main Methode vom Namen eben keine Aussage trifft, was passiert. Normalerweise würde man erwarten, dass diese das Programm initialisiert (Ui erstellen, etc.). In diesem Beispiel passiert nur etwas, was man vielleicht als "Ausschnitt" bezeichnen kann. Auch die Namen von Methoden sind schlecht gewählt: doBirth ? Viel eher incrementPopulation !
doBirth sollte wohl eher eine Methode von City sein und keine neue Stadt zurückgeben, wird denn jedes mal eine neue Stadt gegründet, wenn ein neuer Bürger geboren wird?!
Die Benennung der City Variable ist, wie schon von anderen erwähnt, sehr ungünstig. Da wäre es doch sinnvoller einer Stadt einen String als Namen mitzugeben und das nicht anhand des Variablennamens zu machen.

Das ist einfach ein furchtbares Beispiel und mir ist nicht klar, was der Schreiber in dem Buch damit zeigen will.
 
B

Beni

Gast
Das ist einfach ein furchtbares Beispiel und mir ist nicht klar, was der Schreiber in dem Buch damit zeigen will.
Mir wurde von einem Autor mal erklärt, wie diese Bücher z.T. entstehen:
Ein Verlag kommt auf die Idee, dass ein Buch zum Thema xy noch nett wäre. Eher zufällig wird ein gerade verfügbarer Autor kontaktiert. Dieser Autor "lernt" dann innerhalb von 2 Monaten das Thema, und schreibt darüber ein Sachbuch... Das ist einer der Gründe wieso manche Java-Bücher unterirdisch schlecht sind (ein anderer ist die miese Bezahlung und der Zeitdruck).

Ich weiss ja nicht welches Buch Du gerade liest, aber im Zweifelsfalle kann ich dir Einführung in Java mit BlueJ empfehlen.
 

njans

Top Contributor
Java von Kopf bis Fuß: Amazon.de: Kathy Sierra, Bert Bates, Lars Schulten, Elke Buchholz: Bücher
Java von Kopf bis Fuß, soll wohl ganz gut sein. Wird von vielen empfohlen, ich hab es persönlich nie gelesen, daher ohne persönlichen Eindruck.

@Beni
Also ich fand BlueJ damals als ein Qual! Es ist zwar mal schön zu sehen, wie es ist minimal anzufangen, aber der Ansatz "Wir erzeugen Objekte manuell und rufen dann darauf Methoden auf" finde ich eher irritierend. Ein großes Problem hatten wir letztens hier auch im Thread mit dem TicTacToe Spiel, bei dem die Struktur des Projektes massiv darunter leiden musste, dass man Aufrufe dann eben nicht über Eingabefelder geschehen, sondern über manuelles Anklicken von Methoden. Als ich dann das Projekt mal ausgebessert habe und das mit BlueJ gemacht habe, musste ich schwer schlucken, da BlueJ sehr, sehr, sehr rudimentäre Funktionen hat.
 
B

Beni

Gast
Ich kann BlueJ auch nicht weiterempfehlen, praktisch jedes andere Tool ist besser. Aber das Buch ist ok, und BlueJ ist nur ein kleiner Teil des Buches.
 

Ähnliche Java Themen

Neue Themen


Oben