Lektion 5 - Wir malen eine Häuserreihe

Erstellt von Frithjof Sat, 31 Mar 2007 15:16:00 GMT

In dieser Lektion malen wir endlich eine Hausreihe. In Lektion 4 haben wir Variablen eingeführt, weil wir sie hier erstmals wirklich brauchen. Wir haben es uns nämlich zur Aufgabe gestellt, mehrere Häuser nebeneinander zu malen, ohne die Zeichenketten für die Häuser im Programmcode zu wiederholen! Das wäre zu einfach, und würde für 3 Häuser etwa so aussehen:


  require 'rubykids'

  schreibe " /^\\  /^\\  /^\\ " 
  schreibe " |.|  |.|  |.|  " 
  schreibe " |_|  |_|  |_|  " 
Die Zeichenkette für das Dach ist etwas gegenüber den Etagen darunter verschoben, das ist aber ok weil wir ja für die rechte Dachseite zweimal den Backslash nehmen müssen.

In Kreisen guter Softwareentwickler (zu denen du als Rubykid sowieso gehörst) sagt man von solchem Programmcode auch, dass er stinkt (der englische Fachausdruck dafür heißt smell). Was macht man nun mit stinkendem Code? Du weißt ganz bestimmt, was man mit stinkenden Windeln macht – man wechselt sie! Das machen wir nun auch – wir wechseln, d.h. verändern den Code solange, bis er nicht mehr oder zumindest nicht mehr so sehr stinkt.

Der Code oben stinkt deswegen, weil wir für 3 Häuser auch dreimal die entsprechenden Zeichen hingeschrieben haben. Wir wollen nun erreichen, nur ein einziges mal die Zeichen für ein Haus hinzuschreiben, aber trotzdem mehrere Häuser damit zu malen. Das schreit förmlich nach einer Schublade in die wir die Zeichen für unser Haus ablegen und dann beliebig oft wiederverwenden können. Versuche es einmal selber, bevor du weiterliest!

Hast du es probiert? Mehrere Häuser nebeneinander auszugeben ist nicht so einfach, wie sie untereinander hinzumalen. Wir können ja immer nur zeilenweise etwas hinschreiben. Wir müssen somit zuerst alle Dächer in einer Zeile ausgeben, dann alle ersten Etagen und zum Schluß alle Erdgeschosse. Wir brauchen dafür 3 Variablen. Unser erster Entwurf für die Ausgabe von 3 Häusern nebeneinander sieht dann wie folgt aus:


  # lektion_05.rb

  require 'rubykids'

  dach         = "/^\\" 
  erste_etage  = "|.|" 
  erdgeschoss  = "|_|" 

  schreibe_leer
  schreibe dach,        dach,        dach
  schreibe erste_etage, erste_etage, erste_etage
  schreibe erdgeschoss, erdgeschoss, erdgeschoss

Der Programmcode sieht schon etwas besser aus (er stinkt nicht mehr so sehr). Die Zeichen für das Haus haben wir nur einmal aufschreiben müssen, weil wir die Einzelteile des Hauses in 3 Variablen verteilt haben. Aber, wenn wir diese Variablen ausgeben, schreiben wir sie mehr als einmal auf. Das ist wieder eine stinkende Sache. Wenn wir 5 oder noch mehr Häuser ausgeben müssen, haben wir ganz schön was zu tippen. Wir werden das Programm noch weiter verbessern:

  1. Wir wollen nur an einer Stelle im Programm etwas ändern müssen, wenn wir mehr oder weniger Häuser ausgeben wollen.
  2. Wir wollen etwas Platz zwischen den einzelnen Häusern schaffen.
  3. Schließlich soll zwischen den Häusern ein Zaun sein.

