| 6 | == Dokumentation == |
| 7 | |
| 8 | |
| 9 | |
| 10 | === Wo finde ich Dokumentation? === |
| 11 | |
| 12 | Es gibt für einige Klassen Dokumentation gleich im Browser. Der ? Button zwischen Class und Instance zeigt die Klassenkommentare an. |
| 13 | Weiterhin findet ihr hier Informationen: |
| 14 | |
| 15 | |
| 16 | * [http://squeakbyexample.org/ Squeak by Example] |
| 17 | * [http://static.squeak.org/tutorials/morphic-tutorial-1.html Morphic Tutorial |
| 18 | * [http://wiki.squeak.org/squeak/30 Squeak-Wiki |
| 19 | |
| 20 | |
| 21 | === Woher ist gute Einführungsliteratur für !Squeak/Smalltalk zu finden? === |
| 22 | |
| 23 | Das Buch [http://www.squeakbyexample.org/ Squeak by Example] ist besonders geeignet, da es explizit auf |
| 24 | alle wichtigen Tools in Squeak und auch auf das Morphic-Framework |
| 25 | eingeht. Außerdem wird an vielen Beispielen die minimale Syntax und |
| 26 | wichtige Konzepte wie die Nachrichtenbasierung erklärt. |
| 27 | |
| 28 | Weiterhin gibt es noch einige praktische Tutorials zu Morphic |
| 29 | im Squeak-Wiki, die auch Hinweise zur Arbeit mit Squeak geben. |
| 30 | [http://wiki.squeak.org/squeak/792#Morphic Morphic-Wiki] |
| 31 | |
| 32 | Zum Einstieg in !Squeak/Smalltalk sind viele gute Bücher kostenlos |
| 33 | verfügbar. Eine gute Übersicht bietet: |
| 34 | [href="http://stephane.ducasse.free.fr/FreeBooks.html Free Books] |
| 35 | |
11 | | Der Dreh und Angelpunkt ist hier die Klasse Form. Die Basis von Form ist die "Squeak Canvas", eine Bitmap, die Bilder enthält, oder auf der gezeichnet werden kann. Diese Objekte können dann in !ImageMorphs verwendet werden. Bei größeren oder vielen Bildern lohnt ein Blick auf die Klassenseite von Form. Da gibt es eine Methode, die aus einer Datei direkt ein Form-Objekt lädt. Ähnliches findet sich auch auf den Klassenseiten von den Klassen PNGReadWriter, JPEGReadWriter, GIFReadWriter und weitere für spezielle Bildformate. Mit Klassen wie !FileDirectory oder !FileUrl kann im Dateisystem navigiert werden. Hierbei gilt es auch zu bedenken, dass die "Pathdelimiter" der Betriebssysteme unterschiedlich sein können (/ oder \). Bilder können auch im Image gespeichert werden. Das hat den Vorteil, das ihr die Bilder über Monticello verwalten könnt und so alle Teammitglieder über das Repository die aktuellen Bilder bekommen. Der große Nachteil ist, dass ihr die Größe des Images aufbläht. Wenn trotz ihr trotz dieses Nachteils Bilder in Methoden und damit im Image speichern wollt, könnt ihr Array-Repräsentationen gewinnen. Dazu laded ihr das Bild, wie oben beschrieben, zuerst in eine Form und aus dieser erzeugt ihr dann das Array (siehe. z.B. Form>>storeOn). Es gibt in Squeak den !ImageReadWriter als abstrakte Klasse und dazu verschiedene Implementierungen für z.B. BMP und PNG (PNGReadWriter, BMPReadWriter). Auf Klassenseite von !ImageReadWriter findet sich dann auch >>formFromFileNamed: fileName, was in der konkreten Implementierung genutzt werden kann. |
| 41 | Der Dreh und Angelpunkt ist hier die Klasse Form. Die Basis von Form ist die "Squeak Canvas", eine Bitmap, die Bilder enthält, oder auf der gezeichnet werden kann. Diese Objekte können dann in !ImageMorphs verwendet werden. Bei größeren oder vielen Bildern lohnt ein Blick auf die Klassenseite von Form. Da gibt es eine Methode, die aus einer Datei direkt ein Form-Objekt lädt. Ähnliches findet sich auch auf den Klassenseiten von den Klassen PNGReadWriter, JPEGReadWriter, GIFReadWriter und weitere für spezielle Bildformate. Mit Klassen wie !FileDirectory oder !FileUrl kann im Dateisystem navigiert werden. Hierbei gilt es auch zu bedenken, dass die "Pathdelimiter" der Betriebssysteme unterschiedlich sein können (/ oder \). Bilder können auch im Image gespeichert werden. Das hat den Vorteil, das ihr die Bilder über Monticello verwalten könnt und so alle Teammitglieder über das Repository die aktuellen Bilder bekommen. Der große Nachteil ist, dass ihr die Größe des Images aufbläht. Wenn trotz ihr trotz dieses Nachteils Bilder in Methoden und damit im Image speichern wollt, könnt ihr Array-Repräsentationen gewinnen. Dazu laded ihr das Bild, wie oben beschrieben, zuerst in eine Form und aus dieser erzeugt ihr dann das Array (siehe. z.B. ``Form>>storeOn``). Es gibt in Squeak den !ImageReadWriter als abstrakte Klasse und dazu verschiedene Implementierungen für z.B. BMP und PNG (PNGReadWriter, BMPReadWriter). Auf Klassenseite von !ImageReadWriter findet sich dann auch ``ImageWriter ``class>>formFromFileNamed``:``, was in der konkreten Implementierung genutzt werden kann. |
| 42 | |
| 206 | === Wie erreiche ich Nebenläufigkeit in Squeak? === |
| 207 | |
| 208 | Die üblichen Mechanismen Semaphore und Mutex zur Synchronisation mehrerer Prozesse sind in Squeak als Klassen verfügbar. |
| 209 | |
| 210 | Übliches Vorgehen ist z.B. |
| 211 | {{{ |
| 212 | | semaphore | |
| 213 | semaphore := Semaphore new. |
| 214 | [ .... do some work ... |
| 215 | semaphore signal ] fork. |
| 216 | semaphore wait. |
| 217 | }}} |
| 218 | Für einfache Nebenläufigkeit ohne Synchronisation existiert ``BlockClosure>>fork``. |
| 219 | {{{ |
| 220 | [50000 factorial] forkAt: ProcessScheduler userBackgroundPriority |
| 221 | }}} |
| 222 | |
| 223 | |
| 224 | |
| 225 | === Was ist die richtige Art, Klassenvariablen anzulegen? Auf Instanzseite in ``classVariableNames:`` oder auf Klassenseite in ``instanceVariableNames:``? === |
| 226 | |
| 227 | Dafür ist die instanzseitige Klassenvariable die richtige Wahl. Die klassenseitige Instanzvariable existiert nur auf Grund der Tatsache, dass Squeak ein Metaobjectprotocol besitzt und somit Klassen selbst wieder Instanz einer anderen Klasse sind. Daher besitzen sie auch Instanzvariablen. Allerdings sind die Instanzvariablen auch nur für die Klasse und nicht für Ihre Instanzen einsehbar. |
| 228 | Um Klassenvariablen (sowohl Klasse als auch Instanzen der Klasse können in Methoden darauf zugreifen) zu erhalten, sind somit die instanzseitigen Klassenvariablen die richtige Wahl. |
| 229 | Uns hatte man damals für den Singletonfall auch geraten, die Instanzseite zu nehmen, um die Singletoninstanz zu speichern. |
| 230 | |
| 231 | Erklärung nach http://www.faqs.org/faqs/smalltalk-faq/: |
| 232 | |
| 233 | Q6. What are class instance variables? |
| 234 | Ans. Class instance variables are similar to class variables, except that they are created for eachsubclass of the defining class. When a class declares a class instance variable, a new variable is created for each subclass of that class. Each subclass then has its own instance of the variable and retains its own value for the variable, but each subclass has a variable with the same name. Only class methods of a class and its subclasses can refer to class instance variables; instance methods cannot. |
| 235 | |
| 236 | |
| 237 | |
418 | | |
419 | | |
420 | | == Ohne Kategorie == |
421 | | |
422 | | === Hat Squeak einen Eventhandler für Netzwerkevents? Wie kann man eine Methode aufrufen, sobald Daten angekommen sind? === |
423 | | |
424 | | Das kommt sehr auf eure Netzwerkimplementierung an. Nutz ihr ein Standardprotokoll, so sollte die verwendete Bibliothek im Allgemeinen auch entsprechende Methoden bereitstellen. Häufig sind diese transparent, so dass die Methoden automatisch gerufen werden, sobald ein neuer Request eintrifft. Um Beispiele dafür zu sehen, schaut euch einmal im Image den WAListener an, welcher den Webserver für Seaside implementiert. Dort wird auch gezeigt wie man Prozesse "forked" um mehrere Requests gleichzeitig zu behandeln. |
425 | | |
426 | | Von dem Ansatz die ganze Sache in Morphic und dessen #step Methode abzubilden, raten wir schlichtweg ab. Der Grund: die #step Methode ist nur scheinbar parallelisiert und sollte eine Methode auf SocketStream>>#isDataAvailable warten, steht das ganze System. Ihr müsste also auf jeden Fall mit mehreren Prozessen arbeiten. Dafür verwendet ihr wie gesagt die ``fork``-methode. |
427 | | |
428 | | Um das Warten zu realisieren, schaut euch die Klasse Delay an. |
429 | | Es gibt aber noch weiter Synchronisationsprimitiven, insbesondere wenn ihr Sockets benutzt: |
430 | | Je nachdem ob ihr Socket oder !SocketStream verwendet, gibt es entsprechende Methoden die sich schlafen legen bis Daten verfügbar sind, z.B. Socket>>#waitForData (siehe Kommentar). |
431 | | |
432 | | Die Netzwerkfähigkeit wäre zwar sicher ein schönes Feature ist aber ohne entsprechende Vorkenntnisse in dem Bereich nicht ganz einfach. Überlegt es euch daher vielleicht, ob ihr dies wirklich implementieren möchtet. |
433 | | |
434 | | |
435 | | === Wie viel Kommentare sind nötig/erwünscht? === |
436 | | |
437 | | Eine einfache Regel besagt: "So viel wie nötig, so wenig wie möglich". |
438 | | Schaut euch einfach noch einmal die Idiome zum Kommentieren an (findet ihr |
439 | | in den Vorlesungsfolien, sowohl von Kent Beck als auch Dave Thomas). |
440 | | |
| 478 | == Patterns == |
453 | | === Ist Late Binding das Mittel, um Polymorphie zu erreichen und hat ohne diesen keine Funktion? === |
| 490 | |
| 491 | == Ohne Kategorie == |
| 492 | |
| 493 | |
| 494 | === Wie viel Kommentare sind nötig/erwünscht? === |
| 495 | |
| 496 | Eine einfache Regel besagt: "So viel wie nötig, so wenig wie möglich". |
| 497 | Schaut euch einfach noch einmal die Idiome zum Kommentieren sowohl von Kent Beck als auch Dave Thomas an. Diese findet ihr in den [[https://www.hpi.uni-potsdam.de/intern/studium/materialien Vorlesungsfolien und der begleitenden Literatur zur Lehrveranstaltung]. |
| 498 | |
| 499 | |
| 500 | === Hat Squeak einen Eventhandler für Netzwerkevents? Wie kann man eine Methode aufrufen, sobald Daten angekommen sind? === |
| 501 | |
| 502 | Das kommt sehr auf eure Netzwerkimplementierung an. Nutz ihr ein Standardprotokoll, so sollte die verwendete Bibliothek im Allgemeinen auch entsprechende Methoden bereitstellen. Häufig sind diese transparent, so dass die Methoden automatisch gerufen werden, sobald ein neuer Request eintrifft. Um Beispiele dafür zu sehen, schaut euch einmal im Image den WAListener an, welcher den Webserver für Seaside implementiert. Dort wird auch gezeigt wie man Prozesse "forked" um mehrere Requests gleichzeitig zu behandeln. |
| 503 | |
| 504 | Von dem Ansatz die ganze Sache in Morphic und dessen #step Methode abzubilden, raten wir schlichtweg ab. Der Grund: die #step Methode ist nur scheinbar parallelisiert und sollte eine Methode auf ``SocketStream>>isDataAvailable`` warten, steht das ganze System. Ihr müsste also auf jeden Fall mit mehreren Prozessen arbeiten. Dafür verwendet ihr wie gesagt die ``fork``-methode. |
| 505 | |
| 506 | Um das Warten zu realisieren, schaut euch die Klasse Delay an. |
| 507 | Es gibt aber noch weiter Synchronisationsprimitiven, insbesondere wenn ihr Sockets benutzt: |
| 508 | Je nachdem ob ihr Socket oder !SocketStream verwendet, gibt es entsprechende Methoden die sich schlafen legen bis Daten verfügbar sind, z.B. ``Socket>>waitForData`` (siehe Kommentar). |
| 509 | |
| 510 | Die Netzwerkfähigkeit wäre zwar sicher ein schönes Feature ist aber ohne entsprechende Vorkenntnisse in dem Bereich nicht ganz einfach. Überlegt es euch daher vielleicht, ob ihr dies wirklich implementieren möchtet. |
| 511 | |
| 512 | |
| 513 | |
| 514 | === Ist Late Binding nur ein Mittel, um Polymorphie zu erreichen? === |
468 | | === Gibt es in Squeak so etwas wie eine !FileDialog Klasse? === |
469 | | |
470 | | Helfen kann euch hier die Klasse !FileList. |
471 | | |
472 | | |
473 | | === Was ist die richtige Art, Klassenvariablen anzulegen? Auf Instanzseite in ``classVariableNames:`` oder auf Klassenseite in ``instanceVariableNames:``? === |
474 | | |
475 | | Dafür ist die instanzseitige Klassenvariable die richtige Wahl. Die klassenseitige Instanzvariable existiert nur auf Grund der Tatsache, dass Squeak ein Metaobjectprotocol besitzt und somit Klassen selbst wieder Instanz einer anderen Klasse sind. Daher besitzen sie auch Instanzvariablen. Allerdings sind die Instanzvariablen auch nur für die Klasse und nicht für Ihre Instanzen einsehbar. |
476 | | Um Klassenvariablen (sowohl Klasse als auch Instanzen der Klasse können in Methoden darauf zugreifen) zu erhalten, sind somit die instanzseitigen Klassenvariablen die richtige Wahl. |
477 | | Uns hatte man damals für den Singletonfall auch geraten, die Instanzseite zu nehmen, um die Singletoninstanz zu speichern. |
478 | | |
479 | | Erklärung nach http://www.faqs.org/faqs/smalltalk-faq/: |
480 | | |
481 | | Q6. What are class instance variables? |
482 | | Ans. Class instance variables are similar to class variables, except that they are created for eachsubclass of the defining class. When a class declares a class instance variable, a new variable is created for each subclass of that class. Each subclass then has its own instance of the variable and retains its own value for the variable, but each subclass has a variable with the same name. Only class methods of a class and its subclasses can refer to class instance variables; instance methods cannot. |
483 | | |
484 | | |
485 | | === Woher ist gute Einführungsliteratur für Squeak zu finden? === |
486 | | |
487 | | Das Buch [http://www.squeakbyexample.org/ Squeak by Example] ist besonders geeignet, da es explizit auf |
488 | | alle wichtigen Tools in Squeak und auch auf das Morphic-Framework |
489 | | eingeht. Außerdem wird an vielen Beispielen die minimale Syntax und |
490 | | wichtige Konzepte wie die Nachrichtenbasierung erklärt. |
491 | | |
492 | | Weiterhin gibt es noch einige praktische Tutorials zu Morphic |
493 | | im Squeak-Wiki, die auch Hinweise zur Arbeit mit Squeak geben. |
494 | | [http://wiki.squeak.org/squeak/792#Morphic Morphic-Wiki] |
495 | | |
496 | | Zum Einstieg in !Squeak/Smalltalk sind viele gute Bücher kostenlos |
497 | | verfügbar. Eine gute Übersicht bietet: |
498 | | [href="http://stephane.ducasse.free.fr/FreeBooks.html Free Books] |
499 | | |
500 | | |
529 | | === Welche Streams verwendet man zum Dateien schreiben auf Gemstone? === |
530 | | |
531 | | Dateibehandlung findet in Gemstone mit Hilfe der Klasse !GsFile statt. |
532 | | In Gemstone gibt es immer die Unterscheidung, ob etwas auf dem Client |
533 | | (also, !GemTools oder seaside-gem) oder Server (also stone) passiert. |
534 | | Darauf beziehen sich dann die entsprechenden *onClient* und *onServer*- |
535 | | methoden auf Klassenseite von !GsFile. |
536 | | |
537 | | |
538 | | === Wie erreiche ich Nebenläufigkeit in Squeak? === |
539 | | |
540 | | Die üblichen Mechanismen Semaphore und Mutex zur Synchronisation mehrerer Prozesse sind in Squeak als Klassen verfügbar. |
541 | | |
542 | | Übliches Vorgehen ist z.B. |
543 | | {{{ |
544 | | | semaphore | |
545 | | semaphore := Semaphore new. |
546 | | [ .... do some work ... |
547 | | semaphore signal ] fork. |
548 | | semaphore wait. |
549 | | }}} |
550 | | Für einfache Nebenläufigkeit ohne Synchronisation existiert BlockClosure>>fork. |
551 | | {{{ |
552 | | [50000 factorial] forkAt: ProcessScheduler userBackgroundPriority |
553 | | }}} |
| 563 | = Acknowledgments = |
| 564 | [[Image(media/icons/silk:user.png, nolink)]] To date the following contributors: |
| 565 | * Developer1 |
| 566 | * Developer2 |