Einführung in die Programmierung. Bertrand Meyer. Vorlesung 23: Ein Beispiel: Undo-Redo. Das Problem

Ähnliche Dokumente
Einführung in die Programmierung

Einführung in die Programmierung

Ein O-O Design Beispiel. Ein Reservierungs-Panel. Das Übergangs-Diagramm. Programmierung im Grossen Bertrand Meyer Vorlesung 19

Programmierung im Grossen

Einführung in die Programmierung

1. Die rekursive Datenstruktur Liste

Softwaretechnik WS 16/17. Übungsblatt 01

Autotest. Automatische Testgenerierung mit Design by Contract. von Simon Greiner am 12. Juli 2007

Eiffel: Beispiel 1a. FOOP Teil 5 1

Programmierung im Grossen. Vorlesung 15: Konkurrente Objekt- Orientierte Programmierung. Volkan Arslan. Überblick. Bertrand Meyer.

4. Algorithmen und Datenstrukturen I Grundlagen der Programmierung 1 (Java)

Einführung in die Programmierung

Institut für Programmierung und Reaktive Systeme 24. April Programmieren II. 10. Übungsblatt

Einführung in die Programmierung

Datenstrukturen. Ziele

Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 11/12 1. Kapitel 11. Listen. Listen

Arrays. Arrays werden verwendet, wenn viele Variablen benötigt werden. Der Vorteil in Arrays liegt darin, dass man nur eine Variable deklarieren muss

Warum Programme Verträge schließen sollten

Programmierung im Grossen

