Nun, Ruby ist tatsächlich nur eine Scriptsprache; sogar Python (als zweite ernstzunehmende moderne Scriptsprache in der Unix-Welt) macht mehr Zugeständnisse an Performance-Vorbehalte der Entwickler und Entscheider aus dem Compiler-Lager. Aber wer Ruby sagt, meint heute größtenteils Ruby on Rails (auch wenn im Schatten von RoR ein ganzer Garten anderer Ruby-basierter Frameworks gewachsen ist: ich weiß erstmal von Ramaze, Camping, Merb und Hobo, ohne sie wirklich ausprobiert zu haben). Und das Markenzeichen von RoR ist die extrem kurze Entwicklungszeit für Applikationen. (Jaja, neben DRY, Convention over Configuration und anderen Schlagworten.)
Aber RoR-Applikationen haben trotzdem einen Pferdefuß: Irgendwann schlägt die Stunde der Views, und die bauen aus HTML-Templates und -Schnippseln Seiten und Seitenfragmente für den Browser zusammen. Das Werkzeug der Wahl ist normalerweise ERb, was, ganz in der Tradition der JSPs, Code in HTML einbettet. Das Resultat ist oftmals unübersichtlich, und die generierten HTML-Seiten sind nur so gut wie die Templates. Darstellungsprobleme im Browser? Ein Tag verschluckt? Schachtelung der XHTML-Elemente falsch?
Wer kennt das nicht? Nun, wer HAML verwendet.
HAML ist (wieder mal) eine neue Template-Sprache. Ähnlich Python, welches Entwickler zwingt, nicht nur sauberen, sondern schönen Code zu schreiben (in dem Sinne in dem die äußere Form des Quelltextes seine logische Struktur widerspiegelt), zwingt HAML den Designer, nicht nur saubere, sondern schöne Views zu bauen. Das Beispiel von der HAML-Frontseite läßt leider nur erahnen, was möglich ist:
Aus
<table> <tr> <th>Name</th> <th>eMail</th> </tr> <% @adressen.each do |addr| %> <tr> <td><%= h(addr.name) %></td> <td><%= h(addr.email) %></td> </tr> <% end %> </table>
wird in HAML
%table
%tr
%th Name
%th eMail
- @adressen.each do |addr|
%tr
%td= h(addr.name)
%td= h(addr.email)
Ist ja dann schon ein Stück kürzer. Aber das Beispiel ist ja auch recht kurz. Was passiert jetzt, wenn die Zeilen abwechselnde Stile verwenden sollen?
<table> <% style="odd" %> <% 10.range.each do |num| > <tr class="<%=style%>"> <td>line <%=num%</td> </tr> <% style = (style == "odd" ? "even" : "odd") %> <% end > </table>
wird hier einfach zu
%table
- 10.range.each do |num|
%tr{:class=>"#{cycle('odd','even'}"}
%td
line
= num
[Update](Danke an neuholger für die Vereinfachung!)[/Update]
Ist doch irgendwie... einfach zu lesen, oder? Die Ersparnis in Zeilen ist bei diesem einfachen Beispiel noch nicht so beeindruckend (6 Zeilen zu 9 Zeilen), kann bei umfangreicheren Views aber schnell wachsen. Und vor allem geht eben nie die Zuordnung einer Zeile zu einem logischen Block verloren.
Zudem generiert HAML immer sauber formatiertes HTML: Auch Partials, die ja ihrerseits "ganz links" anfangen, bringen das System nicht aus dem Tritt. Und zuletzt gibt's als Zugabe zu HAML noch dessen CSS-Seite, SASS. Aber das ist wieder eine eigene Geschichte...
[Update](Apropos CSS: Damit das Beispiel von oben auch wirklich funktioniert, braucht man natürlich das passende CSS dafür -- wie jenes aus neuholgers Kommentar.)[/Update]
[Update] Updates vom 9.8.2011: Vereinfachung von neuholger eingebaut (Danke!). Zudem scheint es das HAML/SASS Lab nicht mehr zu geben, und die offiziellen Seiten von HAML und SASS sind umgezogen. [/Update]
1 Kommentar:
die ganzen "style =" Zeilen lassen sich auch noch kürzer darstellen:
%tr{:class=>"#{cycle('odd','even'}"}
Dann verwendet man ein Stylesheet mit den beiden Klassen und hat es schön einheitlich auf allen Seiten.
.even {
background_color: #eee;
}
.odd {
background_color: #ddd;
}
Kommentar veröffentlichen