Du kannst es gerne wieder erst einmal selber probieren (Mama hilft dir bestimmt!). Wenn du fertig bist, vergleiche deine Idee mit der meinigen:


  # lektion_05.rb

  require 'rubykids'

  dach         = "/^\\" 
  erste_etage  = "|.|" 
  erdgeschoss  = "|_|" 

  anzahl_haeuser = 10
  platz_zwischen_haus = "   " 
  zaun                = ":::" 

  schreibe_leer
  # Alle Dächer in einer Zeile ausgeben:
  anzahl_haeuser.mal do
    schreib dach, platz_zwischen_haus
  end

  # Wir springen erst jetzt in die zweite Zeile!
  schreibe_leer 
  # Alle ersten Etagen in dieser Zeile:
  anzahl_haeuser.mal do
    schreib erste_etage, platz_zwischen_haus
  end

  # Und noch die dritte Zeile!
  schreibe_leer
  # Nun noch alle Erdgeschosse mit Zaun:
  anzahl_haeuser.mal do
    schreib erdgeschoss, zaun
  end

  schreibe_leer

Wir haben es nun geschafft, eine beliebig lange Häuserreihe zu malen, ohne im Code genausooft die Zeichen oder Variablen für das Haus hinschreiben zu müssen. Der Smell ist weitestgehend beseitigt.

Oder etwa nicht? Naja schau dir den Code nochmal genau an. Gibt es da wirklich keine Wiederholung mehr? Doch! Es fällt auf, dass wir 3 mal fast dieselbe Schleife schreiben – nur was innerhalb der Schleife passiert ist anders:


  # ...

  anzahl_haeuser.mal do
    # ...
  end

  anzahl_haeuser.mal do
    # ...
  end

  anzahl_haeuser.mal do
    # ...
  end

  # ...

Zum Glück aber sind es nur diese 3 Schleifen, egal wieviele Häuser wir ausgeben. Es würden erst dann mehr Schleifen werden, wenn wir unsere Häuser höher bauen möchten, also sie mit mehr Stockwerken ausstatten wollten. Uns genügen aber die 3 Stockwerke und daher stören uns auch die 3 Schleifen erst einmal nicht weiter. Im Verlauf wirst du noch einiges lernen, wie man auch solch eine Wiederholung von Schleifen vermeiden kann.

Peter und Livia

Peter: Mir ist überhaupt nicht klar, was denn so schlimm daran ist, wenn ich im Programmcode ein paar Sachen, die ich mehrmals brauche auch mehrmals hinschreibe. Mir ist es total egal, ob ich

  schreibe "Die Zahl lautet: ", 5
  schreibe "Die Zahl lautet: ", 7
programmiere, oder es so mache:

  text = "Die Zahl lautet: " 
  schreibe text, 5
  schreibe text, 7

Livia: Und was ist, wenn du statt Die Zahl lautet: einen anderen Text ausgeben möchtest? Du must deinen Programmcode an zwei Stellen auf die gleiche Weise ändern. Je mehr solcher gleichen Stellen du im Code hast, um so genauer musst du aufpassen, dass du auch an allen Stellen die Änderung durchführst. Vergisst du eine Stelle, dann hat dein Programm einen Fehler. Durch mehrfache Wiederholungen von gleichem Code können sich leicht Fehler beim Ändern einschleichen. Solange das Programm klein ist und du alleine es programmierst ist das meist kein Problem, aber wenn das Programm wächst (mehr Zeilen hat) und auch noch mehr Leute daran herumprogrammieren wird das ziemlich schnell zu einer nachhaltigen Fehlerquelle.

Peter: Ich finde es langweilig, eine ganze Reihe mit denselben Häusern zu malen.

Livia: Dann denk’ dir doch selber andere Häuser aus. Ein paar Anregungen findest du bestimmt unter www.ascii-art.de.

- Änderungen
22.09.2007, Unicodeproblem mit Umlauten

Trackbacks

Verwenden Sie den folgenden Link zur Rückverlinkung von Ihrer eigenen Seite:
http://www.rubykids.de/trackbacks?month=03&article_id=lektion05&year=2007&day=31

Meine Nachricht

Einen Kommentar hinterlassen

Comments