Rapid Application Development, RAD

Transcrição

Rapid Application Development, RAD
Schnelles Prototyping
(Rapid Application Development, RAD)
Prof. Dr. rer. nat. habil. Uwe Aßmann
Lehrstuhl Softwaretechnologie
Fakultät für Informatik
TU Dresden
Softwaretechnologie, © Prof. Uwe Aßmann
1
Obligatorische Literatur
►
►
Sebastian Mieth. Ein Vergleich zwischen Java und Pike. Kompetenzschein
Softwaretechnik, TU Dresden, Softwaretechnologie, 2004.
http://pike.ida.liu.se
Prof. U. Aßmann, Softwaretechnologie
2
2 Trends in der Softwareentwicklung
►
Rapid Application Development (RAD)
■
■
►
Zeit
pike
Mit Skriptsprachen
■
■
■
►
Schneller viel Code schreiben
Sehr schnell ein UML-Modell in ausführbaren
Code übersetzen
Perl (Larry Wall etc, www.perl.org)
Python (Guido van Rossum, www.python.org)
Pike (Frederik Hübinette et al., pike.ida.liu.se)
Java
Java
1.5
Zuverlässigkeit
Eigenschaften
■
■
■
■
■
■
Oft schwach oder ungetypt (Strings und integer werden unterschieden)
Interaktive Umgebungen
JIT compiler, die implizit gestartet werden
Gute Mustererkennung (string pattern machting) und Stringverarbeitung
Mächtige Operationen, die schnell zu schreiben sind und direkt aus Analyse- oder
Entwurfsmodellen codierbar sind
Grosse Bibliotheken erhältlich
Prof. U. Aßmann, Softwaretechnologie
3
Transformation auf Behälterklassen in Java (Wdh.)
Ersetzen von “*”-Assoziationen durch Behälterklassen
Bestellung
Bestellung
– kunde: String
– kunde: String
+ neuePosition(b: Bestellposition)
+ löschePosition(pos int)
+sonderpreis(pos: int, preis: int)
+ auftragssumme(): int
+ print()
+ neuePosition(b: Bestellposition)
+ löschePosition(pos int)
+sonderpreis(pos: int, preis: int)
+ auftragssumme(): int
+ print()
1
<<interface>>
Collection
1
{ordered}
*
Bestellposition
Bestellposition
– anzahl: String
– preis: int
– anzahl: String
– preis: int
+ einzelpreis(): int
+ einzelpreis(p: int)
+ positionspreis(): int
+ einzelpreis(): int
+ einzelpreis(p: int)
+ positionspreis(): int
für
*
1
für
*
*
1
Artikel
Artikel
– name: String
– preis: int
– name: String
– preis: int
+ preis(): int
1 {ordered}
+ preis(): intProf. U. Aßmann, Softwaretechnologie
4
Abbildung von UML-Assoziationen in der
Skriptsprache Pike
Ersetzen von “*”-Assoziationen durch Behälterklassen
Bestellung
Bestellung
– kunde: String
– kunde: String
+ neuePosition(b: Bestellposition)
+ löschePosition(pos int)
+sonderpreis(pos: int, preis: int)
+ auftragssumme(): int
+ print()
+ neuePosition(b: Bestellposition)
+ löschePosition(pos int)
+sonderpreis(pos: int, preis: int)
+ auftragssumme(): int
+ print()
1
array|multiset|
mapping
1
{ordered}
*
Bestellposition
Bestellposition
– anzahl: String
– preis: int
– anzahl: String
– preis: int
+ einzelpreis(): int
+ einzelpreis(p: int)
+ positionspreis(): int
+ einzelpreis(): int
+ einzelpreis(p: int)
+ positionspreis(): int
für
*
1
für
*
*
1
Artikel
Artikel
– name: String
– preis: int
– name: String
– preis: int
+ preis(): int
1 {ordered}
+ preis(): intProf. U. Aßmann, Softwaretechnologie
5
Generische Datentypen in Pike
►
Pike kennt generische Datentypen (array (arraylist), multiset (bag)). Beide
Collection-Datentypen können aber auch ungetypt verwendet werden
(mixed)
// This is pike, not Java
class Bestellung {
array(Bestellposition) positionen;
// generic
array positionen2;
// mixed
multiset(Bestellposition) positionen3; // generic
multiset positionen4;
// mixed
}
Bestellposition b1 = Bestellposition();
Bestellposition b2 = Bestellposition();
main() {
positionen = ({b1, b2});
// a typed array
positionen2 = ({b1, “A”, 3}); // a mixed array
positionen3 = ([b1, b2, b2]); // a typed multi-set (bag)
positionen4 = ([b1, b2, b2, ”A”, “A”]);
// a mixed multi-set (bag)
}
Prof. U. Aßmann, Softwaretechnologie
6
Mehr über Arrays in Pike
►
Mächtige Array-Operatoren, die sehr knappe Spezifikation von mächtigen
Algorithmen erlauben (gut für RAD)
// This is pike, not Java
array empty = ({});
// mixed, empty array
// An array of arrays of int
array(array(int)) p = ({ ({ 1, 3 }), ({ 2, 4, 3 })
});
array(int) a = ({ 1, 3 });
array(int) b = ({ 2, 4, 3 });
array
array
array
array
a_sum = a+b;
// ({ 1, 3, 2, 4, 3 })
a_difference = a-b; // ({ 1 })
a_intersection = a&b;// ({ 3 })
a_division = b/2.0; // ({ ({2,4}),({3}) }) Erzeugung von 2-d Arrays
Prof. U. Aßmann, Softwaretechnologie
7
Mappings (Assoziative Arrays) als allgegenwärtige
Datenstruktur
►
Pike hat assoziative Arrays eingebaut (mappings, in Java: Map)
■
►
Sehr sinnvoll, da mappings als explizit repräsentierte Funktionen in sehr vielen
Anwendungen vorkommen
Ein mapping ist ein array von (key, value) pairs
■
Zufügen mit +=, Entfernen mit -=
// This is pike, not Java
mapping empty = ([]);
// mixed, empty mapping
mapping(string:int) DresdenPhoneBook =
([ “Assmann” : 072349879, “Miller” : 08784994 ]);
mapping(string:int) GelsenkirchenPhoneBook = ([ ... ]);
mapping(string:mapping(string:int)= GermanPhoneBooks =
([ “Dresden” : DresdenPhoneBook,
“Gelsenkirchen”: GelsenkirchenPhoneBook, ... ]);
int assmann_phone = GermanPhoneBooks[“Dresden”][“Assmann”];
// Korregiere Assmanns Nummer
DresdenPhoneBook -= ({ “Assmann”:072349879 });
GelsenkirchenPhoneBook += ({ “Assmann”:048889879 });
Prof. U. Aßmann, Softwaretechnologie
8
Pike hat Mehrfachvererbung
►
Mehrfachvererbungen aus UML können direkt in Pike eingetippt werden
Nationality
German
// This is pike, not Java
class Elsaesser {
inherit Francais;
inherit German;
void eat () {
// super call auf Klasse Francais
Francais::mange();
};
void talk () {
// super call auf Klasse German
German::sprechen();
};
}
Francais
Elsaesser
Prof. U. Aßmann, Softwaretechnologie
9
String-Verarbeitung in Pike
►
►
Die wahre Stärke zeigt das Array-Konzept bei der String-Verarbeitung
Anwendungsgebiete der Stringverarbeitung:
■
■
■
►
Web-Programmierung (template processing von html-Schablonen)
Textverarbeitung
Suchanwendungen in Datenbasen
Strings sind ähnlich zu Arrays
■
Operatoren sum, intersect, division u.v.m.
// This is pike
string translateToWindows(string
// divide String by „/“
array(string) directories
// concatenate again with
return „\\“+directories *
}
path) {
= path / ”/”;
„\\“
“\\”;
translateToWindows(“/home/ua1/local/papers”);
Prof. U. Aßmann, Softwaretechnologie
10
String-Verarbeitung in Pike
►
►
Die map – Funktion wendet eine Funktion auf alle Elemente eines arrays an
Der * Operator distributiert ein Zeichen über ein Array von strings
// This is pike
string countPath(string path) {
return (array(string)) map(path / “/”, sizeof)
// ex.: ({ 4, 3, 5, 6 })
* “,”;
// ex.: “4,3,5,6”
}
countPath(“/home/ua1/local/papers”);
Prof. U. Aßmann, Softwaretechnologie
11
String-Verarbeitung: Splicing
►
Splice-Operator wendet eine Operation auf alle Elemente eines Arrays an
(ähnlich zu map)
// This is pike
array(string) currencies = ({ “Euro”, “Dollar”, “Yen”, “Pound” });
ausgabe(4.32, @currencies);
// 4.32 Euro
4.32 Dollar
4.32 Yen
4.32 Pound
ausgabe(4.32, “Euro”, “Dollar”, “Yen”, “Pound”);
// the same output
array(float) exchangeRates = ({ 1.32, 1, 4, 1.6 });
int money = 33;
float calc (float rate, int i) { return i*rate; }
array(float) moneys = map(exchangeRates, calc, money);
// accumulate moneys by + operator
float|int sum = +(0,@moneys);
Prof. U. Aßmann, Softwaretechnologie
12
Vorteil von Pike: Skalisierbare Typisierung
►
Man kann einen Pike Prototyp ohne Typisierung beginnen und die Typen
später hinzufügen
■
■
►
►
Um die Programmiersicherheit zu erhöhen
Um die Effizienz zu erhöhen
Ausserdem kann man Java aufrufen und schrittweise die Anwendung in Java
umwandeln
Das ist einmalig für eine Skriptsprache und hervorragend für RAD
Untypisierter Pike Prototyp
Typisierter Pike Prototyp
Prof. U. Aßmann, Softwaretechnologie
13
Abbildungsschritte
►
►
Der Platz von Skriptsprachen ist in der schnellen Prototypentwicklung
Pike kann zum Prototyping (RAD) verwendet werden
■
■
►
Einfache 1:1-Übersetzung von UML-Assoziationen und Mehrfachvererbung
Falls nicht schnell genug, bilde man das UML-Modell schrittweise auf Java ab.
Das ist aufwendiger, bringt aber mehr Effizienz und stärkere Typsicherheit.
Es ist sogar möglich, vom untypisierten Analysemodell aus zu beginnen
Analysemodell in UML
Entwurfsmodell in UML
Untypisierter Pike Prototyp
Typisierter Pike Prototyp
Java Produkt
Prof. U. Aßmann, Softwaretechnologie
14
Vergleich von Skriptsprachen: Pike vs Perl vs Python
►
Pike hat einen Übersetzer, der schnellen Code erzeugt. Pike ist die
momentan schnellste Skriptsprache (pike.ida.liu.se)
■
■
►
Python ist voll typisiert, hat aber keine Mehrfachvererbung
■
►
Skalierbare Typisierung
Ideal zur Abbildung von UML-Modellen
Schwierige Transformation von UML-Diagrammen
Perl hat Mehrfachvererbung, ist aber untypisiert
■
■
Gute Musterverarbeitung für Strings
Grosse Bibliothek
Prof. U. Aßmann, Softwaretechnologie
15
Andere Vorteile
►
►
►
►
►
►
Einfache Programmierung von GUI durch guten Anschluss von GTK (Gnu
Widget TookKit), analog zu AWT/Swing
Java kann aus Pike aufgerufen werden
Interaktive Umgebung “hilfe”
Einfache Installation auf Windows und Linux
Gute Unterstützung von XML
Gute Vorbereitung für Web-Programmierung
■
►
Roxen-Webserver in Pike programmiert
Aktive open-source community, die auf Fragen reagiert: probieren Sie es
aus!
Prof. U. Aßmann, Softwaretechnologie
16
End
►
http://pike.ida.liu.se
Prof. U. Aßmann, Softwaretechnologie
17