Scope vs Gültigkeitsbereich

X

Xyz1

Gast
Ich war immer der Meinung, das beides dasselbe meint?
Ne,
Java:
int i;
//500 Zeilen...
i = 5;
//500 Zeilen...
Der Sichtbarkeitsbereich erstreckt sich über 1000 Zeilen, der Gültigkeitsbereich von i "nur" über 500. Vor int i; kann natürlich auch noch Zeilen sein...
 

mrBrown

Super-Moderator
Mitarbeiter
Ne,
Java:
int i;
//500 Zeilen...
i = 5;
//500 Zeilen...
Der Sichtbarkeitsbereich erstreckt sich über 1000 Zeilen, der Gültigkeitsbereich von i "nur" über 500. Vor int i; kann natürlich auch noch Zeilen sein...
In in welchem 500 Zeilen ist i außerhalb des eigenen Gültigkeitsbereich?

(Und völlig unabhängig davon ist der Tipp Unsinn, wäre schön, wenn du trollen sein lassen könntest)
 
X

Xyz1

Gast
Oh, vorsichtig, wegen "trollen" usw. Ein Wörterbuch zu rate zu ziehen ist nicht gerade der beste Beleg...
i ist natürlich vor der Initialisierung ungültig/nutzlos, daher ist eine späte Initialisierung zu vermeiden.

Aber um das etwas zu relativieren, tauchen diese Begriffe nur im universitären Umfeld auf - ein normaler Java Entwickler braucht sich darum nicht kümmern.

Es wäre schön wenn Du mit nicht weiter als "troll" usw. titulieren könntest.
 

mrBrown

Super-Moderator
Mitarbeiter
Ein Wörterbuch zu rate zu ziehen ist nicht gerade der beste Beleg...
Zur Übersetzung englischer Wörter ist üblicherweise ein Wörterbuch „der beste Beleg“.
Was ist denn deiner Meinung nach der passende Englische Begriff für „Gültigkeitsbereich“?

i ist natürlich vor der Initialisierung ungültig/nutzlos, daher ist eine späte Initialisierung zu vermeiden.
EDIT: siehe @kneitzel‘s Kommentar, der hat’s besser erklärt.

Aber um das etwas zu relativieren, tauchen diese Begriffe nur im universitären Umfeld auf - ein normaler Java Entwickler braucht sich darum nicht kümmern.
„Scope“ ist ein völlig üblicher Begriff, den auch jeder normale Java-Entwickler kennen sollte. Ist nicht grundlos auch in der JLS zu finden - im Gegensatz zu „Gültigkeitsbereich“.


Und selbst nach deine Auslegung sollte man auch den Gültigkeitsbereich möglichst klein halten.
 
K

kneitzel

Gast
Also ich kann Dir (@Tobias-nrw) nicht wirklich folgen.

Wenn wir hier reden, dann brauchen wir eine klare Grundlage. Diese wird bei Java durch die Java Language Specification gegeben. Und da ist eine solche Unterscheidung nicht zu finden.

Wenn man nun spezieller Begriffe nutzen möchte, dann sollten diese klar definiert werden vor der Nutzung. Ansonsten gehen wir von den üblichen Wörtern aus wie sie z.B. bei Wikipedia definiert sind.

Bezüglich Java ist es wie schon gesagt die JLS und da speziell das 4. Kapitel. So z.B. speziell:
https://docs.oracle.com/javase/specs/jls/se12/html/jls-4.html#jls-4.12.5
"A local variable (§14.4, §14.14) must be explicitly given a value before it is used, by either initialization (§14.4) or assignment (§15.26), in a way that can be verified using the rules for definite assignment (§16 (Definite Assignment))."
https://docs.oracle.com/javase/specs/jls/se12/html/jls-6.html#jls-6.3
"The scope of a local variable declaration in a block (§14.4) is the rest of the block in which the declaration appears, starting with its own initializer and including any further declarators to the right in the local variable declaration statement."

