Git Best Practices Meetup

Gestern war ich beim Git Best Practices Meetup der Open TechSchool. Dort wurde eine Git-Einführung zu den Konzepten von Pull-Requests, Branches, Forks, Merges und Fast-Forwards gegeben. Es wurde auch darauf hingewiesen, dass eine gute Commit-Message beschreibt WARUM man etwas gemacht hat. Viele Entwickler beschreiben aber meistens nur WAS man gemacht hat. Das WAS ist aber in der Git-Change-History ersichtlich, so dass es in der Commit-Message durchaus Sinn macht, die WAS-Information mit dem WARUM zu ergänzen.
Git Best Practices Meetup weiterlesen

JavaScript Variablen vernünftig auf Existenz prüfen

Der Aufruf von JavaScript-Variablen kann, wenn die gewünschten Variablen nicht definiert sind, zu schweren Fehlern führen. Es gibt jedoch gute Methoden, um Ausnahmefehler zu verhindern. Als Basis für die folgenden Techniken dient dieses Beispiel:

var person = {
  name: 'Benny'
};
 
if(person){
  console.log('Hello '+person.name+'!');
}

Wird die Variable person nicht definiert, kommt es bei der if-Abfrage zu folgendem Fehler: ReferenceError: person is not defined.

Dem Problem lässt sich entgegen wirken, wenn die Variable über das Elternelement window abgefragt wird:

1
2
3
if(window.person){
  console.log('Hello '+person.name+'!');
}

Diese Art von Abfragen funktioniert allerdings nur für die erste Stufe. Eine Abfrage auf window.person.name oder gar window.person.name.surname würde zu einem TypeError führen.

In einem solchen Fall muss schrittweise mit der logischen „UND“ Verknüpfung gearbeiten werden:

1
2
3
if(window.person && window.person.name){
  console.log('Hello '+person.name+'!');
}

Das Logische „UND“ sorgt dafür, dass nicht direkt auf window.person.name geprüft wird (was zum Fehlerfall führen würde) sondern zuerst auf window.person. Wenn window.person nicht vorhanden ist, dann kann die logische Verknüpfung überhaupt nicht mehr „wahr“ werden, so dass die Abfrage sofort (ohne Überprüfung auf window.person.name) beendet wird.

Eine noch tiefere Verschachtelung kann wie folgt gestaltet werden:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
var person = {
  name: {
    prename: 'Benny',
    surname: 'Neugebauer'
  }
};
 
if(window.person && 
   window.person.name && 
   window.person.name.surname){
  // Hello Benny Neugebauer!
  console.log('Hello'
    +' '
    +person.name.prename
    +' '
    +person.name.surname
    +''+'!');
}

Selbstverständlich funktioniert auch:

1
2
3
4
5
6
7
8
9
10
try{
  // Hello Benny Neugebauer!
  console.log('Hello'
    +' '
    +person.name.prename
    +' '
    +person.name.surname
    +''+'!');
}
catch(error){}