p^db=`oj===pìééçêíáåñçêã~íáçå=

Nachtrag: Vergleich der Implementierungen von Stack

Datenstrukturen & Algorithmen Lösungen zu Blatt 8 FS 16

Einführung in die Programmierung

Algorithmen und Datenstrukturen

IT I: Heute. abstrakte Methoden und Klassen. Interfaces. Interfaces List, Set und Collection IT I - VO 7 1

Einführung in die Programmierung

Einführung in die Programmierung

Stacks, Queues & Bags. Datenstrukturen. Pushdown/Popup Stack. Ferd van Odenhoven. 19. September 2012

Programmierstil. Objektsammlungen. Konzepte. Zwischenspiel: Einige beliebte Fehler... Variablennamen Kommentare Layout Einrückung

Unified-E Standard WebHttp Adapter

s(x, i) = i h 2 (x), i N 0

Einführung in die Programmierung

Aufgabe11. Methode test1. import java.util.hashmap; import java.util.arraylist; public class Aufgabe11 {

Einführung in die Programmierung

Programmentwicklung ohne BlueJ

Programmieren in Java

3. Übungsblatt zu Algorithmen I im SoSe 2017

Einführung in die Programmierung

Objektorientierung III

Programming 101. Carl Herrmann IPMB & DKFZ

Transaktionen in Praxis. Dr. Karsten Tolle Vorl

Grundlagen der Programmierung in C Klassen

Universität Karlsruhe (TH)

Einführung in die Programmierung. Lektion 14: Mehrfachvererbung

Einführung in die Programmierung

Programmierung WS12/13 Lösung - Präsenzübung M. Brockschmidt, F. Emmes, C. Otto, T. Ströder

FEINDLICHE VERWENDUNG

Zusicherungen A01 OOP. Zusicherungen

Chair of Software Engineering. Bezieher SUBSCRIBERS Ereignis Erzeuger (zb GUI) Chair of Software Engineering. Save_file ROUTINE

Ersetzbarkeit und Verhalten

Einführung in die Programmierung

Algorithmen und Programmierung III

JAVA KURS COLLECTION

Datenstrukturen und Algorithmen. Vorlesung 10

Tutoraufgabe 1 (Implementierung eines ADTs):

OOP. Tagesprogramm. Zusicherungen Zusicherungen und Ersetzbarkeit

Verschlüsseln eines Bildes. Visuelle Kryptographie. Verschlüsseln eines Bildes. Verschlüsseln eines Bildes

Chair of Software Engineering

Informatik II, SS 2014

ALP II Dynamische Datenmengen

Programmieren lernen mit Visual Basic

Programmieren in Java

Interface. So werden Interfaces gemacht

Isolationsstufen für Transaktionen. Dr. Karsten Tolle

Grundlagen der Informatik

Einführung in die Programmierung

Dynamische Datentypen. Destruktor, Copy-Konstruktor, Zuweisungsoperator, Dynamischer Datentyp, Vektoren

Beispielprüfung CuP WS 2015/2016

Informatik I (D-MAVT)

Einführung in die Informatik

Programmier-Befehle - Woche 08

2.2 Spezifikation abstrakter Datentypen. 2.3 Implementierung und Anwendung von ADT. 2.4 Datenabstraktion und Objektorientierung

Informatik II Übung 06. Benjamin Hepp 5 April 2017

Konfiguration von eduroam. Configuring eduroam

IT I: Heute. Klasse Object. equals, hashcode, tostring. HashSet IT I - VO 6 1

Funktionen. Überblick über Stored Functions. Syntax zum Schreiben einer Funktion. Schreiben einer Funktion

IT I: Heute. Klasse Object. equals, hashcode, tostring. HashSet IT I - VO 6 1

Übung PL/SQL Trigger Lösungen

4.2 Daten und Datenstrukturen

1. Download der benötigten Software Version 2. Speichern Sie das easytouch Update auf einem leeren USB-Sick (FAT) (max 2 GB) P3 / Mini.

Objektorientierte Programmierung OO mit Ada 2005

Einführung in die Programmierung

Visuelle Kryptographie. Anwendung von Zufallszahlen

Algorithmen und Datenstrukturen Musterlösung 5

Algorithmen und Programmierung III

Javakurs für Anfänger

Programmier-Befehle - Woche 10

EXCEL VBA Cheat Sheet

Informatik II. Giuseppe Accaputo, Felix Friedrich, Patrick Gruntz, Tobias Klenze, Max Rossmannek, David Sidler, Thilo Weghorn FS 2017

Verkettete Datenstrukturen: Listen

ListElement (E i n f o, ListElement<E> prev, ListElement<E> next ) {

Transkript:

1 Einführung in die Programmierung Bertrand Meyer Letzte Bearbeitung 20. Januar 2004 2 Vorlesung 23: Ein Beispiel: Un-Re Das Problem 3 Den Benutzern eines interaktiven Systems ermöglichen, den Effekt des letzten Befehls aufzuheben. Häufig als Control-Z implementiert Sollte mehrstufiges Un-Re ohne Limitierung ausser einem vom Benutzer gesetzten Maximum unterstützen 1

Ein Texteditor 4 Begriff der aktuellen Zeile. Mögliche Befehle wie: Zeile unter aktueller Position einfügen Zeile über aktueller Position einfügen Aktuelle Zeile löschen Aktuelle Zeile ersetzen Aktuelle Zeile mit nächster vertauschen, falls diese existiert Diese Sicht ist zur Vereinfachung zeilenorientiert, aber die Diskussion gilt auch für komplexere Sichten. Zugrunde liege Klasse (aus business model ) 5 class EDIT_CONTROLLER feature text: LINKED_LIST [STRING] remove is -- Remove line at current position. not off text.remove put_right (line: STRING) is -- Insert line after current position. not after text.put_right (line) Hauptschritt beim Finden einer Software- Architektur 6 Die richtigen Abstraktionen finden (Die involvierten Typen von Objekten.) Hier: Die Idee des command 2

History der Session behalten 7 Die History-Liste: Ältestes Neustes history: LINKED_LIST [COMMAND] Was ist ein command -Objekt? 8 Ein Command-Objekt (Instanz der Klasse COMMAND) enthält genüg Informationen über eine einzelne Ausführung eines Befehls durch den Benutzer, um: den Befehl auszuführen den Befehl aufzuheben, falls später verlangt In einem Delete-Befehl, zum Beispiel (wie von remove implementiert), brauchen wir: Die Position der zu löschen Zeile Den Inhalt dieser Zeile! Eine allgemeine Idee des Command 9 deferred class COMMAND feature execute is -- Carry out one execution of this command. deferred ensure ne: ne un is -- Cancel an earlier execution of this command. already: ne deferred 3

Eine allgemeine Idee des Command 10 deferred class COMMAND feature ne: BOOLEAN is -- Has this command been executed? execute is -- Carry out one execution of this command. un is -- Cancel an earlier execution of this command. deferred ensure ne: ne already: ne deferred Command Klassenhierarchie 11 execute un* COMMAND deferred + effective + DELETION execute + un + line index + INSERTION execute + un + index Eine Command-Klasse (Sketch, keine Contracts) class DELETION inherit COMMAND feature controller: EDIT_CONTROLLER -- Access to business model line: STRING -- The line being deleted index: INTEGER -- Position of line being deleted execute is -- Remove current line and remember it. line := controller.item ; index := controller.index controller.remove ; ne := True un is -- Re-insert previously removed line. controller.go_ith (index) controller.put_left (line) 12 4

Zugrunde liege Klasse (vom business model ) class EDIT_CONTROLLER feature text: LINKED_LIST [STRING] remove is -- Remove line at current position. not off text.remove put_right (line: STRING) is -- Insert line after current position. not after text.put_right (line) Also item, index, go_ith, put_left 13 Einen Befehl ausführen 14 Die History-Liste: Ältestes Neustes history: LINKED_LIST [COMMAND] Einen Befehl ausführen 15 decode_user_request if Request is normal command then -- Create command object c corresponding to user request history.ext (c) c.execute elseif Request is UNDO then if not history.before then history.item.un history.back -- We ignore excessive requests elseif Request is REDO then if not history.is_last then history.forth history. item.un -- We ignore excessive requests 5

Bedingte Kreation (1) 16 B A C a1: A if condition_1 then -- Create a1 as an instance of B elseif condition_2 then -- Create a1 as an instance of C etc D a1: A; b1: B; c1: C; d1: D; if condition_1 then create b1.make () a1 := b1 elseif condition_2 then create c1.make () a1 := c1 etc Bedingte Kreation (2) 17 B A C a1: A if condition_1 then -- Create a1 as an instance of B elseif condition_2 then -- Create a1 as an instance of C etc D a1: A if condition_1 then create {B} a1.make () elseif condition_2 then create {C} a1.make () etc Einen Befehl ausführen 18 decode_user_request if Request is normal command then -- Create command object c corresponding to user request history.ext (c) c.execute elseif Request is UNDO then if not history.before then history.item.un history.back -- Ignore excessive requests elseif Request is REDO then if not history.is_last then history.forth history. item.un -- Ignore excessive requests 6

Command-Objekte kreieren (1) 19 c: COMMAND decode_user_request if Request is delete then create {DELETION} c elseif Request is insert then create {INSERTION} c etc Command-Klassenhierarchie 20 execute un* COMMAND deferred + effective + DELETION execute + un + line index + INSERTION execute + un + index Command-Objekte kreieren (2) 21 Jedem Command-Typ eine Nummer (oder sonstigen Schlüssel) geben Eine Tabelle (z.b. ein Array) anfangs mit einer Instanz jeden Command-Typs füllen. Für ein neues Command-Object: Insertion Deletion command_type bestimmen c := clone (COMMAND_TABLE.item (command_type)) 7

Das Un-Re-Pattern 22 Wird häufig benutzt (z.b. in Eiffel-Tools) Ziemlich einfach zu implementieren Elegante Verwung von O-O-Techniken Nachteil: Explosion von kleinen Klassen In Java kann man innere Klassen benutzen. Benutzung von agents 23 Zwei Routinen für jede Befehl: Die Routine um ihn auszuführen Die Routine um ihn aufzuheben! Die History-Liste im Un-Re-Pattern 24 history: LINKED_LIST [COMMAND] Ältestes Neustes 8

Die History-Liste mit agents Die History-Liste wird einfach eine Liste von agent-paaren: history: LINKED_LIST [TUPLE [PROCEDURE [ANY, TUPLE], PROCEDURE [ANY, TUPLE]] 25 De-Insert De-Insert Re-insert De-Insert Prinzip bleibt das gleiche, aber keine Command-Objekte mehr nötig; wir speichern einfach agents. Diese Technik wird in allen aktuellen Eiffel-Tools verwet. Einen Befehl ausführen (vorher) 26 decode_user_request if Request is normal command then -- Create command object c corresponding to user request history.ext (c) c.execute elseif Request is UNDO then if not history.before then history.item.un history.back -- Ignore excessive requests elseif Request is REDO then if not history.is_last then history.forth history. item.un -- Ignore excessive requests Einen Befehl ausführen (jetzt) 27 Decode user_request giving two agents _it and un_it if Request is normal command then history.ext ([_it, un_it]) _it.call ([]) elseif Request is UNDO then if not history.before then history.item.item (2).call ([]) history.back De- De- Reinsert Insert Insert elseif Request is REDO then if not history.is_last then history.forth history.item.item (1).call ([]) Insert Insert Remove 9

28 Ende Vorlesung 23 10