Hier könnte man meinen, dass "own initializer" meint, dass es mit der Initialisierung startet, aber das Bezieht sich auf:
https://docs.oracle.com/javase/specs/jls/se12/html/jls-14.html#jls-14.4, denn da wird der Aufbau einer Variablen Deklaration beschrieben welche auch ein VariableInitializer Teil enthalten kann. Und nur so macht der Part mit dem "including any further declarators" Sinn, denn bei der Deklaration von Variablen können mehrere Variablen deklariert werden. Aber das sieht man ja sehr schön in den Kästchen von 14.4.

(@mrBrown Hoffe ich durfte das auch ausführen?)

Was Wikipedia angeht: Da habe ich jetzt so auf Anhieb nicht diese Unterscheidung gefunden. Und daher wäre ich auch der Meinung, dass die einzelnen Begriffe das Gleiche bezeichnen. (Und nur weil eine Variable keinen gültigen Wert hat und somit nicht gelesen werden kann, bedeutet das nicht, dass die Variable ungültig ist. Die Variable ist ja verwendbar.)

Bezüglich So Bereiche groß zu halten: Diese Aussage nachdem wir hier mindestens zwei Diskussionen zu Clean Code hatten bei denen Du auch mitgemischt hast, finde ich schon etwas unverständlich....
 
X

Xyz1

Gast
Gegen Unwissenheit habe ich nix, aber tut doch bitte nicht so als hättet ihr meine Erklärungen nich verstanden.
@kneitzel Natürlich ist eine Variable, ehe initialisiert, ungültig... Was gibt es da überhaupt zu diskutieren???

@Lisa0709 Falls Du noch irgendwelche Fragen hast welche Du nicht mit den hier übrigen Personen diskutieren willst -> PN.
 

Meniskusschaden

Top Contributor
Wenn man nun spezieller Begriffe nutzen möchte, dann sollten diese klar definiert werden vor der Nutzung. Ansonsten gehen wir von den üblichen Wörtern aus wie sie z.B. bei Wikipedia definiert sind.
In in welchem 500 Zeilen ist i außerhalb des eigenen Gültigkeitsbereich?
Ich finde, @Tobias-nrw hat mit seinem Beispiel in #13 inzwischen schon gezeigt, was er hier mit dem Begriff Gültigkeitsbereich meint, nämlich die Codebereiche, für die der Compiler nicht sicher sein kann, dass die Variable initialisiert ist. In dem Beispiel also die ersten 500 Zeilen. Keine Ahnung, ob es dafür einen gebräuchlichen Begriff gibt.
 
K

kneitzel

Gast
Gegen Unwissenheit habe ich nix, aber tut doch bitte nicht so als hättet ihr meine Erklärungen nich verstanden.
@kneitzel Natürlich ist eine Variable, ehe initialisiert, ungültig... Was gibt es da überhaupt zu diskutieren???

Ja, ich frage mich auch, was es da überhaupt zu diskutieren gibt. Die JLS definiert alles klar und deutlich. Und da findet sich nichts von wegen "Variable is ungültig, ehe sie initialisiert wurde". Ungültige Variablen gibt es nicht. Es sei denn, Du zeigst es mir in der JLS.

Was in der JLS steht ist schlicht und einfach und kann für diesen Punkt in Kapitel 16 der JLS nachgelesen werden:
https://docs.oracle.com/javase/specs/jls/se12/html/jls-16.html
"Each local variable (§14.4) and every blank final field (§4.12.4, §8.3.1.2) must have a definitely assigned value when any access of its value occurs."

Und wenn Du den Unterschied zwischen "ungültiger Variablen" und "Variable hat keinen definierten Wert" nicht siehst, dann kann ich Dir auch nicht helfen.

Und wenn die Variable "ungültig" ist: Wieso kann man der dann etwas zuweisen? Also ist sie doch nicht wirklich ungültig...

