An dieser Stelle bemerkt der Autor zugegebe-nermaßen mit einer gewissen inneren Freude, dass man Skripte aus einem Buch nicht durch schlichtes Kopieren in Flash einfügen kann, sprich: Da
Trang 3ActionScript 2
Ein Lehr- und Übungsbuch
1 3
Trang 4ISBN 978-3-540-35179-5 e-ISBN 978-3-540-35182-5
DOI 10.1007/978-3-540-35182-5
Springer Heidelberg Dordrecht London New York
Die Deutsche Nationalbibliothek verzeichnet diese Publikation in der Deutschen grafie; detaillierte bibliografische Daten sind im Internet über http://dnb.d-nb.de abrufbar.
Nationalbiblio-© Springer-Verlag Berlin Heidelberg 2011
Dieses Werk ist urheberrechtlich geschützt Die dadurch begründeten Rechte, insbesondere die der Übersetzung, des Nachdrucks, des Vortrags, der Entnahme von Abbildungen und Tabellen, der Funksendung, der Mikroverfilmung oder der Vervielfältigung auf anderen Wegen und der Spei- cherung in Datenverarbeitungsanlagen, bleiben, auch bei nur auszugsweiser Verwertung, vorbe- halten Eine Vervielfältigung dieses Werkes oder von Teilen dieses Werkes ist auch im Einzelfall nur in den Grenzen der gesetzlichen Bestimmungen des Urheberrechtsgesetzes der Bundesrepublik Deutschland vom 9 September 1965 in der jeweils geltenden Fassung zulässig Sie ist grund- sätzlich vergütungspflichtig Zuwiderhandlungen unterliegen den Strafbestimmungen des Urhe- berrechtsgesetzes.
Die Wiedergabe von Gebrauchsnamen, Handelsnamen, Warenbezeichnungen usw in diesem Werk berechtigt auch ohne besondere Kennzeichnung nicht zu der Annahme, dass solche Namen im Sinne der Warenzeichen- und Markenschutz-Gesetzgebung als frei zu betrachten wären und daher von jedermann benutzt werden dürften.
Einbandgestaltung: KünkelLopka GmbH, Heidelberg
Gedruckt auf säurefreiem Papier
Springer ist ein Teil der Fachverlagsgruppe Springer Science+Business Media (www.springer.com)
Trang 5In erster Linie gebührt all meinen Studenten und Schülern Dank dafür, dass sie klaglos meinen gelegentlich sicher etwas anstrengenden Unterricht über sich er-gehen ließen und mir so Gelegenheit gaben, den einen oder anderen Workshop am lebenden Sujet auszutesten
Besonderen Dank schuldet der Autor jenen, die aktiv mit Rat und Tat zur Seite standen Namentlich seien genannt:
– „eyelan“ Benedikt Hocke, der mit seiner raschen Auffassungsgabe, lichem grafischen Geschick und großer Phantasie eine frühe Phase des Buches begleitete;
unvergleich-– Frau Nina Eichinger, die insbesondere ein passendes Layout entwickelte;
– Herr Richard Häusler, der angenehm kritisch größere Teile des Manuskripts tierte und manch einem hartnäckigen Fehler auf die Schliche kam
gou-Ein ganz großes Danke Schön an das Lektorat des Springer Verlags, das mit einer Engelsgeduld jede Terminübertretung des Autors ertragen hat und so das Fertigstel-len des Manuskriptes überhaupt erst ermöglichte
Und schließlich sei auch denjenigen gedankt, die die Entwicklung des Skripts langfristig mit kritischem Blick und manch aufmunterndem Kommentar begleiteten (2006: „Wieweit bist Du denn schon?“, 2007: „Ist denn wenigstens ein Kapitel fer-tig?“, 2008: „Hast Du schon angefangen?“, 2009: „Naja, wenn der Maya-Kalender mit 2012 Recht hat, musst Du Dich jetzt auch nicht mehr beeilen“)
Danksagung
Trang 6Einleitung
1 1
ActionScript: Geschichte, Versionen, Ausblick 2 5
Programmentwicklung und Programmiersprachen 3 11
3.1 Ansätze (Top-Down, Bottom-Up) 11
3.2 Algorithmus als Problemlösung 12
3.3 Hilfsmittel zur Entwicklung von Algorithmen 13
3.3.1 Flowcharts 14
3.3.2 Pseudo-Code 15
3.4 Beispiel-Algorithmus „Kaffee kochen“ 16
Programmierung und ActionScript 4 27
Framework und Codeorganisation 5 35
5.1 Skriptarten (Objekt- und Bildskript) 35
5.2 Anzahl der Bildskripte 37
5.3 Aufbau eines Skripts 37
Operatoren 6 41
6.1 Zuweisungsoperator 42
6.2 Arithmetische Operatoren 42
6.3 Inkrement-/Dekrementoperator 43
6.4 Stringoperatoren 44
6.5 Vergleichsoperatoren 46
6.6 Logische Operatoren 48
6.7 Bit-Operatoren 50
6.8 Sonstige 51
Variablen 7 55
7.1 Deklaration 55
7.2 Wertezuweisung 58
7.3 Reichweite 60
7.4 Parameter und Zählvariablen 62
7.5 Konstanten 62
Datentypen 8 63
8.1 Boolean 64
8.2 Number 64
Inhaltsverzeichnis
Trang 78.3 String 67
8.4 Null, undefined 67
8.5 MovieClip 68
8.6 Object 68
8.7 Void 68
Arrays 9 69
9.1 Arrays einrichten und die Länge definieren 69
9.2 Arrays bei der Deklaration füllen 70
9.3 Zugriff auf Inhalte 70
9.4 Arrays dynamisch füllen 72
9.5 Löschen von Elementen 74
9.6 Arrays sortieren und durchsuchen 77
9.7 Weitere Methoden 80
9.8 Mehrdimensionale Arrays 81
9.9 Assoziative Arrays 82
Funktionen 10 85
10.1 Funktionsdeklaration und -aufruf 85
10.2 Funktionen ohne Bezeichner 86
10.3 Gültigkeit 87
10.4 Verschachtelung von Funktionen 88
10.5 Parameter 89
10.6 Funktionen mit Rückgabewert (return) 91
10.7 Von Flash zur Verfügung gestellte Funktionen 92
10.8 Rekursion 93
Kontrollstrukturen 11 95
11.1 Bedingungen 95
11.1.1 Die if-Anweisung 95
11.1.2 Verschachtelte if-Anweisungen, logisches und, logisches oder 98
11.1.3 if else 99
11.1.4 else if 100
11.1.5 switch, break 101
11.2 Schleifen 103
11.2.1 for-Schleife 104
11.2.2 break, continue 108
11.2.3 while-Schleife 108
11.2.4 do while-Schleife 109
11.2.5 for in-Schleife 110
11.2.6 Endlosschleifen 111
MovieClip-Klasse 12 113
12.1 Eigenschaften von MovieClips 113
12.1.1 Adressierung von MovieClips 113
12.1.2 _x, _y, _xmouse, _ymouse, _width, _height 119
12.1.3 _xscale, _yscale 123
12.1.4 _rotation, _alpha, _visible 125
12.1.5 blendMode 128
12.1.6 _currentframe, _totalframes 130
12.2 Ereignisse 130
Trang 8ix Inhaltsverzeichnis
12.2.1 onEnterFrame 131
12.2.2 Schaltflächenereignisse von MovieClips 132
12.2.3 Maus-Ereignisse 135
12.3 MovieClip-Methoden 136
12.3.1 Zeitleistensteuerung 136
12.3.2 Objekte dynamisch einfügen 138
12.3.3 Drag and Drop 147
12.3.4 Kollision 148
12.3.5 Maskierung 150
12.3.6 Ausdehnung und Koordinaten 151
12.4 Die Mutter aller MovieClips: _root (_level0) 153
Zeichnungsmethoden der MovieClip-Klasse 13 155
13.1 Linien, Kurven und Füllungen 156
13.2 Verlaufsfüllungen 160
13.3 Ereignisse, Methoden, Eigenschaften 165
13.4 Geometrische Grundfiguren (Kreis, Oval, Polygon, Stern) 165
String, Textfield, Textformat 14 173
14.1 Strings erzeugen und String-Wert auslesen 173
14.2 Länge 174
14.3 Verkettung 174
14.4 Escape-Sequenzen und Sonderzeichen 174
14.5 ASCII-Zeichensatz 176
14.6 Teilstrings extrahieren 178
14.7 Teilstrings ermitteln 179
14.8 Groß-/Kleinbuchstaben 179
14.9 Text, Textfelder 180
14.10 Textauszeichnung/-formatierung 184
14.10.1 TextFormat 184
14.10.2 Formatierung mit HTML 188
14.10.3 Formatierung mit CSS 190
14.11 Darstellung größerer Textmengen 192
14.12 Eingabetext 193
Math-Klasse 15 199
15.1 Eigenschaften: Konstanten 199
15.2 Methoden 200
15.2.1 Auf- und Abrunden 200
15.2.2 Zufallszahlen 201
15.2.3 Weitere Methoden 205
Color-/ColorTransform-Klasse 16 207
16.1 Klassenpakete und Instanziierung von Klassen 207
16.2 Vollständiges Einfärben 208
16.3 Einfärben mit Hilfe einzelner Farbkanäle 209
Maus und Tastatur 17 213
17.1 Die Mouse-Klasse 213
17.1.1 Eigene Cursor 213
17.1.2 Mausereignisse 215
17.2 Tastatur 218
Trang 9BitmapData- und Filter-Klasse
18 221
18.1 Bitmap versus Vektor 221
18.2 Instanziierung der BitmapData-Klasse 223
18.3 Eigenschaften der BitmapData-Klasse 224
18.4 Methoden der BitmapData-Klasse 224
18.4.1 Dispose() 225
18.4.2 FillRect(), floodFill() 226
18.4.3 GetPixel(), getPixel32(), setPixel(), setPixel32() 227
18.4.4 LoadBitmap(), draw(), copyPixels(), clone() 229
18.4.5 Noise(), perlinNoise() 232
18.5 Optimierung mit Hilfe von BitmapData 235
18.6 Filter 235
18.6.1 Bevel-Filter 236
18.6.2 Blur-Filter 237
18.6.3 DropShadow-Filter 238
18.6.4 Glow-Filter 238
18.6.5 GradientBevel-Filter 239
18.6.6 GradientGlow-Filter 239
18.6.7 ColorMatrix-Filter 240
18.6.8 Convolution-Filter 241
18.6.9 DisplacementMap-Filter 242
Sound 19 245
19.1 Sound abspielen und stoppen 245
19.2 Einen Sound loopen 248
19.3 Externe Sounds 249
Externe Assets 20 251
20.1 Laden externer swf-Dateien 252
20.2 Eigenschaften der geladenen Dateien 257
20.3 Anzeigen der Ladekontrolle (Preloader mit getBytesLoaded()) 263
20.4 Überblenden bei Ladevorgängen 270
20.5 Alternative Ladekontrolle (Preloader mit der MovieClipLoader-Klasse) 275
20.6 Beispiel modulare Website 276
20.7 Code 280
XML 21 281
21.1 Aufbau von XML-Dokumenten 281
21.2 Laden von XML-Dokumenten (new XML, load(), onLoad, onData) 284
21.3 Zugriff auf den gesamten Inhalt einer XML-Datei (firstChild, ignoreWhite) 286
21.4 Verarbeitung einzelner Daten 287
Tween- und TransitionManager-Klasse 22 291
22.1 Tween-Klasse 291
22.2 Beschleunigungsklassen und -methoden 292
22.3 Eigenschaften (duration, finish, FPS, position, time) 294
22.4 Methoden 294
Trang 10xi Inhaltsverzeichnis
22.5 Ereignisse 295
22.6 Sukzessive Animation verschiedener Eigenschaften 296
22.7 TransitionManager-Klasse 298
22.8 Eigenschaften, Methoden und Ereignisse 299
22.9 Übergangstypen 300
Debugging 23 303
23.1 Fehlertypen 303
23.2 Erste Fehlerkontrolle mit Auto-Format 304
23.3 Das Nachrichtenfenster 308
23.4 Der integrierte Debugger 312
Geskriptete Animationen 24 317
24.1 Animationskategorien 317
24.2 Einmalige Animation 318
24.3 Animation mit onEnterFrame und fester Schrittweite 319
24.4 Animation mit setInterval() und fester Schrittweite 325
24.5 Zeitsteuerung 329
24.6 Dynamische Schrittweite 330
24.7 Feste Schrittanzahl 333
24.8 Fehlerquelle Schleife 337
24.9 Überprüfung von Grenzwerten 338
24.10 Grenzbedingung und Verwendung von Animationsobjekten 339
24.10.1 Löschen des Objekts 340
24.10.2 Bouncing off 342
24.10.3 Screen wrap 343
24.10.4 Neue Zufallsposition 344
Trigonometrie 25 345
25.1 Einige Grundlagen der planen Trigonometrie 345
25.2 Abstände zwischen Objekten 347
25.3 Kreise und Ellipsen 349
25.4 Spiralen 351
25.5 Code 354
25.6 Spiralförmige Animation eines Objekts 354
25.7 Sinustäuschung 357
25.8 Drehung eines Objekts zu einem anderen Objekt 358
25.9 Interaktiver Schlagschatten 360
25.10 Code 362
Effekte (Text 26 ) 365
26.1 Text vergrößern und ein-/ausblenden 365
26.2 Code 371
26.3 Einzelne Zeichen einfärben 372
26.4 Code 375
26.5 Einzelne Zeichen vergrößern und verkleinern 377
26.6 Code 378
26.7 Text mit Farbverlauf 378
26.8 Code 383
26.9 Schreibmaschineneffekt 385
Trang 1126.10 Text einblenden aus Zufallsbuchstaben 386
26.11 Code 389
26.12 Weitere Effekte 390
Effekte (Grafik 27 ) 391
27.1 Einfärben über einzelne Farbkanäle 391
27.2 Code 397
27.3 Organische Moleküle 399
27.4 Code 402
27.5 Beleuchtungseffekt mit Maske 402
27.6 Code 405
27.7 Überblendeffekt mit Maske 406
27.8 Code 409
27.9 Mosaik-Effekt 410
27.10 Code 413
Effekte (Maus) 28 415
28.1 Maus(ver)folger 416
28.2 Code 426
28.3 Initialisierung von Animationen 428
28.4 Code 432
28.5 Eigenschaftsänderungen 433
28.6 Code 435
Interface und Navigation 29 437
29.1 Check Boxes 437
29.2 Radio Buttons 440
29.3 Combo-Box 442
29.4 Code 446
29.5 Variante 447
29.6 Slider 448
29.7 Drag and Drop-Elemente 449
29.8 Code 453
29.9 Einfaches Fenster-System mit scale9Grid 454
29.10 Code 460
29.11 Varianten und Erweiterungen 462
Menü-Systeme 30 463
30.1 Kreismenüs 464
30.2 Code 471
30.3 Elliptisches Menü 473
30.4 Code 479
30.5 Akkordeon 480
30.6 Code 485
30.7 Drop Down-Menü 486
30.8 Code 490
Bildergalerien 31 493
31.1 Einfache Galerie mit Slider und internen Assets 494
31.2 Code 502
31.3 Eine Variante 503
Trang 12xiii Inhaltsverzeichnis
31.4 Code 506
31.5 Galerie mit externen Assets 506
31.6 Code 518
31.7 Einige Varianten 520
Spiele 32 521
32.1 Pairs 521
32.2 Code 527
32.3 Puzzle 528
32.4 Code 539
Ressourcen 33 543
33.1 Literatur 543
33.2 Lernvideos 545
33.3 Webseiten 546
Sachverzeichnis 551
Trang 13Abbildung 1: Standardsymbole zur Entwicklung eines Flowcharts 14
Abbildung 2: Beispielhaftes Flussdiagramm (Programm logik) 15
Abbildung 3: Variablen- und Funktionsdefinition 23
Abbildung 4: Anweisungsblock 24
Abbildung 5: Argument, Parameter, Schleife 24
Abbildung 6: Anweisung, Bedingung, Funktionsaufruf 25
Abbildung 7: Integrierter AS-Editor 31
Abbildung 8: Zuweisung eines Objektskripts 36
Abbildung 9: Fixieren des Skriptfensters 36
Abbildung 10: Operanden und Operatoren 41
Abbildung 11: Codehinweise zu Datentypen 55
Abbildung 12: Arraylänge, -index und -inhalte 71
Abbildung 13: Verwendung einer parametrisierten Funktion 90
Abbildung 14: Vorgegebene Funktionen 93
Abbildung 15: Fehlermeldung bei Endlosschleife 111
Abbildung 16: Eigenschaftsfenster eines MovieClips auf der Bühne 113
Abbildung 17: Verschachtelter MovieClip auto 115
Abbildung 18: Pfadhierarchie 116
Abbildung 19: Relative Adressierung mit _parent 119
Abbildung 20: Kartesisches Koordinatensystem 119
Abbildung 21: Kartesisches Koordinatensystem in Flash (Hauptzeitleiste) 120
Abbildung 22: Skalieren eines MovieClips 123
Abbildung 23: Spiegelung mit _xscale 124
Abbildung 24: Positionierung der MovieClips 128
Abbildung 25: Überlappende MovieClips 134
Abbildung 26: Beispielhafter Aufbau der Übung 137
Abbildung 27: Kollisionserkennung mit hitTest() 150
Abbildung 28: Ergebnis von getBounds() bei verschiedenen Koordinatensystemen 152
Abbildung 29: Beispiel einer geskripteten Zeichnung 157
Abbildung 30: Haus und Grundstück des Autors 158
Abbildung 31: Zur Funktionsweise von curveTo() 159
Abbildung 32: Zweifarbiger, radialer Farbverlauf Rot – Orange 161
Abbildung 33: Koronaartiger Grafikeffekt mit Verlaufs füllung 163
Abbildung 34: Verschiebung des Verlaufsmittelpunkts 163
Abbildung 35: Oval 168
Abbildungsverzeichnis
Trang 14xvi Abbildungsverzeichnis
Abbildung 36: Händisch erstelltes Textfeld 180
Abbildung 37: Textformatierung mit der TextFormat-Klasse 186
Abbildung 38: Erweiterte Textformatierung mit der TextFormat-Klasse 186
Abbildung 39: Verwendung der Komponente UIScrollBar 193
Abbildung 40: Eingabefeld für die Mail-Adresse 196
Abbildung 41: Einfärben eines MovieClips 208
Abbildung 42: Erweiterte Farboptionen einer MovieClip-Instanz 209
Abbildung 43: Eigener Mauszeiger in Aktion 214
Abbildung 44: Erzeugung eines Punktrasters mit setPixel() 228
Abbildung 45: Erzeugung eines zufälligen Musters mit setPixel32() 228
Abbildung 46: Ausschnittweises Kopieren einer Grafik 231
Abbildung 47: Erzeugung einer Störung mit Hilfe der perlinNoise()-Methode 234
Abbildung 48: Skinners „Pflanzengenerator“ 236
Abbildung 49: Bevel-Filter 237
Abbildung 50: Bevel-Filter mit maximaler Stärke 237
Abbildung 51: GradientBevel-Filter 239
Abbildung 52: 4 × 5-Matrix des ColorMatrix-Filters 240
Abbildung 53: DisplacementMap-Filter 243
Abbildung 54: Einstellungen für das Sound-Verhalten 246
Abbildung 55: Weitere Einstellungen für das Sound-Verhalten 247
Abbildung 56: Externer Ladevorgang in der Hauptzeitleiste 253
Abbildung 57: Auswirkungen von _root auf externe Ladeprozesse 255
Abbildung 58: Verschachtelte Ordnerstruktur für externe Lade vorgänge 255
Abbildung 59: Fehlermeldung bei fehlgeschlagenem Ladeaufruf 256
Abbildung 60: Eigenschaftsänderungen bei externen Ladevorgängen 258
Abbildung 61: Fehlerhafte Positionierung einer extern geladenen Grafik 260
Abbildung 62: Bandbreiten-Profiler zur Kontrolle des Ladevorgangs 261
Abbildung 63: Konfiguration der Download-Simulation 262
Abbildung 64: Simulation eines externen Ladevorgangs 262
Abbildung 65: Zeichnen der Elemente des Ladebalkens 269
Abbildung 66: Aufbau der Anwendung 273
Abbildung 67: Phase 1 des Ladevorgangs 274
Abbildung 68: Phase 2 des Ladevorgangs 274
Abbildung 69: Phase 3 des Ladevorgangs 274
Abbildung 70: Datei literatur1.xml im Internet Explorer 282
Abbildung 71: Fehlerhaftes XML-Dokument im Internet Explorer 283
Abbildung 72: Beschleunigungseffekt Back.easeIn 293
Abbildung 73: Beschleunigungseffekt Bounce.easeIn 293
Abbildung 74: Beschleunigungseffekt Elastic.easeIn 293
Abbildung 75: Beschleunigungseffekt Regular.easeIn 293
Abbildung 76: Beschleunigungseffekt Strong.easeIn 293
Abbildung 77: Sukzessives Ausführen mehrerer Tweens 297
Abbildung 78: Abprallen am rechten Rand 297
Abbildung 79: Fehlermeldung im Compiler-Fenster (1) 304
Abbildung 80: Fehlermeldung im Compiler-Fenster (2) 305
Abbildung 81: Fehlermeldung im Compiler-Fenster (3) 306
Abbildung 82: Fehlermeldung im Compiler-Fenster (4) 306
Abbildung 83: Fehlermeldung im Compiler-Fenster (5) 307
Trang 15Abbildung 84: Auflistung aller Variablen zur Laufzeit 313
Abbildung 85: Abspeichern des Inhalts des Nachrichtenfenster 313
Abbildung 86: Debugger-Fenster 314
Abbildung 87: Animation durch permanente Änderung der Drehung 319
Abbildung 88: Horizontale und vertikale Bewegung 320
Abbildung 89: Bewegung und Vorzeichenumkehr 323
Abbildung 90: Positionsberechnung über wechselnde Entfernung (1) 332
Abbildung 91: Positionsberechnung über wechselnde Entfernung (2) 332
Abbildung 92: Berechnung der Schrittweite aus Schrittanzahl und Entfernung 334
Abbildung 93: Bewegung und Grenzbedingung 339
Abbildung 94: Überschreiten des Grenzwertes 339
Abbildung 95: Animationsobjekt innerhalb/außerhalb der Bühne 341
Abbildung 96: Abprallen am rechten Screenrand 343
Abbildung 97: Rechtwinkliges Dreieck 345
Abbildung 98: Abstandsmessung zwischen zwei beliebigen Punkten und der Satz des Pythagoras 346
Abbildung 99: Trigonometrische Funktionen und Kreisberechnung 346
Abbildung 100: Der Einheitskreis 347
Abbildung 101: Abstandsmessung zwischen MovieClips 347
Abbildung 102: Spirale mit linear anwachsendem Radius 352
Abbildung 103: Spirale mit exponentiell anwachsendem Radius 353
Abbildung 104: Spiralförmig zu animierende Rakete 355
Abbildung 105: Spiralförmig animierter Bleistift 356
Abbildung 106: Sinustäuschung 358
Abbildung 107: Ausrichtung des Fahrzeugs vor der Drehung zur Maus 359
Abbildung 108: Veränderung des Schlagschattens per Maus 359
Abbildung 109: Animierter Text (Änderung von Größe, Deckkraft, Position) 365
Abbildung 110: Einbetten eines Fonts in der Bibliothek 366
Abbildung 111: Animiertes Einfärben einzelner Buchstaben 373
Abbildung 112: Text mit statischem Farbverlauf 379
Abbildung 113: Farbverlauf Rot – Gelb – Grün 380
Abbildung 114: Verschiedene Ausrichtungen des Farbverlaufs 381
Abbildung 115: Aufbau der Animation mit Farbverläufen 382
Abbildung 116: Schreibmaschineneffekt 385
Abbildung 117: Text einblenden aus Zufallsbuchstaben 387
Abbildung 118: Färben über einzelne Farbkanäle 391
Abbildung 119: Einfärbung eines per Filter-Klasse erstellten Schattens 397
Abbildung 120: Organische Erscheinung per Ebeneneffekt 399
Abbildung 121: Simulation eines Spotlights 403
Abbildung 122: Überblendeffekt mit Hilfe einer Maske 406
Abbildung 123: Mosaik-Effekt (1) 410
Abbildung 124: Mosaik-Effekt (2) 410
Abbildung 125: Ermittlung eines Farbpixels 412
Abbildung 126: Text als Mausverfolger 416
Abbildung 127: Uhr in Ruhestellung 419
Abbildung 128: Uhrteile folgen der Maus 419
Abbildung 129: Aufbau der Uhr ohne Zeitanzeige 422
Trang 16xviii Abbildungsverzeichnis
Abbildung 130: Blätteranimation nach Mausbewegung 428
Abbildung 131: Alternative Objektformen 433
Abbildung 132: Formänderung nach Mausbewegung 433
Abbildung 133: Check Boxes des Workshops 437
Abbildung 134: Aufbau von mcRecht 438
Abbildung 135: Radio Buttons 440
Abbildung 136: Aufbau von mcKreis 441
Abbildung 137: Combo-Box des Workshops 442
Abbildung 138: Bibliotheks-Elemente der Drag and Drop-Übung 449
Abbildung 139: Einzelelemente eines Fensters 455
Abbildung 140: Positionsbestimmung der Fensterteile 456
Abbildung 141: Kreisförmiges Menü 464
Abbildung 142: Aktiviertes Kreismenü 466
Abbildung 143: Aufbau des elliptischen Menüs 473
Abbildung 144: Anzeigen der Menüelemente 475
Abbildung 145: Scheitelpunkte der Animation 477
Abbildung 146: Akkordeon-Menü des Workshops 480
Abbildung 147: Aufbau des MovieClips mcFenster 481
Abbildung 148: Drop Down-Menü des Workshops 486
Abbildung 149: Originalgrafik (verkleinert) 494
Abbildung 150: Thumbnail-Typ 1 494
Abbildung 151: Thumbnail-Typ 2 494
Abbildung 152: Thumbnail-Typ 3 494
Abbildung 153: Infografik mit Bildergalerie 495
Abbildung 154: Aufbau des MovieClips mcBild 496
Abbildung 155: Aufbau des MovieClips mcSlider 496
Abbildung 156: Aufbau des MovieClips mcMaske 497
Abbildung 157: Variante der Bildergalerie 503
Abbildung 158: Aufbau des MovieClips mcMaske bei nicht aktivierter Maske 504
Abbildung 159: Aufbau der Galerie mit externen Assets 507
Abbildung 160: Ordnerstruktur der Galerie 507
Abbildung 161: Aufbau der Thumbnails 514
Abbildung 162: Aufbau Memory-Spiel 521
Abbildung 163: Karten und Bilderset 522
Abbildung 164: Zufallsverteilung der Karten in aKarten 523
Abbildung 165: Puzzlespiel 528
Abbildung 166: Umrisse der Puzzleteile 529
Abbildung 167: Registrierungspunkt und gedachtes Quadrat 529
Abbildung 168: Puzzleteile entsprechend der Array-Elemente 530
Abbildung 169: Begrenzungsrechteck und Registrierungspunkt von mcPuzzle6 533
Abbildung 170: Puzzleteile ohne Maske 535
Abbildung 171: Puzzleteile mit BevelFilter 536
Trang 17A Kohl, ActionScript 2, doi:10.1007/978-3-540-35182-5, © Springer 2011
ActionScript (kurz: AS), die in Flash integrierte
Script-Sprache, hat sich im Laufe der Zeit zu einem
unverzichtbaren Tool im Arsenal des Webentwicklers
gemausert Interaktive Anwendungen aller Art bis
hin zu sogenannten Rich Internet Applications
las-sen sich mittlerweile mit Hilfe dieser Sprache
reali-sieren Diese Mächtigkeit hat allerdings ihren Preis,
steigt doch mit den Möglichkeiten zugleich auch die
Lernkurve, um sich AS anzueignen, mit jeder
Flash-Version weiter an Darum möchte Sie das vorliegende
Buch bei der Hand nehmen und behutsam durch den
Script-Dschungel führen
Einsteiger-Bücher gibt es viele, und wenn man
ei-nes kennt, kennt man die meisten anderen auch
De-ren größtes Manko ist der Versuch, möglichst viele
AS-Befehle abzudecken Das sieht zwar im
Inhalts-verzeichnis beeindruckend aus, doch spätestens dann,
wenn man an einem konkreten Projekt sitzt, werden
einem allzu schmerzhaft die Lücken bewusst, die man
sich angeeignet hat Denn derartige Bücher führen
in die Themen anhand von Code-Schnipseln ein, die
zwar leicht verdaulich sind, aber kaum in die Tiefe
ge-hen Außerdem stehen diese Schnipsel oft
zusammen-hanglos und mitunter etwas verlegen im Raum herum
Für den Anfänger fehlt daher nicht selten die
Orien-tierung, wo man sie in einem konkreten, dem
Produk-tionsalltag nahe stehenden Zusammenhang einsetzen
kann Das ist etwa so, als wollte man für eine Reise
nach Frankreich Französisch lernen und würde dabei
ein Lexikon verwenden anstelle eines Sprachführers
Daher verfolgt das vorliegende Buch einen
ande-ren Ansatz Wir verzichten hier auf eine lexikalische
Auflistung und Behandlung aller AS-Sprachelemente
Für diesen Zweck genügt zumindest prinzipiell die
Flash-Hilfe Statt dessen konzentrieren wir uns auf
ausgesuchte Konzepte und Elemente sowie deren
Be-deutung in der Praxis Eine derartige Auswahl muss notgedrungen subjektiv ausfallen Immerhin spiegeln sich in ihr zahlreiche Jahre Programmier- und Lehrer-fahrung wieder, so dass sie nicht völlig willkürlich ist Die Konzepte und Elemente werden zwar am konkre-ten Beispiel von ActionScript behandelt, besitzen je-doch zu einem beträchtlichen Teil sprachunabhängig Gültigkeit Dazu gehören beispielsweise Variablen, Arrays oder Kontrollstrukturen, die von der Idee her auch in anderen Sprachen wie PHP und Javascript vorkommen Ebenso ist die Beschreibung des Ent-wicklungsprozesses eines Programms nicht an Flash gebunden Damit werden Sie in die Lage versetzt, sich
im Fall der Fälle relativ einfach in andere Sprachen einzuarbeiten, falls Sie sich die vorgestellten Kon-zepte angeeignet haben Denn es gehört zu den ange-nehmen Seiten der Programmierung, dass zahlreiche Sprachen mit vergleichbaren Konzepten arbeiten, so dass solide Kenntnisse in einer Sprache das Wechseln
zu einer anderen durchaus erleichtern können Man kann mitunter sogar Lösungen aus einer Sprache in eine andere übertragen, ohne diese Lösung selbst von Grund auf neu entwickeln zu müssen
Der erste Teil des Buches beginnt mit einem blick über die Geschichte von ActionScript, gefolgt von drei Kapiteln, die über die Vorgehensweisen bei der Programmentwicklung u a anhand eines in Pseudo-Code formulierten Programms zum Kochen von Kaffee – Genuss für Geist und Körper gleicher-maßen – informieren Gerade die relative Zugänglich-keit von AS verleitet schnell dazu, einfach mal „drauf los zu programmieren“ – und spätestens dann, wenn man den eigenen Code nach einigen Wochen erwei-tern oder ändern muss, türmt sich ein Berg an Prob-lemen auf, weil man ihn aufgrund mangelhafter Pla-nung und Strukturierung weder richtig versteht noch
Trang 18Über-2 Kapitel 1 Einleitung
einfach modifizieren kann Daher kann die Bedeutung
sinnvoller Planung im voraus gar nicht oft genug
be-tont werden
Anschließend folgen kapitelweise Beschreibungen
einzelner Sprachelemente und Strukturen wie
Opera-toren, Variablen, Kontrollstrukturen sowie der
wich-tigsten Klassen wie MovieClip, BitmapData, XML
etc Besonderen Raum nimmt die MovieClip-Klasse
ein, da kaum eine Applikation ohne sie auskommen
kann Diese Kapitel stellen das jeweilige Element vor
und geben einzelne Codebeispiele, um ihren Einsatz
zu verdeutlichen
Damit man auch tatsächlich erfährt, was es mit
die-sen Elementen in der freien Wildbahn da draußen auf
sich hat, bietet der zweite Teil zahlreiche Workshops,
in denen sie immer wieder in den verschiedensten
Zusammenhängen auftauchen Dadurch gewinnt das
ansonsten recht abstrakte Erlernen von „Vokabeln“
ei-nen unmittelbaren Praxisbezug, denn die behandelten
Themen kommen zu weiten Teilen so oder in einer
abgewandelten Form auch tatsächlich im
Produkti-onsalltag vor Aus didaktischen Gründen musste zwar
manches gekürzt oder geändert werden, da der Platz
im vorliegenden Buch einfach nicht ausreichte, alles
erschöpfend zu behandeln So manches dort
verwen-dete Skript lässt sich noch optimieren Damit ginge
jedoch die relativ leichte Zugänglichkeit und
Ver-ständlichkeit verloren Dessen ungeachtet bieten die
Workshops genügend Masse, um einerseits die
Spra-che am lebenden Objekt einzuüben und andererseits
Einblick in die tägliche Praxis der
programmierorien-tierten Flash-Entwicklung zu gewinnen
An dieser Stelle bemerkt der Autor
zugegebe-nermaßen mit einer gewissen inneren Freude, dass
man Skripte aus einem Buch nicht durch schlichtes
Kopieren in Flash einfügen kann, sprich: Das
Ler-nen mit diesem Buch macht nur Sinn, wenn Sie den
angesprochenen Code wirklich selbst eingeben Wer
Buchstabe für Buchstabe alles abtippt, wird eher
da-rüber nachdenken, was er tut, als wenn man einfach
nur kopiert Kopieren und kapieren sind zwei
ver-schiedene Dinge Um das Schreiben zu erleichtern,
befindet sich am Ende der meisten Workshops des
zweiten Teils eine komplette Auflistung des aktuell
behandelten Codes Innerhalb der Workshops wird er
abschnitt-, mitunter auch zeilenweise entwickelt und
jeweils besprochen
Einige Übungen im ersten und nahezu alle
Bei-spiele im zweiten Teil arbeiten mit einer sogenannten
Standarddatei Damit ist lediglich eine simple Datei gemeint, die über folgende Eigenschaften ver-fügt:
16 × 9, mal eine interaktive Animation mit 25 BpS vor einem schwarzen Hintergrund erstellt werden – kurz,
es gibt endlos viele verschiedene Möglichkeiten, mit welchen Einstellungen man im Einzelnen ange-messen arbeitet Da es im vorliegenden Buch um die Aneignung von Techniken, nicht jedoch um die op-timale Realisierung spezifischer Applikationen geht, verwenden wir einfach eine Standardeinstellung, die Sie Ihren besonderen Bedürfnissen im Einzelfall an-passen müssen
Obgleich das Buch aus zwei Teilen besteht, ist es nicht notwendig, erst Teil 1 und anschließend Teil 2
zu goutieren Wer die theoretischen Grundlagen herrscht, kann gerne direkt mit dem Workshop-Teil arbeiten In dem Fall sollte man allerdings das Ka-pitel zu Framework und Code-Organisation kennen,
be-da dort eine Vorgehensweise erläutert wird, die in den Workshops zur Anwendung kommt
Wer keinerlei Skriptkenntnisse besitzt, sollte gen systematisch alle Kapitel des ersten Teils durch-arbeiten, wobei es sich empfiehlt, die vorliegende Reihenfolge einzuhalten, da sie aufeinander bezogen sind Die Kapitel des zweiten Teils dagegen liegen unabhängig voneinander vor, so dass ein beliebiges Kapitel zum Lernen verwendet werden kann Wer sich für Texteffekte interessiert, schlägt eben dort nach, ohne vorher etwa das Kapitel Grafikeffekte gelesen haben zu müssen
dage-Die Workshops fassen thematisch gende Übungen in Kapiteln zusammen So finden sich etwa im Kapitel Effekte (Maus) verschiedene Effekte, die in irgendeiner Form auf den Cursor bezogen sind Die Kapitel werden mit einigen allgemeinen Hinwei-sen zur jeweiligen Bedeutung der konkreten Themen
Trang 19zusammenhän-und Übungen eingeleitet Danach folgt ein Überblick
über das Ziel der Übung sowie eine sukzessive
Auf-listung der Arbeitsschritte in Form von
Handlungs-anweisungen Die Schritte sind zumeist in einzelne
Blöcke unterteilt, die anschließend erläutert werden
Besonderes Gewicht wird dabei auf die zugrunde
lie-gende Logik gelegt Sie ist letztlich wichtiger als die
korrekte Syntax: Versteht man nicht, wie ein Problem
gelöst wird, nützt eine fehlerfreie Syntax nichts, weil
man nie in die Lage versetzt wird, eine eigene
Prob-lemlösung zu entwickeln Eine Syntax zu erlernen ist
letztlich ein reiner Gedächtnisvorgang, während die
Logik einer weit darüber hinausgehenden
Verstandes-leistung bedarf
An manchen Stellen wird eine konkrete Übung
durch Hinweise auf Varianten ergänzt, deren Code
mitunter vorgestellt wird und mitunter auch nur
er-wähnt wird Solche Stellen sollten Sie als
Aufforde-rung verstehen, um eigene Lösungen zu entwickeln
Der in den meisten Praxisbeispielen vorgestellte Code lässt sich zwar mit einigen Änderungen direkt auf eigene Projekte übertragen, doch sollte man sich
im Klaren sein, was er im Einzelnen bedeutet Dieses Buch ist in erster Linie als Lehrbuch konzipiert und nicht als Kochbuch mit einfach zu kopierenden Re-zepten bzw Codeschnipsel
Viele Probleme ermöglichen mehrere wege und so kann hier vorgestellter Code nur als ein möglicher, in der Praxis bewährter Weg, aber beileibe nicht als allein selig machender verstanden werden.Gerne würde der Autor behaupten, er habe aus di-daktischen Gründen bewusst einige Fehler eingebaut Tatsächlich sind derartige Fehler bei dem vorliegenden Seitenumfang einfach unvermeidlich und der mensch-lichen Schwäche des Autors geschuldet Dafür sei der Leser hier bereits um Entschuldigung gebeten.Happy Coding!
Trang 20A Kohl, ActionScript 2, doi:10.1007/978-3-540-35182-5, © Springer 2011
ActionScript:
Flash stellt eine vollständige Entwicklungsumgebung
und ein Autorensystem für Online- und
Offlineanwen-dungen nahezu jeder Art dar Aufgrund seiner
umfas-senden Funktionalität hat es sich innerhalb relativ
we-niger Jahre von einem ursprünglich doch recht simpel
gestrickten Animationsprogramm zum Standard
ins-besondere bei der Entwicklung von hoch interaktiven,
multimedialen Anwendungen gemausert Zu diesem
enormen Erfolg trug ganz wesentlich die integrierte
Skriptsprache ActionScript bei, die mittlerweile
annä-hernd so mächtig geworden ist wie eine vollwertige
Programmiersprache
Dabei wiesen die sehr bescheidenen Anfänge
von ActionScript keinesfalls in die Richtung, die
die Sprache nach einigen Jahren eingeschlagen hat
Denn Flash erblickte unter dem Namen
FutureSplash-Animator als nettes kleines Animationsprogramm in
Konkurrenz zu animierten gif-Dateien das Licht der
Welt 1996 wurde das Programm samt deren
Entwick-ler von der im sonnigen Kalifornien ansässigen Firma
Macromedia übernommen Da der Schwerpunkt auf
Animation lag, war die Scriptfähigkeit
notwendiger-weise bedeutungslos In den ersten drei
Flash-Versio-nen bestand sie lediglich aus sehr einfachen Befehlen,
mit denen man Navigationen ähnlich einer
Videosteu-erung vornehmen konnte So war es beispielsweise
möglich, eine Zeitleiste anzuhalten und abzuspielen
oder zu einem bestimmten Frame zu springen Dabei
handelte es sich um weitgehend vorgefertigte
Verhal-tensweisen, also fertigen Skripten, die man mit Hilfe
von Eingabefeldern parametrisieren konnte Ein
di-rekter Zugriff auf den Code existierte nicht
Erst mit Flash 4 schlug gewissermaßen die
Ge-burtsstunde von ActionScript als einer eigenständigen
Scriptsprache mit Elementen, wie man sie von anderen
Sprachen her gewohnt ist Dazu gehören Schleifen,
Variablen und Ausdrücke, was erstmals das Erstellen umfangreicher, durchaus anspruchsvollerer Skripte ermöglichte Offiziell firmierte die Sprache unter der Bezeichnung actions, intern verwendete man schon den heute geläufigen Namen ActionScript
Ab dieser Version wurde die Sprache recht quent ausgebaut und immer näher an internationale Standards herangeführt Bereits Flash 5 erlaubte den uneingeschränkten Zugriff auf den Code mit Hilfe ei-nes integrierten Editors, ohne jedoch auf die von den Vorgängern her bekannte Möglichkeit eines simplen Zusammenklickens von Codeblöcken völlig zu ver-zichten Dahinter stand die eigentlich bis Flash 9 bzw
konse-CS 3 gültige Philosophie, zwei verschiedene gruppen anzusprechen: Einerseits den Programmie-rer, der nicht davor zurückschreckt, komplexe Skripte
Ziel-zu entwickeln, und den Designer, der sich zwar mehr auf die Animationsfähigkeiten von Flash konzentriert, aber gleichzeitig auf eine einfache Art Interaktionen skripten möchte Da die Sprache am ECMA 262- bzw ECMAScript3-Standard ausgerichtet wurde, fanden sich Programmierer, die zuvor insbesondere mit Ja-vascript gearbeitet hatten, recht schnell zurecht Ein positiver Nebeneffekt war die relativ leichte Portier-barkeit von Code aus einer Sprache in eine andere
Um die Entwicklung zu vereinfachen, konnte man zudem in sogenannte Smart-Clips Code und Objekte hineinpacken, so dass sie sich als fertige Elemente einsetzen ließen, ohne dass man auf den Code zugrei-fen musste Ein bisschen erinnerte dieses Konzept an die Behaviors von Director, des damals noch großen Bruders von Flash, das ebenfalls von Macromedia entwickelt wurde
Mit der Versionsnummer 5 wurde Flash, ckend betrachtet, tatsächlich erwachsen Denn es ge-lang, das Image eines vornehmlich für zappelige Intros
Trang 21rückbli-und Animationen geeigneten Entwicklungstools
abzu-legen (tatsächlich waren diese zappeligen Intros aber
weniger dem Tool als vielmehr den betreffenden
Ent-wicklern anzulasten) Nicht zuletzt eben Action Script
zeigte, was, wenn es voll ausgereizt wurde, möglich
war – von kompletten, durchaus userfreundlichen,
hoch interaktiven Websites über datenbankgestützte
Anwendungen bis hin zu den auch heute noch
allge-genwärtigen Spielen reichte die Anwendungspalette
Beflügelt – oder muss man sagen: berauscht? – vom
Erfolg schob Macromedia mit Flash MX, entstanden
zu einer Zeit, als es plötzlich unmodern geworden war,
Versionsnummern zu verwenden, eine stark
erwei-terte Version von ActionScript nach Die wichtigste,
die Sprache partiell bis heute prägende Neuerung war
ein alternatives Ereignismodell, das es erlaubte, in
einem einzigen Bildscript allen Objekten die
benö-tigten Ereignisse und Aktionen zuzuweisen Die
Ver-wendung eigenständiger Objektscripte wurde damit
prinzipiell obsolet Dadurch gewann der Sourcecode
an Übersichtlichkeit, denn die endlos verschachtelten
Objekte (Movieclips und Buttons) machten es bisher
ausgesprochen leicht, Code irgendwo regelrecht zu
vergraben Die Standardisierung von AS wurde
vor-angetrieben durch eine noch striktere Beachtung des
ECMA-Standards
Neben einer erweiterten, umfangreichen
Funk-tionsbibliothek verfügte Flash MX über eine neue
API, die es erlaubte, dynamische Vektorgrafiken zu
programmieren Aus den Smart-Clips entwickelten
sich die komplexeren Komponenten, die mitunter
schon den Charakter eigenständiger Anwendungen
annehmen konnten Als kleines Schmankerl bot man
Programmieren die Möglichkeit prototypbasierter
ob-jektorientierter Programmierung, wenn auch in einer
recht rudimentären Form
Der starke Ausbau der Scriptmöglichkeiten
ver-deutlichte zugleich, in welche Richtung man sich die
Weiterentwicklung des Programms dachte – letztlich
eine Grundsatzentscheidung, die im Großen und
Gan-zen bis zur aktuellen Version 11 bzw CS5
beibehal-ten wurde Denn während jede neue Version immer
ausgeklügeltere Features für den Programmierer bot,
wurden die Designer hinsichtlich der
Grafikwerk-zeuge bis heute nur mit wenigen interessanten
Neue-rungen bedacht, nämlich die längst überfälligen
Ebe-neneffekte in Flash 8, die in der Tat beeindruckende
Videounterstützung ab Flash MX 2004 und
Bones-Animation sowie (leider nur halbausgegorenes) 3D in
CS4 Mittlerweile scheint auch die Unterstützung der Designer in der Programmierung zu bröckeln, wird doch ActionScript mit jeder Version komplexer und für einen eher unbedarften Neuling undurchdringli-cher Dabei waren es gerade die Designer, die Flash einst entdeckt hatten!
Schon damals wurde als Parole die Entwicklung von RIA, Rich Internet Applications, ausgegeben, also komplette, nicht selten datenbankgestützte Online-Anwendungen Dem war jedoch aller Euphorie zum Trotz Flash (noch) nicht gewachsen, wie der Online-Auftritt von Macromedia selbst bewies
Der Nachfolger Flash MX 2004 machte einen teren großen Schritt nach vorn, indem neben die be-stehende ActionScript -Version das neue AS 2.0 trat, das u a eine bessere Fehlerkontrolle durch eine strikte Typisierung, ein leistungsfähigeres, wenn auch gegen-über vorher umständlicheres Listener-Ereignismodell und vor allem eine an höhere Programmiersprachen angelehnte objektorientierte Programmierung ermög-lichte War Flash mit Version 5 erwachsen geworden,
wei-so geschah dasselbe bei ActionScript mit Version 7 (bzw MX 2004)
Hier wie auch an anderer Stelle musste man als Entwickler jedoch der Entwicklungsgeschichte des Programms Tribut zollen: Um die Abwärtskompatibi-lität zu älteren Flash-Playern zu bewahren, erfolgte die Kontrolle der Typisierung ausschließlich in der Auto-renumgebung, während sich der Player wie schon zu-vor genügsam mit, um es böse zu formulieren, „Code-salat“ zufrieden gab Faktisch bedeutete dies, dass AS 2.0 Code durch die AVM (ActionScript Virtual Ma-chine), die den erstellten Code interpretiert, in AS 1.0 umgewandelt wurde All die schönen neuen Möglich-keiten, die eine an höhere Programmiersprachen an-gelehnte Struktur erlaubten, wurden damit partiell zu-nichte gemacht, und auch die Performance entsprach nicht dem, was man erwarten darf Erst Flash 9 hat hier zu einer grundlegenden Änderung geführt.Aus Entwicklersicht bot ActionScript damit im-merhin eine stabilere Programmierung und eine grö-ßere Funktionalität Andererseits allerdings stieg die Lernkurve für Scriptanfänger stark an Gerade der leichte Zugang zum Scripting war ja bisher eine der wesentlichen Stärken von Flash gewesen Dessen ein-gedenk entschied sich Macromedia zu einem Beibe-halten von AS 1.0
Konsequenter als der Vorgänger ermöglichte Flash 8, das sich wieder mit einer Versionsnummer
Trang 227
schmücken durfte, objektorientiertes
Programmie-ren Die Entwickler spendierten dem Programm eine
umfangreiche Klassenbibliothek insbesondere zur
direkten Manipulation von Bitmapgrafiken auf
Pixel-ebene sowie zum Up- und Download von Dateien
Der Zugriff auf Bitmaps erlaubte geskriptete
Ef-fekte, die zuvor gar nicht oder nur unter erheblichem
Aufwand möglich waren Man denke nur an
Bump-mapping, eine Technik, die auf zweidimensionalen
Objekten eine dreidimensionale Oberfläche durch
Tiefeninformationen simuliert Allerdings erwiesen
sich insbesondere die neuen Filter-Klassen im
Ge-brauch als recht sperrig So verlangen sie nach –
sa-lopp formuliert – einem Dutzend Pflicht- und einem
weiteren Dutzend optionaler Parameter, deren Sinn
nicht immer leicht zu erkennen ist Eigentlich sollte
in einem derartigen Fall die Programmhilfe
erschöp-fend Auskunft erteilen Aber Flash 8 präsentiert sich
als die erste Version, deren Dokumentation neuer
Be-fehle und Elemente so unverständlich ist und deren
Beispiele so unglücklich gewählt wurden, dass sie für
Skript-Einsteiger faktisch fast schon wertlos ist Man
gewinnt den Eindruck, sie sei von Spezialisten für
Spezialisten geschrieben – was aber gerade dem Sinn
einer Hilfe widerspricht und angesichts der aufgrund
der Sprachkomplexität steil angestiegenen Lernkurve
schlicht eine Fehlentscheidung darstellt
Flash 9, 2007 auf dem deutschen Markt
erschie-nen, stellt vielleicht nicht nur einen neuen
Meilen-stein, sondern sogar einen Wendepunkt dar Denn
diese Version wartet mit einer stark überarbeiteten,
neuen Version der Scriptsprache, nämlich AS 3.0
auf, die konsequent objektorientiert aufgebaut ist und
sich eigentlich kaum mehr von einer Hochsprache
unterscheidet Ihr wurde im Flash-Player eine eigene
Virtual Machine, AVM2, gewidmet, die unabhängig
neben der aus Kompatibilitätsgründen beibehaltenen
AVM1 enthalten ist Sie zeichnet sich endlich durch
die längst fällige höhere Performance aus, setzt aber
eben auch das erheblich komplexere AS 3.0 voraus
Die Version 10 baut AS 3.0 aus, bietet die
Möglich-keit, Objekte statt Frames zu tweenen, verfügt über
einen modifizierten Editor für Tweens und beschenkt
den Entwickler, wie erwähnt, mit inverser
Kinema-tik und 3D Dessen ungeachtet bleibt noch Raum für
viele weitere Features, die zukünftige Versionen von
Flash sicher bringen werden Interessanterweise hat
der deutsche Markt nach Angaben des Herstellers so
an Bedeutung zugenommen, dass die lokalisierte
Ver-sion von Flash diesmal früher erschienen ist als sonst üblich
Im Rückblick zeigt sich eine permanente, aus viele Wünsche der Flash-Entwickler berücksich-tigende Weiterentwicklung von AS, das sich im Laufe der Jahre zu einer mächtigen Skriptsprache mauserte Sie steht zur Zeit noch konkurrenzlos da – auch wenn sich am Horizont in Form von Microsofts Silverlight sowie HTML5 dunkle Wolken andeuten
durch-Der enorme Erfolg von AS birgt gleichzeitig ein Risiko in sich, das in keiner Version so deutlich zum Vorschein trat wie bei Flash 9 bzw AS 3.0 Denn diese Sprachversion ist derart umfangreich geworden, dass sich ein Einsteiger mit einer fast ähnlich steilen Lernkurve herumschlagen muss wie bei einer höheren Programmiersprache Insofern steht Flash an einem Scheideweg: Sollen zukünftige Versionen die Funk-tionalität der Scriptsprache wie bisher weiter aus-bauen? Wie wäre es beispielsweise mit einer echten 3D-Unterstützung, wie sie bereits seit Jahren der lang-sam in die Vergessenheit sinkende, einst große Bruder von Flash, nämlich Director, beherrscht? Das häufig gehörte Argument, damit wachse der Player notwen-digerweise auf eine Größe von mehreren MB an, wird immer unbedeutender angesichts der Tatsache, dass DSL mittlerweile als Standard gelten darf Das würde natürlich alle professionellen Entwickler und Programmierer freuen, geschähe aber zum Leidwesen der Designer und Gelegenheitsprogrammierer.Oder soll man stärker die Designer berücksichti-gen, die nach Jahren erst wieder mit den Ebeneneffek-ten in Flash 8 und der IK sowie einem überarbeiten Motion-Editor in Flash 10 ein Zückerchen geboten bekamen, während sich die meisten anderen neuen Features eher auf die Programmierung bezogen? So mancher Designer würde sich eine bessere Unterstüt-zung bei Animationen wünschen Schön wären bei-spielsweise verschiedene Kamera-Perspektiven, wie sie etwa in ToonBoom-Studio schon lange integriert sind Sie würden die Erstellung von Animationen nicht unwesentlich erleichtern
Unabhängig davon, wie zukünftige Flash-Versionen aussehen, sind heutige „Flasher“ zunehmend gezwun-gen, mit ActionScript umzugehen Denn eben weil es nicht mehr das simple Animationstool von einst ist, sondern eine mächtige Entwicklungsumgebung, deren Potential aber erst wirklich ausgeschöpft wird, wenn man sich der Scriptsprache bedient, werden selbst Designer mit Programmierung konfrontiert Moderne
Trang 23Webseiten glänzen nicht alleine durch attraktives
De-sign, sondern bieten ein hohes Maß an Funktionalität,
das sich nur noch über Programmierung herstellen
lässt Das gilt erst recht für Applikationen, also
voll-ständige Anwendungen, die, glaubt man den Auguren
der Branche, dereinst Desktop-Applikationen
weitge-hend ersetzen werden (auch wenn das noch eher
Zu-kunftsmusik darstellt) Aus dem Flash-Designer wird
ein Flash-Entwickler, für den solide Grundkenntnisse
in ActionScript unverzichtbar sind
Damit stellt sich die Frage nach der AS-Version,
mit der man arbeiten soll Für den gestandenen
Pro-grammierer kann die Antwort nur lauten: AS 3.0
Denn so lassen sich endlich Konzepte umsetzen, die
aus der professionellen Softwareentwicklung bekannt
und jahrelang erfolgreich eingesetzt wurden Gerade
größere, komplexere Projekte profitieren von den
Möglichkeiten dieser Version
Die Mehrzahl der Flash-Entwickler gehört jedoch
(immer noch) nicht zu dieser Kategorie, sondern
stammt zumeist aus dem Bereich des Designs und der
Web-Entwicklung Ihnen fehlen daher oft die formalen
Voraussetzungen, um problemlos mit einer derart
kom-plexen, an eine Hochsprache angelehnten
Scriptspra-che zu arbeiten Lohnt sich der Einstieg in AS 3.0?
In den meisten Fällen lautet die Antwort derzeit
wohl: Nein Das mag überraschen, zumal in einem
Buch, das sich mit Programmierung befasst Doch
sollte man mit beiden Füssen auf dem Boden der
Re-alität bleiben:
Für einen Nicht-Programmierer steigt die
Lern-•
kurve bei AS 3.0 so stark an, dass man sich genauso
gut direkt auf eine Hochsprache wie Java stürzen
kann Wie viel Web-Entwickler, prozentual
gese-hen, brauchen Java wirklich? Für ein „normales“
Web-Projekt lohnt sich der Aufwand nicht, eine
Hochsprache zu erlernen, und AS 3.0 liegt, wie
gesagt, aufgrund seiner Komplexität recht nahe an
einer derartigen Hochsprache
Der Erstellungsaufwand für eine
Flash-Anwen-•
dung erhöht sich zunächst, da AS 3.0 einen recht
konsequenten objektorientierten Ansatz verfolgt
So verlangt nun das früher so einfache Zuweisen
eines Ereignisses, abgehandelt in einer einzigen
Zeile, umständlich nach einem Listener sowie
ge-gebenenfalls dem Import von Klassen
Für AS 3.0 reicht es nicht aus, einfach nur neue
Be-•
fehle zu erlernen Vielmehr steckt eine konsequente
Objektorientierung dahinter, die dazu zwingt, vor
einem Projekt eine saubere objektorientierte lyse zu erstellen Sonst kann es schnell geschehen, dass man viele verschiedene Klassen anlegt, die mehrfach dasselbe tun – als Ergebnis erhält man mindestens eben so gefährlichen Codesalat, wie er gerne von gestandenen Programmierern den AS1-Skriptern vorgeworfen wird Eine saubere Klas-senstruktur erhält man nicht en passant, sondern bedeutet einen enormen Lernaufwand Aus jahre-langer Dozententätigkeit weiß der Autor, dass ge-rade dieser Punkt vielen Webentwicklern enormes Kopfzerbrechen bereiten kann und dass viele sich gar nicht die Zeit nehmen (können), um hier richtig einzusteigen
Ana-Flash hatte den enormen Vorteil, dem Designer die
•
Möglichkeit zu bieten, relativ einfach nen und komplexere Anwendungen zu program-mieren Es konnte zumindest prinzipiell alles aus einer Hand entstehen Wagner spricht zutreffend von der Ein-Mann-Show (Mobile Games mit Flash,
Interaktio-p 8) Das ist zweifelsohne eine der Gründe für die enorme Popularität von Flash als Autorensystem Mit AS3 ändert sich das grundlegend: die Entwick-ler werden zu einem Spezialistentum gezwungen, bei dem eine deutliche Trennung zwischen Coder (Programmierer im eigentlichen Wortsinne) und Designer entsteht AS3 ist schlicht zu komplex,
um auf die Schnelle eine Applikation zu skripten und dabei wirklich zu wissen, was man tut OOP ist eben nichts, was man mal en passent erledigt Den Informatiker freut’s, den Designer graust’s Schon aus rein pragmatischen Gründen wird sich die Mehrzahl der Flash-Entwickler daher sinnvollerweise eher mit AS 2.0 anstatt 3.0 befassen müssen (wollen, sollen) Und dem trägt auch dieses Buch Rechnung, indem es sich weitgehend auf AS 2.0 beschränkt.Bereits Version 2.0 bietet so viele Möglichkeiten, dass sie i d R gar nicht ausgeschöpft werden Auch vor diesem Hintergrund macht es wenig Sinn, sich eine neue, noch mehr (genau so wenig ausgereizte) Features bietende Version anzueignen Es ist schon er-staunlich, wie groß beispielsweise die Kluft zwischen den Möglichkeiten, welche die in Flash 8 eingeführte BitmapData-Klasse bietet, und deren konkrete Ver-wendung ist Anstelle der ColorTransform-Klasse fin-det nach wie vor die veraltete Color-Klasse Verwen-dung Und die Rechnung mit einer Matrix, die uns in
AS 2.0 an mehreren Stellen begegnet und Potential vor allem bei der Programmierung grafischer Effekte
Trang 249
besitzt, wird so wenig eingesetzt, weil sie für viele
Flash-Entwickler eher ein Mysterium Tremendum als
ein sinnvolles Hilfsmittel darstellt
Das Problem der richtigen Sprachversion hat wie
kaum ein anderes die Gemüter der Flash-Entwickler
erhitzt, und so manches Flash-Urgestein wie etwa
Philipp Kerman entscheidet sich bei kleineren bis
mittleren Projekten zugunsten von 2.0 anstatt von 3.0
Zudem wartet die neue Sprachversion, falls man nicht
mit CS 4, sondern dem Vorgänger arbeitet, mit einigen
Ungereimtheiten auf, die das Programmieren partiell
erheblich erschweren Dazu gehört insbesondere das
gegenüber bisher ausgesprochen unglücklich
gehand-habte Entfernen extern geladener swf-Dateien sowie
eine deutlich optimierfähige Garbage Collection Kein
Geringerer als Colin Moock hat sich ausführlich mit
derartigen Problemen beschäftigt, und einen Einblick
in die Diskussion findet der geneigte Leser unter:
C Moock: „The Charges Against ActionScript 3.0“,
www.insideria.com/2008/07/the-charges-against-ac-tionscri.html
Brendan Hall und Joshua Davis, beides profilierte Flash-Entwickler, die schon frühzeitig das Potential von Flash sowohl in programmiertechnischer wie de-signerischer Hinsicht ausreizten, wobei insbesondere Davis beide Bereiche zu verknüpfen suchte, urteilen über den heutigen Stand:
„Flash has matured incredibly in the past decade, but it has done so in a way that has blocked non-de-velopers from even getting started The simple fact
of the matter is that with older versions of Flash you could learn the tool and how to program ActionScript almost entirely through creative play With the latest iterations, unless you have a background in object-ori-ented programming, that method of learning by doing
is simply not an option.“
Als Konsequenz aus dieser Malaise entwickelten sie unter dem Stichwort „Hype“ ein Framework, das jedem Interessierten den schnellen und einfachen Zu-griff auf die Programmierfähigkeiten von Flash er-laubt, ohne sich in eine komplex gewordene Program-miersprache einarbeiten zu müssen
Trang 25A Kohl, ActionScript 2, doi:10.1007/978-3-540-35182-5, © Springer 2011
Programmentwicklung
Programmieren ist eine Wissenschaft für sich – das
mag banal klingen, aber gerade der Neuling, der sich
naturgemäß kopfüber ins Programmieren stürzt, wird
sehr schnell an Grenzen stoßen Einerseits hat sich
Ac-tionScript zu einer recht komplexen, mächtigen
Spra-che entwickelt, andererseits erfordern heutige
Flash-Projekte, die rasch auf viele Hundert oder Tausend
Zeilen Quellcode anwachsen, sorgfältige Planung,
will man nicht in einem Wust aus Spaghetti-Code
und geskriptetem Nonsens untergehen Angemessene
Programmentwicklung setzt i d R strukturiertes,
überlegtes Vorgehen und systematische Planung
vo-raus, um einerseits möglichst effizient und
anderer-seits möglichst fehlerfrei arbeiten zu können Insofern
gleicht das Programmieren einer Anwendung dem
Bau eines Hauses: Bevor man die Baugrube ausheben
kann, muss man sich erst einmal einen
Konstruktions-plan zurecht legen, an dem sich die einzelnen
Baupha-sen orientieren können
3.1 Ansätze (Top-Down, Bottom-Up)
Es gibt keinen Königsweg zum guten Programm, aber
im Laufe der Zeit haben sich einige
Vorgehenswei-sen herausgebildet, um einem die Arbeit zumindest zu
erleichtern Zu den erfolgversprechendsten Methoden
gehören der Top-Down- und der Bottom-Up-Ansatz
Der Top-Down-Ansatz versucht, unabhängig von
konkreten Details einen Gesamtüberblick über ein
Problem zu erhalten Im nächsten Schritt wird es in
möglichst wenige, z B drei oder vier, Teilprobleme
zerlegt Auch auf dieser Stufe geht es noch nicht
vornehmlich um einzelne Details In einem weiteren
Schritt wird jedes Teilproblem seinerseits in einige
wenige Teile zerlegt Dies führt man solange durch, bis eine weitere Unterteilung nicht mehr möglich erscheint Dann befindet man sich auf der untersten Stufe und damit zugleich bei kleinsten Details Dieser Ansatz beschreibt ein Problem in einer Art Pyramide und arbeitet sich von allgemeinen Fragestellungen vor bis hin zur kleinsten Einzelheit Insofern stellt dieser Ansatz eine große Kiste zur Verfügung, in die wir alle Elemente hineinpacken, die ein Problem oder eine Aufgabenstellung charakterisieren Ein zeitlicher Ablauf oder eine logische Verknüpfung zwischen den einzelnen Elementen wird nicht definiert Die Pro-grammierung kann erst einsetzen, nachdem die Ana-lyse vollständig abgeschlossen wurde
Der Vorteil besteht darin, dass man zu jedem punkt einen vollständigen Überblick besitzt, ohne von Detailfragen abgelenkt zu werden Dem stehen aller-dings einige Nachteile gegenüber wie insbesondere die zumeist geringe Flexibilität Denn wenn sich im Laufe der Entwicklung die Problemstellung aus wel-chem Grund auch immer ändert, ist man gezwungen, die Top-Down-Analyse erneut durchzuführen, da sich die Beziehung der Elemente untereinander, u U auch die Elemente selbst nun geändert haben Das Gesamt-gefüge der ursprünglichen Analyse stimmt nicht mehr mit der aktuellen Situation überein
Zeit-Der Bottom-Up-Ansatz dreht den analytischen Prozess um und beginnt am Boden der Pyramide Er greift sich ein Element (z B Objekt, Klasse, Methode etc.) heraus und analysiert alle notwendigen Details möglichst unabhängig von der Frage, wie sich die-ses eine Element in den Gesamtzusammenhang fügt Dann folgt die Analyse des nächsten Elements Dies geschieht solange, bis sich aus den einzelnen Ele-menten der Gesamtzusammenhang erschließen lässt Ist ein Element ausreichend definiert, kann man zu-
Trang 2612 Kapitel 3 Programmentwicklung und Programmiersprachen
mindest prinzipiell schon mit der Programmierung
beginnen, obwohl die gesamte Analyse noch nicht
abgeschlossen ist
Zu den unbestreitbaren Vorteilen zählt die größere
Flexibilität Weil zunächst kein übergreifender
Zu-sammenhang definiert wird, kann man auch zu einem
späteren Zeitpunkt relativ problemlos weitere
Ele-mente hinzufügen, falls es die Situation erforderlich
macht Zudem kann bereits zu einem frühen Zeitpunkt
Programmcode geschrieben werden Allerdings läuft
man durch die im Anfangsstadium erfolgende
Kon-zentration auf einzelne Details Gefahr, sich darin zu
verlieren und nie den Gesamtüberblick zu erhalten,
der aber notwendig ist, um alle Teile im Rahmen
ei-nes Programms zusammenfügen zu können Zu frühes
Programmieren birgt zudem das Risiko in sich, dass
der aktuelle Code nicht optimal auf den später
hinzu-kommenden Code abgestimmt ist
Nach der Problemanalyse, die zu einer
Beschrei-bung des Programms führt, folgt die Entwicklung
der Programmlogik Während die über die erwähnten
Ansätze realisierte Programmbeschreibung festlegt,
was das Programm tun soll, beschreibt die Logik, wie
es das tun soll Anders als zuvor spielt nun die
Rei-henfolge einzelner Arbeitsschritte eine entscheidende
Rolle
3.2 Algorithmus als Problemlösung
Aus der Problemanalyse muss sich in irgendeiner
Form eine Lösung erarbeiten lassen Sie wird als
Al-gorithmus bezeichnet, worunter man eine endliche
(begrenzte) Anzahl an Schritten zur Lösung eines
ex-akt formulierten Problems versteht Ein Algorithmus
gibt also Handlungsanweisungen und legt so den
Ab-lauf eines Prozesses fest Formal gesehen verfügt eine
derartige Lösung über bestimmte Eigenschaften, zu
denen u a zählen:
Ausführbarkeit
• Selbstverständlich müssen die
Handlungsanweisungen ausführbar sein, also z B
von einer Maschine befolgt werden können Das
ist dann der Fall, wenn sie möglichst
kleinschrit-tig sind und in einer spezifischen, für die Maschine
verständlichen Form wie z B einer
Programmier-sprache dargeboten werden Dazu gehört auch das
eindeutige Vorhandensein aller Informationen, um
den entsprechenden Lösungsprozess ausführen zu können
Endlichkeit
• Die Lösung muss über eine feste Länge an Schritten verfügen Ein Prozess, den wir mit unendlich vielen Schritten beschreiben müss-ten, ließe sich nie als Algorithmus umsetzen.Terminierung
• Der Lösungsprozess muss über eine Endebedingung verfügen, d h es muss festgelegt sein, wann die Ausführung zu Ende ist Dieser Punkt bezieht sich auf die Ausführung, während der vorhergehende Punkt eine Aussage zur Be-schreibung trifft
Determinismus
• Bei jedem beliebigen Schritt des Algorithmus muss eindeutig feststellbar sein, an welcher Stelle man sich gerade befindet Zusätz-lich muss bei gleichen Ausgangsbedingungen bzw Eingaben auch immer das gleiche Ergebnis erzielt werden
Das klingt alles recht abstrakt, beschreibt aber in meiner Form jede Art von Handlungsanleitungen, egal
allge-ob ein Kochrezept, eine Wegbeschreibung oder eine Bedienungsanleitung für ein neues Handy Ja, auch für ein Handy benötigen wir mittlerweile eine Anlei-tung Früher konnte man damit einfach telefonieren, doch das moderne Handy ist längst zum multifunkti-onalen Äquivalent des Schweizer Taschenmessers im Kommunikationsbereich mutiert und widersetzt sich zunehmend einer einfachen Bedienbarkeit nach der klassischen Trial & Error-Methode
Die Problemstellung „Handy bedienen“ resultiert daher in einem umfangreichen Algorithmus „Bedie-nungsanleitung“, der recht komplex ausfallen kann Diese Bedienungsanleitung muss in einer verständli-chen Sprache abgefasst sein, damit die Einzelschritte befolgt werden können (Ausführbarkeit) Was so selbstverständlich klingt, gelingt leider nicht in jedem Fall, weder in der Programmierung noch bei Bedie-nungsanleitungen, oder ist Ihnen klar, wie folgende Anweisung zu deuten ist: „Wenn das Wetter kalt ist, wird die Puff Unterlage sich langsam puffen Entrol-len die Puff Unterlage und liegen auf ihr, dann wird sie von der Wärme sich Inflationen bekommen“ (Jür-gen Hahn: Jetzt zieh den Zipfel durch die Masche; Zürich 1994)?
Verständlicherweise sollten wir bei einem Handy mit zwei, drei Schritten, jedenfalls mit einer fest de-finierten und möglichst geringen Anzahl, in die Lage versetzt werden, einen Gesprächspartner anzurufen
Trang 27(Endlichkeit) Selbst ein Schweizer Taschenhandy,
mit dem wir gleichzeitig im Internet surfen, unsere
Umgebung filmen und dem Kühlschrank zu Hause die
Anweisung geben, fehlende Lebensmittel automatisch
per E-Mail zu ordern, erlaubt es, zu telefonieren
Das Ergebnis der Arbeitsschritte ist entweder ein
Telefongespräch oder eine Mitteilung über die
(mo-mentane) Unerreichbarkeit des gewünschten
Ge-sprächspartners (Terminierung) In jedem Fall wird
klar, wann der Prozess des Telefonierens endet
Unabhängig davon, wann man sein Handy zückt
und versucht, zu telefonieren, ist das Ergebnis
im-mer dasselbe, nämlich so, wie im vorhergehenden
Abschnitt angesprochen (Determinismus) Der
Pro-zessablauf ist exakt festgelegt, bei jedem Einzelschritt
ist dem Anwender erkennbar, wo er sich gerade
befin-det Und das Ergebnis des Prozesses ist vorhersagbar
Wir müssen nicht damit rechnen, dass unser Handy
bei Betätigen das Haus des Nachbarn sprengt oder
un-ser Auto startet (nun ja, Letzteres ist sicher nur noch
eine Frage der Zeit)
Prinzipiell funktioniert ein Algorithmus für ein
Computerprogramm nicht anders Wenn es uns
den-noch leichter fällt, Handlungsanleitungen bezüglich
des Telefonierens zu verstehen als Programmcode zu
lesen, so liegt das lediglich an der Form, in der uns
die Anweisungen für den Computer begegnen Sie
lie-gen in einer jeweils eilie-genen Sprache vor, die über eine
spezifische Syntax (Struktur, Grammatik) und
Seman-tik (Bedeutung) verfügt Genau das aber gilt auch für
die erwähnte Handlungsanleitung, die nur deshalb
von uns so einfach verstanden werden kann, weil uns
die Syntax und Semantik der verwendeten Sprache
vertraut sind Würde die Anleitung beispielsweise in
Suaheli abgefasst, sähe sie genau so unverständlich
aus wie Programmcode
In einer grundlegenden Hinsicht unterscheiden sich
allerdings Handlungsanleitung und Programmcode
voneinander: Menschen sind in der Lage, mit
unvoll-ständigen Informationen umzugehen, Computer
dage-gen nicht (an dieser Stelle wollen wir den spannenden
Bereich der Fuzzy Logic unbeachtet lassen) Wenn
jemand die Anweisung erhält, für einen Besucher eine
Tasse zu holen, damit dieser sich Kaffee hinein
schüt-ten kann, dürfen wir in den meisschüt-ten Fällen davon
aus-gehen, eine saubere Tasse zu erhalten Ist sie es nicht,
wird sie gespült, oder es erfolgt solange eine Suche,
bis eine saubere Tasse aufgetrieben werden konnte In
einem Computerprogramm dagegen müsste die Tasse
spezifiziert werden: „Sauber“ könnte man als schaft der Tasse bezeichnen, die true, also wahr sein müsste, bevor sie verwendet werden dürfte Andern-falls wäre das Programm nicht in der Lage, zu ent-scheiden, welche Art von Tasse gewünscht wird So wichtig dieser Punkt ist, so häufig machen gerade An-fänger den Fehler, Bedingungen vorauszusetzen, die einem Programm eigentlich explizit mitgeteilt werden müssten Damit schleichen sich Fehler ein, die ausge-sprochen schwer zu bereinigen sind, weil sie zwar der Logik, nicht jedoch der Syntax der verwendeten Pro-grammiersprache widersprechen Syntaxfehler lassen sich durch Tools i d R recht einfach automatisiert finden, Logikfehler dagegen nicht An dieser Stelle künden sich schon lange Nächte an
Eigen-3.3 Hilfsmittel zur Entwicklung von Algorithmen
Gerade am Anfang stellt sich die Frage, wie man denn für ein Problem eine angemessene Lösung entwickeln kann, bevor man den betreffenden Programmcode schreibt Es existieren mehrere Vorgehensweisen, die mit wechselnden Abstraktionsleveln und partiell mit visuellen Hilfsmitteln arbeiten Dazu gehören:Flowchart
• Der Ablauf eines Programms wird mit genormten Symbolen visualisiert Wer beispiels-weise aus dem Design-Bereich zur Programmie-rung findet, kennt eine ähnliche Vorgehensweise Dort dienen Flowcharts dazu, um Strukturen wie etwa den hierarchischen Aufbau eine Site zu erfas-sen In der Programmierung bildet ein Flowchart dagegen einen Prozess ab
Natürliche Sprache In dieser Form haben wir im
•
vorhergehenden Absatz bereits das Telefonieren angesprochen Gemeint ist, dass man eine Prob-lemlösung in beredter Prosa formuliert, ohne sich
an eine allzu strenge Form zu halten Der Vorteil besteht in der Möglichkeit, schnell eine Handlungs-anleitung zu erhalten, da die verwendete Sprache unserer Alltagssprache entspricht
Pseudo-Code Wer bereits über
Programmierkennt-•
nisse verfügt, kann mit einem Zwitter zwischen beredter Prosa und halbwegs formaler Syntax eine Problemlösung erarbeiten und beschreiben Solcher Code soll möglichst unabhängig von der
Trang 2814 Kapitel 3 Programmentwicklung und Programmiersprachen
Syntax einer konkreten Programmiersprache
for-muliert werden
Wir wollen uns die Verwendung von Flowcharts
und Pseudo-Code etwas genauer anschauen Dabei
konzentrieren wir uns auf die klassische funktionale
Programmierung, objektorientierte Programmierung
dagegen wird nicht weiter berücksichtigt Wir wählen
diese Vorgehensweise, um die Lernkurve nicht allzu
steil ansteigen zu lassen
3.3.1 Flowcharts
Sucht man eine Vorgehensweise, die einerseits ohne
allzu intensive Programmierkenntnisse funktioniert
und andererseits trotzdem die gewünschte
Programm-funktionalität verständlich abbildet, so empfiehlt
sich ein Flowchart (Flussdiagramm) Es existieren
zahlreiche spezialisierte Programme, die genormte
Symbole zur Erstellung anbieten Leistungsfähig ist
beispielsweise SmartDraw, das sich neben leichter
Bedienbarkeit durch eine ausgesprochen große
Sym-bolbibliothek auszeichnet Natürlich existieren wie
immer im Freeware- und Open Source-Bereich
eben-falls Programme, die durchaus Vergleichbares leisten
Notfalls kann man sich auch mit Flash (bzw einem
beliebigen Vektor-Grafikprogramm) begnügen, denn
die wichtigsten Symbole lassen sich schnell als vieClip oder Grafik-Objekt erstellen
Mo-Um die Entwicklung verständlicher Flowcharts zu ermöglichen, legt die Norm DIN 66001 fest, welche Art von Symbolen verwendet werden sollte In den meisten Fällen reicht es aus, wenn Sie mit den in den Abbildungen 1 und 2 gezeigten Symbolen arbeiten Ein Diagramm könnte beispielhaft so aussehen, wie in Abbildung 2 gezeigt
Diese Abbildung visualisiert in vereinfachter Form den eigentlich erstaunlich komplexen Vorgang des allmorgendlichen Aufbruchs zur Arbeitsstelle Sobald wir über die Türschwelle treten, beginnen die Prob-leme, dargestellt an nur einem exemplarisch behan-delten Beispiel So müssen wir uns die Frage stellen,
ob es regnet oder ob im Laufe des Tages Regen zu erwarten ist Falls ja, nehmen wir einen Regenschirm und marschieren anschließend zur Bushaltestelle Falls nein, gehen wir zu Fuß zum Ziel In beiden Fäl-len endet der Prozess zumeist mit der Ankunft an der Arbeitsstelle
Flussdiagramme sollten bestimmten Regeln gen, die zwar nicht zwingend vorgeschrieben sind, deren Einhaltung aber das Lesen derartiger Grafiken erleichtert:
fol-1 Der Programmablauf (zumindest die allgemeine Logik) erfolgt von oben nach unten und von links nach rechts Im Einzelfall mag es notwendig sein,
Abbildung 1: Standardsymbole zur Entwicklung eines Flowcharts
Trang 29mal einen Schritt von rechts nach links zu
visua-lisieren, aber das sollte möglichst eine Ausnahme
bleiben Andernfalls fällt es schwer, den Ablauf
korrekt zu erfassen Die Ablaufrichtung entspricht
damit unserer gewohnten Leserichtung
2 Es sollten nur Standardsymbole verwendet werden
Natürlich existieren mehr als die oben
vorgestell-ten Symbole, aber schon mit diesen 8 können Sie
sehr komplexe Programmabläufe visualisieren
Weitere Symbole lassen sich z B für SmartDraw
auf der Webseite des Herstellers herunterladen
(oder einsehen, falls Sie nur mit Flash arbeiten)
Widerstehen Sie auf jeden Fall der Versuchung,
ei-gene Symbole zu kreieren – denn diese können nur
Sie selbst verstehen
3 Jedes Symbol hat entweder nur einen Eingang, nur
einen Ausgang, nur einen Ein- und einen Ausgang
oder einen Eingang und zwei Ausgänge
4 Ein Entscheidungssymbol enthält eine Frage, die
nur mit Ja/Nein beantwortet werden kann Für
jemanden, der es nicht gewohnt ist, mit
Flussdia-grammen zu arbeiten, stellt dies sicher die größte
Herausforderung dar
Flussdiagramme bieten den unschätzbaren Vorteil,
dass sie einen zwingen, die gesamte Programmlogik
in sehr kleine Schritte zu zerlegen Mag einem
vor-her die Logik schon im Großen und Ganzen klar
ge-wesen sein, so ist es dennoch nicht selten, dass man
beim Programmieren feststellen muss, irgend etwas
übersehen oder nicht tief genug durchdacht zu haben
Vor solchen Stolpersteinen schützt ein sauber
ausge-arbeitetes Flussdiagramm Ist diese Arbeit geleistet,
fällt das eigentliche Programmieren insgesamt
leich-ter, da einem nun klar ist, was genau wann geschieht
Als nachteilig erweist sich jedoch der relativ hohe
Zeitaufwand, der mit dem Erstellen von Flowcharts
verknüpft ist, und die eher geringe Flexibilität, da
nachträgliche Änderungen im Programmablauf dazu
zwingen können, weite Strecken des Diagramms neu
erstellen zu müssen
3.3.2 Pseudo-Code
Eine in Pseudo-Code (auch: Schein-Code)
formu-lierte Lösung orientiert sich strukturell allgemein an
Programmiersprachen, formuliert aber die einzelnen
Arbeitsschritte in einer relativ nahe an der sprache liegenden Form Derartiger Code bedient sich bestimmter festgelegter Schlüsselwörter, um die Funktionsweise eines Algorithmus’ oder, allgemeiner, den Ablauf eines Programms sprachunabhängig ab-zubilden Sprachunabhängig bedeutet natürlich, dass
Alltags-sich dieser Code nicht an eine spezifische
Program-miersprache anlehnt (andernfalls würde man ja schon das konkrete Programm schreiben) Eine einfache if-else-Abfrage würde in Pseudocode beispielsweise folgendermaßen geschrieben:
wenn (Bedingung) Anweisung(en) sonst
Anweisung(en)
Abbildung 2: Beispielhaftes Flussdiagramm logik)
Trang 30(Programm-16 Kapitel 3 Programmentwicklung und Programmiersprachen
Das ActionScript -Äquivalent würde so aussehen:
Da Pseudocode über das Einrücken und über einige
Schlüsselbegriffe Programmiersprachen
näherungs-weise abbildet, ist es zumindest prinzipiell relativ
einfach, daraus den benötigten korrekten Code zu
er-zeugen Stärker als Flussdiagramme setzt Pseudocode
jedoch eine gewisse Erfahrung im Programmieren
vo-raus, um sinnvoll Logiken abbilden zu können
Das obige Beispiel könnte man etwa so
formulie-ren:
function zurArbeitGehen(){
gehe zur Tür hinaus
wenn(Wetter sieht regnerisch aus){
nehme Schirm;
gehe zur Bushaltestelle;
fahre zum Ziel;
}sonst{
gehe zum Ziel;
}
}
Die einzelnen Schritte bleiben gegenüber dem
Flow-chart notwendigerweise gleich In beiden Fällen
kon-trollieren wir beispielsweise das Wetter Nur sieht die
Struktur, in der die Schritte wieder gegeben werden,
durchaus ähnlich aus, wie sie auch in einem konkreten
Programm zu finden wäre:
Anweisungen werden in der Reihenfolge der
Aus-•
führungen untereinander geschrieben Ein
hori-zontales Abweichen wie beim Flowchart (Ja, Nein)
existiert hier nicht
Logisch aufeinander bezogene Anweisungen
Block, der if-Bedingung, erfasst
In einem „richtigen“ Code müsste abschließend noch
der Aufruf der Funktion zurArbeitGehen() erfolgen,
aber auch so ist der Ablauf unserer Lösung zu
erken-nen und nachzuvollziehen
3.4 Beispiel-Algorithmus
„Kaffee kochen“
Der Volksmund weiß, dass Programmierer chig, männlich und exzessive Kaffeetrinker sind Le-diglich das letztgenannte Vorurteil stimmt, weswegen wir uns am konkreten Beispiel des Kaffeekochens an-schauen wollen, wie sich ein komplexeres Programm
dickbäu-in Pseudo-Code entwickeln lässt Wir wählen edickbäu-ine Top-Down-Vorgehensweise
In der allgemeinsten Form bzw auf dem höchsten straktionslevel besteht der fragliche Prozess aus zwei Teilen:
Ab-Kaffee kochen Fertigen Kaffee servierenDas reicht allerdings bei weitem nicht aus, um den betreffenden Prozess zielgerichtet in Gang zu setzen
Es fehlen nämlich konkrete Einzelschritte bzw lungsanweisungen Jeder dieser Teile umfasst eine Reihe von Schritten, die in manchen Fällen von spe-zifischen Bedingungen abhängen Betrachten wir den ersten der genannten Teile, lässt er sich aufsplitten in die Phasen:
Hand-vorbereiten aufbrühenÄhnlich können wir den zweiten Teil untergliedern in:
vorbereiten servieren
In beiden Fällen gehen dem Ergebnis der zesse – fertiger Kaffee, „vollendeter Genuß“ TM – vor-bereitende Schritte voraus In Bezug auf das Aufbrü-hen handelt es sich um:
Trang 31Teilpro-Kanne mit Wasser füllen
Wasser in Maschine füllen
Kanne in Maschine stellen
Filter in Maschine einsetzen
Pulver in Filter füllen
einschalten
Selbst an dieser Stelle haben wir noch nicht die
kleinstmögliche Schrittfolge erreicht Weitere
Unter-teilungen sind möglich So besteht der erste Punkt, das
Füllen der Kanne, aus folgenden Einzelhandlungen:
Kanne fassen
Zum Wasserhahn gehen
Unter Wasserhahn halten
Wasser fließen lassen
Wasser stoppen
Kanne zur Maschine bringen
Dieses Verfeinern wird solange durchgeführt, bis
man ganz kleinschrittige Anweisungen findet, die
sich nicht mehr unterteilen lassen Für unsere Zwecke
reicht der erzielte Detailgrad aus Zu Übungszwecken
können Sie jedoch gerne alle weiteren Schritte soweit
ausarbeiten, bis sie sich nicht mehr in kleinere
Häpp-chen unterteilen lassen
Auf dieser Basis lässt sich ein Algorithmus
ange-messen formulieren Er sieht zum aktuellen Zeitpunkt
Zum Wasserhahn gehen
Unter Wasserhahn halten
Wasser fließen lassen
Wasser stoppen
Kanne zur Maschine bringen
Wasser in Maschine füllen
Kanne in Maschine stellen
Filter in Maschine einsetzen
Pulver in Filter füllen
einschalten
aufbrühen
Fertigen Kaffee servieren
vorbereiten Tassen nehmen Zucker nehmen Milch nehmen servieren Kaffee in Tasse füllen Zucker geben
Milch gebenWir könnten so fortfahren, bis wir eine zwar endli-che, aber aufgrund der vielen Schritte endlos lang er-scheinende Liste mit Instruktionen erhalten würden Wirklich lesbar und damit verständlich ist eine solche Form allerdings nicht Daher fügen wir eine formale Gliederung ein, die durch eingerückte Zeilen eine hi-erarchische Abhängigkeit anzeigt:
Kaffee kochen vorbereiten Kanne mit Wasser füllen Kanne fassen
Zum Wasserhahn gehen Unter Wasserhahn halten Wasser fließen lassen Wasser stoppen Kanne zur Maschine bringen Wasser in Maschine füllen Kanne in Maschine stellen Filter in Maschine einsetzen Pulver in Filter füllen einschalten
aufbrühen Fertigen Kaffee servieren vorbereiten
Tassen nehmen Zucker nehmen Milch nehmen servieren Kaffee in Tasse füllen Zucker geben
Milch gebenWir können nun auf einen Blick erkennen, dass die Schritte vorbereiten bis aufbrühen im ersten Teil zum Kochen des Kaffees gehören Solche Anweisungs-
Trang 3218 Kapitel 3 Programmentwicklung und Programmiersprachen
Blöcke lassen sich in Programmiersprachen in
soge-nannten Funktionen erfassen Dabei ist eine bestimmte
Schreibweise bei der Wahl der Funktionsnamen zu
be-rücksichtigen, die wir hier geflissentlich weitgehend
ignorieren wollen, da es zunächst nur um das Prinzip
geht Wir kommen darauf in den nachfolgenden
Ka-piteln zu Variablen und Funktionen in ActionScript
jedoch ausführlicher zu sprechen
Ändern Sie den Pseudo-Code so, wie es die
fett-gedruckten Zeilen anzeigen (aus Gründen der
Über-sichtlichkeit wollen wir ab dieser Stelle derartige
Än-derungen fett auszeichnen):
function kaffeeKochen(){
vorbereiten
Kanne mit Wasser füllen
Kanne fassen
Zum Wasserhahn gehen
Unter Wasserhahn halten
Wasser fließen lassen
Wasser stoppen
Kanne zur Maschine bringen
Wasser in Maschine füllen
Kanne in Maschine stellen
Filter in Maschine einsetzen
Pulver in Filter füllen
Formal gesehen umfasst unser Code nun zwei
Funkti-onsdefinitionen, in denen teilweise ganz konkrete
An-weisungen und Befehle enthalten sind, sowie danach
in den beiden letzten Zeilen folgend zwei aufrufe Diese Aufrufe sorgen dafür, dass die vorher definierten Anweisungen auch wirklich ausgeführt werden Sie sind vergleichbar mit einer Aufforderung
Funktions-an eine Funktions-andere Person, jetzt Kaffee aufzubrühen und
zu servieren
Durch die Verwendung des Schlüsselworts tion sowie der runden Klammern () machen wir deutlich, dass es sich hier um die Definition einer Be-fehlsfolge handelt Mit den geschweiften Klammern {} kennzeichnen wir deren Anfang und Abschluss.Die Übersichtlichkeit erhöht sich weiter, wenn wir die sehr detaillierten Schritte, die zu einer über-geordneten Handlungsanweisung wie beispielsweise Kanne mit Wasser füllen gehören, ebenfalls in eine Funktion auslagern
func-Ändern Sie den Pseudo-Code:
function kaffeeKochen(){
vorbereiten()
aufbrühen }
function fertigenKaffeeServieren(){ vorbereiten
Tassen nehmen Zucker nehmen Milch nehmen servieren Kaffee in Tasse füllen Zucker geben
Milch geben }
Trang 33kaffeeKochen();
fertigenKaffeeServieren();
Alle Schritte, die zum Vorgang vorbereiten
gehö-ren, haben wir in eine entsprechende Funktion
verla-gert Jedes Mal, wenn wir Kaffee aufbrühen wollen,
rufen wir diese Funktion auf, um alles Notwendige
bereitzustellen
Schauen wir uns den bisherigen Code an,
er-kennen wir, dass es noch eine zweite Stelle gibt,
an der die Anweisung vorbereiten zu finden ist,
nämlich unmittelbar vor dem Servieren des fertigen
Kaffees In einem früheren Abschnitt wurde darauf
verwiesen, dass wir mit zweideutigen Informationen
i d R umgehen können Im aktuellen Beispiel
wür-den Menschen aus dem jeweiligen Kontext darauf
schließen, dass Vorbereiten einmal die Verwendung
eines Filters, ein anderes mal die Suche nach
saube-ren Tassen umfasst Eine Maschine bzw ein
Compu-ter dagegen wäre zu einer derartigen InCompu-terpretation
nicht in der Lage und würde statt dessen bei jeder
Handlungsanweisung vorbereiten genau das tun,
was in der gleichnamigen Funktionsdefinition bzw
Handlungsdefinition steht Was für korrekten
Pro-grammcode gilt, sollte man sich daher auch für einen
Pseudo-Code merken: Wenn möglich, sind
verschie-dene Handlungsanweisungen auch mit verschieverschie-denen
Begriffen zu formulieren, was es in formaler Hinsicht
erleichtert, das spätere Skript fehlerfrei in der
richti-gen Syntax zu entwickeln Wir könnten hier die
ver-schiedenen Anweisungen des vorbereiten durch
ein Suffix genauer kennzeichnen, z B
vorberei-tenKaffee und vorbereitenServieren Dann
sähe unser Code so aus:
…Die drei Punkte (…) deuten Auslassungen an, um nicht permanent den gesamten Code wiederholen zu müssen Sie fügen an dieser Stelle gedanklich die be-reits oben dargestellten Zeilen ein
Damit können wir nun eigentlich genüsslich fee schlürfen Allerdings bleiben in unserem Al-gorithmus noch einige Fragen offen Ein typisches Problem stellen die Vorannahmen dar Dort haben wir vorausgesetzt, dass Wasser, Kaffeepulver und Strom vorhanden sind Doch was ist mit den für un-seren Prozess ebenso unverzichtbaren Filtern? Wir verwenden sie einfach in unserem Programm, ohne
Kaf-zu prüfen, ob überhaupt welche vorhanden sind Wir müssen daher unsere Funktion vorbereitenKaf- fee erweitern:
function vorbereitenKaffee(){
… Kanne in Maschine stellen
wenn(keine Filter vorhanden){
Filter kaufen gehen }
Filter in Maschine einsetzen Pulver in Filter füllen einschalten
}Auch an anderen Stellen greifen wir einfach auf Ob-jekte zu, ohne uns zu vergewissern, ob sie vorhanden sind Dasselbe gilt z B für Milch und Zucker Dem-entsprechend sollte die Funktion vorbereitenSer- vieren lauten:
function vorbereitenServieren(){
wenn (Tassen unsauber){
dann spülen }
Tassen nehmen
wenn (kein Zucker){
Zucker kaufen
Trang 3420 Kapitel 3 Programmentwicklung und Programmiersprachen
}
Zucker nehmen
wenn (keine Milch){
kaufen (bei den derzeitigen Preisen
besser: Nachbarn fragen)
}
Milch nehmen
}
Damit erweitert sich unser Algorithmus um ein
wich-tiges Konzept, nämlich die Bedingung Anweisungen
wie das Kaufen von Zucker oder das Verwenden
ei-nes Filters werden von Voraussetzungen abhängig
gemacht, die explizit im Programm als Bedingung
formuliert werden
Es gibt noch weitere Stellen, an denen
Bedingun-gen erfüllt sein müssen, ehe der nächste Arbeitsschritt
ausgeführt werden kann Dabei können diese
Bedin-gungen beliebiger Art sein Oft kommt es vor, dass
zuerst ein bestimmter Arbeitsschritt beendet werden
muss, bevor der nächste Schritt folgen kann Das gilt
in unserem Beispiel hinsichtlich des Servierens, denn
selbstverständlich muss man erst einmal abwarten, bis
der Kaffee schon fertig aufgebrüht ist, ehe man sich
daran laben kann Den aktuellen Status kann man an
der Maschine ablesen, die uns beispielsweise durch
ein Lämpchen mitteilt, wann der Kaffee fertig ist
Mo-mentan ist es allerdings noch so, dass wir zunächst
den Anweisungs-Block kaffeeKochen und dann
unmittelbar danach den Block
fertigenKaffee-Servieren ausführen Tatsächlich muss jedoch die
zweite Anweisung von dem erfolgreichen Abschluss
der ersten abhängig gemacht werden
Daher korrigieren wir unseren Code:
Zum Schluss nach allen Funktionsdefinitionen lautet
der Aufruf nur noch:
kaffeeKochen()
Nun bleibt noch der Vorgang des Servierens, der falls von Bedingungen abhängt und in eine Funktion ausgelagert werden kann Ändern Sie daher den beste-henden Pseudo-Code in:
eben-function fertigenKaffeeServieren(){ vorbereitenServieren()
wenn (Gast will Milch){
Milch geben }
ausgeführt, die notwendig sind, bevor wir die schine einschalten können Dazu gehört etwa das Einstecken eines Filters, das Einfüllen von Pulver etc
Ma-aufbrühen
• Hier haben wir nicht etwa gemogelt, schließlich fehlt doch eigentlich eine entspre-chende Definition Das Aufbrühen ist ein maschi-neninterner Vorgang, der ausgelöst wird, sobald wir den betreffenden Befehl geben Es ist nicht notwendig, kleinschrittigere Anweisungen zu ge-ben Jede Script- und Programmiersprache verfügt über derartige vorgefertigte Funktionen (natürlich nicht zum Aufbrühen, sondern um anderweitige
Trang 35Aktionen auszuführen) Sie stellen die
Grundbau-steine dar, aus denen der Programmierer seine
ei-genen, komplexeren Funktionen aufbaut
fertigenKaffeeServieren
legt fest, was geschehen soll, nachdem der Kaffee
fertig aufgebrüht wurde Sie besteht aus den zwei
Anweisungsblöcken vorbereitenServieren
und servieren
vorbereitenServieren
bedarf servieren (s u.) einiger vorbereitender
Schritte, die hier definiert werden
servieren
• Diese Funktion umfasst alle
Hand-griffe, die ausgeführt werden müssen, bis die schon
jetzt halb verdurstete Gästeschar endlich trinken
darf
Abschließend geben wir den Befehl
KaffeeKo-chen(), der die gesamte in den Funktionen
beschrie-bene Kette an Aktionen auslöst Bis zu diesem
Zeit-punkt hat einer der Gäste den Raum unter Protest in
unverständlichem Pseudo-Code verlassen, weil er
im-mer noch nichts zu trinken bekommen hat
Jeder passionierte Kaffeetrinker weiß, dass die
Menge des verwendeten Pulvers ebenso
entscheiden-den Einfluss auf entscheiden-den späteren Genuss ausübt wie die
Menge der Milch und gegebenenfalls des Zuckers
Ein noch so geringes Abweichen von der Idealmenge
vermag den Genießer in tiefste Depression zu
stür-zen Um ein solches Problem zu umgehen, empfiehlt
es sich, die Idealmenge irgendwo festzuhalten In der
Programmierung geschieht das mit Hilfe von
Varia-blen
Ganz am Anfang des Codes fügen wir ein:
mengeKaffee = 8 Löffel
Diese Information muss beim Einfüllen des Pulvers in
den Filter berücksichtigt werden:
function vorbereitenKaffee(){
…
Filter in Maschine einsetzen
mengeKaffee Pulver in Filter füllen
einschalten
}
Durch die Variable mengeKaffee haben wir exakt
festgelegt, wie viele Löffel wir zu verwenden
wün-schen Über die Funktion vorbereitenKaffee wird
nun nicht mehr eine beliebige Menge Pulver in den
Filter geschüttet, sondern genau so viel, wie in
besag-ter Variable festgehalten, in unserem konkreten Fall also 8 Löffel Auf die gleiche Art und Weise müssten alle anderen Mengenangaben präzisiert werden, also
z B Milch und Zucker
Für den Fall, dass Sie unterwegs verloren gen sind, hier der aktuelle Stand:
gegan-mengeKaffee = 8 Löffel function kaffeeKochen(){
vorbereitenKaffee() aufbrühen
wenn (Lämpchen brennt noch){
warten }sonst{
fertigenKaffeeServieren() }
} function vorbereitenKaffee (){
Kanne mit Wasser füllen Kanne fassen
Zum Wasserhahn gehen Unter Wasserhahn halten Wasser fließen lassen Wasser stoppen Kanne zur Maschine bringen Wasser in Maschine füllen Kanne in Maschine stellen wenn (keine Filter vorhanden){
Filter kaufen gehen }
Filter in Maschine einsetzen mengeKaffee Pulver in Filter füllen einschalten
} function fertigenKaffeeServieren(){ vorbereitenServieren()
servieren();
} function servieren(){
Kaffee in Tasse füllen wenn (Gast will Zucker){
Zucker geben
Trang 3622 Kapitel 3 Programmentwicklung und Programmiersprachen
wenn (keine Milch){
kaufen (bei den derzeitigen Preisen
besser: Nachbarn fragen)
}
Milch nehmen
}
kaffeeKochen();
Wäre nun nicht die richtige Zeit, um einen Schluck
zu nehmen? Leider immer noch nicht – an dieser
Stelle mag der eine oder andere Leser unzufrieden
brummeln, denn jedermann dürfte klar sein, dass die
richtige Kaffeesorte von elementarer Bedeutung für
den „vollendeten Kaffeegenuß“ TM ist Was geschieht
jedoch, wenn jemand die verwendete Sorte
keines-falls goutieren möchte? In dem Fall bliebe zwar der
gesamte Prozess vom Ablauf her der gleiche, aber
eine Variable müsste mit einem anderen Inhalt belegt
werden In der Programmierung lässt sich das
Prob-lem z B mit Hilfe einer sogenannten parametrisierten
Funktion lösen, also einer Funktion, der wir beim
Auf-ruf eine Variable mit einem bestimmten Inhalt
mitge-ben Dazu muss zunächst in der Funktionsdefinition
festgelegt werden, dass wir eine derartige besondere
… }Wenn wir den Befehl zum Kaffee kochen an die Ma-schine ausgeben, teilen wir ihr gleichzeitig mit, wel-che Sorte denn gewünscht sei In unserem konkreten Fall übergeben wir leckeren „Segafredo Intermezzo“ Wenn wir beim nächsten Mal anderen Kaffee wün-schen, brauchen wir nur dementsprechend den Aufruf
zu ändern:
function kaffeeKochen(){
vorbereitenKaffee(„Pangalaktischer Donnergurgler Espresso“)
… }Obwohl uns bereits ein Gast verlassen hat, sind immer noch mehrere vorhanden Daher reicht es nicht aus, abschließend die Funktion servieren in der momen-tanen Form aufzurufen Denn die dort beschriebenen Arbeitsschritte müssen wir nicht nur einmal, sondern
so oft ausführen, wie durstige Gäste anzutreffen sind, schließlich soll ja jeder einen Kaffee erhalten Wie-derholt auszuführende Anweisungen werden in der Programmierung mit Hilfe von Schleifen definiert Ergänzen Sie dementsprechend die Definition von servieren:
wenn (Gast will Milch){
Milch geben }
}
}Auf diese Weise wiederholen wir für jeden einzelnen Gast das gesamte Prozedere des Verteilens unseres hoffentlich köstlichen Kaffees Halten sich noch 5
Trang 37Gäste bei uns auf, führen wir die fraglichen
Anwei-sungen fünfmal aus, sind 2 da, eben nur zweimal
Wenn man Code auf diese Weise entwickelt, kommt
es vor, dass manche Information redundant und damit
überflüssig ist, und dass der Programmablauf noch
optimiert werden kann So verfügen wir mit
fer-tigenKaffeeServieren über eine Funktion, die
nichts anderes tut, als ihrerseits weitere Funktionen,
nämlich vorbereitenServieren und servieren
aufzurufen Wir können also auf
fertigenKaffee-Servieren verzichten und an deren Stelle direkt die
beiden genannten Funktionen verwenden
Die bis hierher entwickelte Form des benötigten gorithmus beschreibt bereits recht genau den Prozess, den wir programmiertechnisch abbilden wollen Er enthält zahlreiche grundlegende Elemente, die in je-dem Programm anzutreffen sind: Variable, Parameter, Aufruf bzw Anweisung, Anweisungs-Block, Schleife und Bedingung Die Abbildungen 3 bis 6 visualisieren sie in Kurzform, jeweils konkreten Elementen unseres Pseudo-Codes zugeordnet
Al-Welche Bedeutung die jeweiligen Elemente im Einzelnen besitzen, werden wir uns in den nachfol-genden Kapiteln noch genauer anschauen
Abbildung 3: Variablen- und
Funktionsdefinition
Trang 3824 Kapitel 3 Programmentwicklung und Programmiersprachen
Abbildung 4: Anweisungsblock
Abbildung 5: Argument, meter, Schleife
Trang 39Wasser in Maschine füllen Kanne in Maschine stellen wenn(keine Filter vorhanden){
Filter kaufen gehen }
Filter in Maschine einsetzen mengeKaffee Pulver welcheSorte in Filter füllen
einschalten }
function vorbereitenServieren(){
wenn (Tassen unsauber){
dann spülen }
Tassen nehmen wenn (kein Zucker){
Zucker kaufen }
Zucker nehmen wenn (keine Milch){
Unser gesamter Pseudo-Code sieht jetzt so aus:
Zum Wasserhahn gehen
Unter Wasserhahn halten
Wasser fließen lassen
Wasser stoppen
Kanne zur Maschine bringen
Abbildung 6: Anweisung, gung, Funktionsaufruf
Trang 40Bedin-26 Kapitel 3 Programmentwicklung und Programmiersprachen
kaufen (bei den derzeitigen Preisen
besser: Nachbarn fragen)
Kaffee in Tasse füllen
wenn (Gast will Zucker){
Zucker geben
} wenn (Gast will Milch){
Milch geben }
} } kaffeeKochen();
Hätten Sie jemals gedacht, dass Kaffeekochen so pliziert und Programmieren so einfach sein könnte?