Ich finde, @Tobias-nrw hat mit seinem Beispiel in #13 inzwischen schon gezeigt, was er hier mit dem Begriff Gültigkeitsbereich meint, nämlich die Codebereiche, für die der Compiler nicht sicher sein kann, dass die Variable initialisiert ist. In dem Beispiel also die ersten 500 Zeilen. Keine Ahnung, ob es dafür einen gebräuchlichen Begriff gibt.

Also da kann man viele Begriffe verwenden. Vor der Initialisierung einer lokalen Variable ist der Wert der Variable undefiniert. Das wäre eine Aussage, die mann treffen könnte. Oder man nimmt Formulierungen aus der JLS und spricht von "Variable ohne mit Sicherheit zugewiesenem Wert".

Und was @Tobias-nrw meint, war aus dem Kontext schon verständlich. Aber was er gesagt hat, ist so schlicht falsch und nicht durch die JLS gedeckt. Die Stellen der JLS, in denen diesbezüglich etwas zu finden ist sowie die wichtigen Sätze habe ich gebracht. Das sind einfache Hinweise auf Fakten und auf die kann @Tobias-nrw gerne eingehen. Aber er geht ja auch auf die Fakten nicht einmal ein. Somit sehe ich hier noch nicht einmal eine Diskussion...
 

temi

Top Contributor
@Tobias-nrw Irgendwie mag ich deine Art nicht, aber das ist meine persönliche Meinung. Und tatsächlich ist für mich Scope und Gültigkeitsbereich weiterhin identisch.
 

mrBrown

Super-Moderator
Mitarbeiter
Ich finde, @Tobias-nrw hat mit seinem Beispiel in #13 inzwischen schon gezeigt, was er hier mit dem Begriff Gültigkeitsbereich meint, nämlich die Codebereiche, für die der Compiler nicht sicher sein kann, dass die Variable initialisiert ist. In dem Beispiel also die ersten 500 Zeilen. Keine Ahnung, ob es dafür einen gebräuchlichen Begriff gibt.
Allerdings ist seine Aussage, dass man den Gültigkeitsbereich maximieren sollte, trotzdem Unsinn, und bliebt das Gegenteil von Scope minimieren
 
X

Xyz1

Gast
Allerdings ist seine Aussage, dass man den Gültigkeitsbereich maximieren sollte, trotzdem Unsinn, und bliebt das Gegenteil von Scope minimieren
Sichtbarkeitsbereich minimieren und Gültigkeitsbereich maximieren bedeutet im Klartext, eine Variable umgehend zu initialisieren... Hättest Du 5 Sekunden darüber nachgedacht, anstatt Verschwörungstheorien aufzustellen, hättest Du das gewusst.

@temi Glaube wem Du willst. :p
 

Meniskusschaden

Top Contributor
Allerdings ist seine Aussage, dass man den Gültigkeitsbereich maximieren sollte, trotzdem Unsinn, und bliebt das Gegenteil von Scope minimieren
Es geht ja um die Kombination. Ich würde sagen es soll bedeuten, Deklaration und Initialisierung möglichst nahe zueinander zu legen und das Ganze in einen möglichst kurzen (notfalls zusätzlichen) Block zu packen.
 

mrBrown

Super-Moderator
Mitarbeiter
Sichtbarkeitsbereich minimieren und Gültigkeitsbereich maximieren bedeutet im Klartext, eine Variable umgehend zu initialisieren... Hättest Du 5 Sekunden darüber nachgedacht, anstatt Verschwörungstheorien aufzustellen, hättest Du das gewusst.
Und genau damit tut man nichts, um den Scope zu minimieren. Die Gültigkeit maximieren passiert in Code um den es hier mal ging, hilft allerdings nichts, sondern ganz im Gegenteil fördert es Fehler. Möglichst spät initialisieren dagegen führt im Zweifel beim Kompilieren zu Fehlern, wenn man die Variable ungewollt nutz.
Hättest du mal 5 Sekunden nachgedacht, würdest du das vielleicht auch merken.
 

mrBrown

Super-Moderator
Mitarbeiter
Es geht ja um die Kombination. Ich würde sagen es soll bedeuten, Deklaration und Initialisierung möglichst nahe zueinander zu legen und das Ganze in einen möglichst kurzen (notfalls zusätzlichen) Block zu packen.
Wenn der Scope minimal ist, führt Gültigkeitsbereich maximieren immer zu einer unnötig frühen Initialisierung, sonst ließe sich schon der Scope kleiner wählen - und produziert damit wieder mehr Fehlerquellen.

(Die Fälle, in denen das überhaupt möglich ist, sind aber eh minimal)
 
K

kneitzel

Gast
Wenn ich den Sichtbarkeitsbereich minimiere, dann impliziert dies doch, dass der Bereich, in dem die Variable auch einen gültigen Wert hat, maximiert ist.
Denn Sichtbarkeitsbereich minimiert bedeutet doch, dass zeitnah nach der Deklarierung auch die Initialisierung erfolgt. Sollten erst andere Befehle kommen, dann würde es ja implizieren, dass der Sichtbarkeitsbereich noch nicht minimal ist.

Und die Aussage, dass eine Initialisierung zeitnah erfolgen soll würde ich so alleine nicht stehen lassen, denn da könnte sonst jemand ein Best Practice draus ableiten, dass man lokale Variablen einfach immer mit 0 initialisert wie es z.B. bei Felder ja schon der Fall ist. Dann hat man aber nicht mehr die Unterstützung des Compilers, der prüft, dass die Variable erst initialisiert wurde ....
 

mrBrown

Super-Moderator
Mitarbeiter
Um mal ein Beispiel zu bringen, angefangen mit diesem Code:
Java:
private void foo() {
  final int a;
  ...
  if (x) {
    a = 1;
  } else {
    a = 2;
  }
  ...
}
Als


Stumpfes Gültigkeitsbereich maximieren:

Java:
private void foo() {
  int a = 2;
  ...
  if (x) {
    a = 1;
  }
  ...
}

Hilft nicht, Scope bleibt maximal, Deklaration und Verwendung ist getrennt, zusätzlich wird die Zuweisung im if nicht geprüft und die Variable ist nicht final.


Stumpfes Scope minimieren:

Java:
private void foo() {
  ...
  final int a;
  if (x) {
    a = 1;
  } else {
    a = 2;
  }
  ...
}
Scope ist jetzt minimal, Compiler checkt die Zuweisungen, Deklaration steht bei der ersten Verwendung. Gültigkeitsbereich ist aber nicht Maximal, der ließe sich noch auf die Zeile der Deklaration aufweiten.

Scope minimieren & Gültigkeitsbereich maximieren

Java:
private void foo() {
  ...
  int a = 2;
  if (x) {
    a = 1;
  }
  ...
}

Scope ist minimal, Gültigkeit maximal, aber: Compiler prüft zweite Zuweisung nicht & Variable kann nicht final sein = mögliche Fehlerquellen, die es ohne maximalen Gültigkeitsbereich nicht gab.


Und als letzte Variante, Scope minimieren und Refaktorieren:

Java:
private void foo() {
  ...
  final int a = getA(x);
  ... 
}
private int getA(... x) {
  if (x) {
    return 1;
  } else {
  return 2; 
}
Minimaler Scope, minimale Gültigkeit, alles vom Compiler gecheckt.


finalNutzung nah bei DeklarierungCompilerprüfungkleiner Scope
Ursprünglich JaNeinJaNein
minimaler ScopeJaJaJaJa
maximaler GültigkeitsbereichNeinNeinNeinNein
Scope und GültigkeitsbereichNeinJaNeinJa
refactoredJaJaJaJa
 
X

Xyz1

Gast
Denn Sichtbarkeitsbereich minimiert bedeutet doch, dass zeitnah nach der Deklarierung auch die Initialisierung erfolgt.
Nein, eine Variable erst spät deklarieren
Wenn ich den Sichtbarkeitsbereich minimiere, dann impliziert dies doch, dass der Bereich, in dem die Variable auch einen gültigen Wert hat, maximiert ist
Nein, es gibt auch Sichtbarkeitsbereiche, die Du nicht minimieren kannst

Okay, gibts zu, du hast keine Ahnung was mit „Scope minimieren“ überhaupt gemeint ist
Psychologisch nennt man das Transfer... eigene "Unzulänglichkeiten" auf andere...

So viel von mir... ich beteilige mich nicht mehr am Thema. :)
 
K

kneitzel

Gast
Also noch einmal in etwas anderen Worten, damit auch @Tobias-nrw es versteht:

Eine Konsequenz / Folge der Minimierung der Sichtbarkeit ist, dass eine Variable zeitnah nach der Deklaration auch initialisiert wird.Wenn zwischen der Deklaration und der Initialisierung andere Befehle sind, dann könnte man diese Befehle ja vor die Deklaration der Variablen verschieben und so die Sichtbarkeit verringern.

Ein Fall, in dem Du den Sichtbarkeitsbereich nicht verringern kannst aber den Bereich, in dem die Variable einen definierten Wert hat, erhöhen kannst, dann hast Du lediglich eine Initialisierung ohne wirklichen Sinn..... Das sind die Fälle, die @mrBrown ja sehr schön aufgezeigt hat und die dazu führen, dass die Unterstützung des Compilers für mögliche Fehler bezüglich nicht Initialisierung verloren geht....

Aber was auch sehr schön von ihm aufgezeigt wurde: Im Bereich Clean Code ist der Vorschlag von @Tobias-nrw unnötig, denn das Resultat sollte wenn dann ein entsprechendes Refactoring sein, das ja auch sehr schön verdeutlicht wurde.
 

mrBrown

Super-Moderator
Mitarbeiter
Nein, es gibt auch Sichtbarkeitsbereiche, die Du nicht minimieren kannst
Beispiel?
nicht lokale Deklarationen
also Instanz-/Klassenvariablen?

Oder meinst du was anderes, falls ja, zeig mal ein richtiges Beispiel.


Ja, das ist das einzig richtig, was ein normal denkender Mensch tun kann, wenn keine Argumentation mehr greift.

Ihr kennt die Fachbegriffe nicht, demzufolge sind sie für euch falsch... Dann seis so.
Ich glaube ja an das gute im menschen und kann mir nicht vorstellen, dass du da absichtlich machst - aber, hast du dir diesen Thread auch mal durchgelesen?

Auf der einen Seite stehe ellenlange Texte mit Erklärungen und Beispielen, auf der anderen halbe Sätze und unterschwellige Beleidigungen.
Du bist dabei nicht auf der Seite mit langen Texten...


Du bist btw der, der „Gültigkeitsbereich“ eingeführt hat, was hier in diesen Thread der „Fachbegriff“ mit am wenigsten definierter Bedeutung sein dürfte.
Dem gegenüber steht „Scope“, was in der JLS definiert ist, und was niemand anders als in der Definition verwendet.
 

Der Wissende

Mitglied
Java:
int i;
//500 Zeilen...
i = 5;
//500 Zeilen...

Den einzigen Fachbegriff, den ich für sowas kenne, ist einfach "beschissener Code". Wenn eine lokale Variable über 500 Zeilen verwendet wird, dann geändert, und dann weiter verwendet wird, bedeutet ja, dass die Methode rießig ist. Und jetzt komm nicht wieder mit irgendwelchen Performanztheorien. In Java spielt es eine rießige Rolle, was der JIT macht und große Methoden können deutlich schlechter optimiert werden, als kurze. Da fällt es nicht ins Gewicht, ob du nun nur eine Variable nutzt und diese dann immer wieder anders verwendest anstatt 10 Variablen in kurzen Methoden.
 
X

Xyz1

Gast
Den einzigen Fachbegriff, den ich für sowas kenne, ist einfach "beschissener Code".
Man könnte auch sagen, Du hast keine Ahnung...

Wenn eine lokale Variable über 500 Zeilen verwendet wird
Erster Fehler, diese Variable kann nicht über 500 Zeilen verwendet werden...

Den Rest des Gesülzes lese ich mir nicht weiter durch.


Lustig, dass Namen nach Namensänderungen neu vergeben werden
Er sollte sich ein anderes Hobby suchen...
 

mrBrown

Super-Moderator
Mitarbeiter
Erster Fehler, diese Variable kann nicht über 500 Zeilen verwendet werden...
Also laut dir:
Java:
int i;
//500 Zeilen...
i = 5;
//500 Zeilen...
Der Sichtbarkeitsbereich erstreckt sich über 1000 Zeilen, der Gültigkeitsbereich von i "nur" über 500. Vor int i; kann natürlich auch noch Zeilen sein...
Ist der Gültigkeitsbereich 500 Zeilen lang...oder willst du uns jetzt sagen, dass die Variable gar nicht im gesamten Gültigkeitsbereich verwendet werden kann? :eek:
 

Der Wissende

Mitglied
Man könnte auch sagen, Du hast keine Ahnung...
Sorry bin noch Troll in Ausbildung.... Hoffe ich kann von dir noch viel lernen

Erster Fehler, diese Variable kann nicht über 500 Zeilen verwendet werden...
Danke für den Input, erstmal unhaltbare Behauptungen aufstellen

Den Rest des Gesülzes lese ich mir nicht weiter durch.
Dann einfach mal die Diskussion ohne Argumente beenden ...

Er sollte sich ein anderes Hobby suchen...
Ne ich find Trolle trollen ein ziemlich reizvolles Hobby ZwinkerSmiley
 

Der Wissende

Mitglied
Du merkst doch selber, dass du keine Ahnung von Java hast... Aber Du kannst natürlich gerne versuchen, eine uninitialisierte Variable zu verwenden...
Du merkst doch selber, dass du nicht lesen kannst. Ich hab gesagt, dass eine Methode mit 1000 Lines of Code "beschissener Code" ist.

Eine Variable ist ab den Zeitpunkt gültig ab dem du sie deklariert hast, das du darauf nicht lesend zugreifen darfst, davor beschützt dich der Compiler, aber sie ist gültig ein Indiz dafür ist, dass du sie kein zweites mal deklarieren darfst. Wenn du also sagst, dass der Gültigkeitsbereich maximiert werden soll, dann ist dein Beispiel dafür oben genau das was ich darunter verstehe Gültigkeitsbereich = Der Compiler kennt die Variable.

Was du vielleicht meinst, ist, dass die Initialisierung so nah wie möglich bei der Deklarierung erfolgen sollte. Was dann aber wieder maximiert bedeuten soll, weiß ich nicht... Vielleicht doch die 500 Line of "beschissener Code" danach... ZwinkerSmiley
 
X

Xyz1

Gast
[blabla]
Wenn du also sagst, dass der Gültigkeitsbereich maximiert werden soll, dann ist dein Beispiel dafür oben genau das was ich darunter verstehe Gültigkeitsbereich = Der Compiler kennt die Variable.
Das war eine Veranschaulichung, um den Unterschied zwischen Sichtbarkeitsbereich und Gültikeitsbereich zu erklären. Nicht mehr, nicht weniger. Vor welche Wand bist Du heute gelaufen?
 

Der Wissende

Mitglied
Das war eine Veranschaulichung, um den Unterschied zwischen Sichtbarkeitsbereich und Gültikeitsbereich zu erklären. Nicht mehr, nicht weniger. Vor welche Wand bist Du heute gelaufen?
Wow bist du toll, du definierst hier lustig Sachen und willst damit recht haben. Da du es ja eh nur wieder mit blabla und nicht gelesen machst nur kurz.... Sichbarkeitsbereich ist was gaaaaaanz anderes (private, public und so) hier geht es um scope vs Gültigkeitsbereich.... Das ist ungefähr so, als würden wir über car und Auto reden... wobei Auto bei dir 5 Räder hat und mit den Füßen angetrieben wird.
 

Neue Themen


Oben