Components and Aspect-Oriented Design/Programming

Slides:



Advertisements
Ähnliche Präsentationen
Don`t make me think! A Common Sense Approach to Web Usability
Advertisements

Institut AIFB, Universität Karlsruhe (TH) Forschungsuniversität gegründet 1825 Towards Automatic Composition of Processes based on Semantic.
| DC-IAP/SVC3 | © Bosch Rexroth Pneumatics GmbH This document, as well as the data, specifications and other information set forth in.
You need to use your mouse to see this presentation © Heidi Behrens.
You need to use your mouse to see this presentation © Heidi Behrens.
Design Patterns Ein Muster (pattern) ist eine Idee, die sich in einem praktischen Kontext als nützlich erwiesen hat und dies auch in anderen sein wird.
Universität StuttgartInstitut für Wasserbau, Lehrstuhl für Hydrologie und Geohydrologie Copulas (1) András Bárdossy IWS Universität Stuttgart.
Technische Universität München 1 CADUI' June FUNDP Namur G B I The FUSE-System: an Integrated User Interface Design Environment Frank Lonczewski.
Der formelle Imperativ – the Imperative
Coordinating Conjunctions Why we need them & how to use them deutschdrang.com.
Konjunktionen & Indirekte Fragen {Conjunctions}
Institut für Angewandte Mikroelektronik und Datentechnik Phase 5 Architectural impact on ASIC and FPGA Nils Büscher Selected Topics in VLSI Design (Module.
Mein Arbeitspraktikum. Today we are learning to talk about work experience we have done, giving facts, details and opinions The bigger picture: We are.
Die Fragen Wörter Wer? Was? Wann?.
Weak pushover verbs..... lieben kaufen spielen suchen....are verbs that do exactly as they are told. They stick to a regular pattern that does not change!
Synchronization: Multiversion Concurrency Control
SiPass standalone.
Stephanie Müller, Rechtswissenschaftliches Institut, Universität Zürich, Rämistrasse 74/17, 8001 Zürich, Criminal liability.
Literary Machines, zusammengestellt für ::COLLABOR:: von H. Mittendorfer Literary MACHINES 1980 bis 1987, by Theodor Holm NELSON ISBN
Welcome to Web Services & Grid Computing Jens Mache
Einführung in die Informatik 1. Computational Thinking Institut für Informatik und angewandte Mathematik.
What is a “CASE”? in English: pronouns, certain interrogatives
Physik multimedial Lehr- und Lernmodule für das Studium der Physik als Nebenfach Julika Mimkes: Links to e-learning content for.
What is a “CASE”? in English: pronouns, certain interrogatives
type / function / form type of words:
GERMAN WORD ORDER ORDER s. Sentences are made up by placing a variety of words in a specific order. If the order is wrong, the sentence is difficult to.
The Journey to America… The Immigrant Experience.
1 Konica Minolta IT Solutions Prinzip Partnerschaft MANAGED MONITORING ÜBERWACHJUNG DER SERVERINFRASTRUKTUR UND ANWENDUNGEN DIREKT AUS DER CLOUD.
Unterwegs.
Gregor Graf Oracle Portal (Part of the Oracle Application Server 9i) Gregor Graf (2001,2002)
© Crown copyright 2011, Department for Education These materials have been designed to be reproduced for internal circulation, research and teaching or.
EUROPÄISCHE GEMEINSCHAFT Europäischer Sozialfonds EUROPÄISCHE GEMEINSCHAFT Europäischer Fonds für Regionale Entwicklung Workpackage 5 – guidelines Tasks.
Berliner Elektronenspeicherring-Gesellschaft für Synchrotronstrahlung m.b.H., Albert-Einstein-Straße 15, Berlin frontend control at BESSY R. Fleischhauer.
1 Persistence Strategies for WebServices Senior Consultant Java Forum Stuttgart, 27. Juni 2002.
Imperfekt (Simple Past) Irregular or strong verbs
Kapitel 2 Grammar INDEX 1.Subjects & Verbs 2.Conjugation of Verbs 3.Subject Verb Agreement 4.Person and Number 5.Present Tense 6.Word Order: Position of.
Memorisation techniques
Kapitel 8 Grammar INDEX 1.Command Forms: The Du-Command Form & Ihr- Command 2.Sentences & Clauses.
Here‘s what we‘ll do... Talk to the person sitting in front of you. Introduce each other, and ask each other questions concerning the information on your.
EUROPÄISCHE GEMEINSCHAFT Europäischer Sozialfonds EUROPÄISCHE GEMEINSCHAFT Europäischer Fonds für Regionale Entwicklung Workpackage 5 – guidelines Tasks.
Der die das ein eine ein Wie sagt man “the” auf Deutsch? Wie sagt man “a” auf Deutsch?
© 2012 IBM Corporation © 2013 IBM Corporation IBM Storage Germany Community Josef Weingand Infos / Find me on:
Essay structure Example: Die fetten Jahre sind vorbei: Was passiert auf der Almhütte? Welche Bedeutung hat sie für jede der vier Personen? Intro: One or.
Interrogatives and Verbs
Sentence Structure Questions
Apache Camel Christian Schneider
Premiere Conferencing GmbH
Sentence Structure Connectives
The Dative Indirect Objects.
Aspect-Oriented Programming: Fad or the Future
Process and Impact of Re-Inspection in NRW
Synonyms are two or more words belonging to the same part of speech and possessing one or more identical or nearly identical denotational meanings, interchangeable.
Das Taschentuch-Spiel
IETF 80 Prague DISPATCH WG
Senseo Wir erweitern die statischen Informationen mit Hilfe von Laufzeitinformationen. Einbindung in IDE resp. JDT.
Metadata - Catalogues and Digitised works
Talking about prices Pointing things out
Components and Aspect-Oriented Design/Programming
THE PERFECT TENSE IN GERMAN
Review CSU 670 Fall 2003.
Components and Aspect-Oriented Design/Programming
ELECTR IC CARS Karim Aly University of Applied Sciences.
type / function / form type of words:
Official Statistics Web Cartography in Germany − Regional Statistics, Federal and European Elections, Future Activities − Joint Working Party meeting.
OFFICE 365 FOCUS SESSION SHAREPOINT ONLINE 101:LERNE DIE BASICS 19. März 2018 Höhr-Grenzhausen.
Integrating Knowledge Discovery into Knowledge Management
School supplies.
- moodle – a internet based learning platform
Zhunussova G., AA 81. Linguistic communication, i.e. the use of language, is characteristically vocal and verbal behaviour, involving the use of discrete.
 Präsentation transkript:

Components and Aspect-Oriented Design/Programming Mira Mezini, David Lorenz and Karl Lieberherr 11/15/2018 Mezini/Lorenz/Lieberherr

Mezini/Lorenz/Lieberherr Overview Our abstract component definition Problems with structuring software - function versus object structuring Reconciliation of both worlds: Aspectual components as the component construct Aspectual components for generic higher-level collaborative behavior Aspectual components and Aspect-Oriented Programming (AOP) Summary 11/15/2018 Mezini/Lorenz/Lieberherr

Mezini/Lorenz/Lieberherr What is a component? any identifiable slice of functionality that describes a meaningful service, involving, in general, several concepts, with well-defined expected and provided interfaces, formulated for an ideal ontology - the expected interface subject to deployment into several concrete ontologies by 3rd parties subject to composition by 3rd parties subject to refinement by 3rd parties An ontology is, in simple terms, a collection of concepts with relations among them plus constraints on the relations. 11/15/2018 Mezini/Lorenz/Lieberherr

Component deployment/composition Deployment is mapping idealized ontology to concrete ontology specified by connectors separately from components without mentioning irrelevant details of concrete ontology in map to keep deployment flexible non-intrusive, parallel, and dynamic deployment Composition is mapping the provided interface of one (lower-level) component to the expected interface of another (higher-level) component deployment is a special case of composition, where the lower level component is a concrete ontology (no expected interface) 11/15/2018 Mezini/Lorenz/Lieberherr

Mezini/Lorenz/Lieberherr The goal The goal is to separate concerns (each decision in a single place) and minimize dependencies between them (loose coupling): less tangled code, more natural code, smaller code concerns easier to reason about, debug and change a large class of modifications in the definition of one concern has a minimum impact on the others more reusable, can plug/unplug as needed 11/15/2018 Mezini/Lorenz/Lieberherr

Problems with Software Structuring Data (Shapes) + Functions (Colors) 1st Generation Spaghetti-Code 4th Generation object decomposition in den vorherigen Kapiteln wurde erklärt: 1. in der Informatik darum, Rechnermodelle zu bauen, die Prozessen in der reellen Welt simulieren. 2. Es gibt formale Mitteln, die es erlauben, die Modelle in eine für den Rechner verständlich en Sprache zu schreiben.t. In dieser Vorlesung erden wir das sogenannte objekt-orientierte Programmiermodel als das Mittel für die Beschreibung der Modelle benutzen. Mit anderen Worten, werden wir objekt-orientierte Rechnermodelle der reellen Welt bauen. Wir werden zuerst, die Konstrukte des objekt-orientierten Programmiermodels kennenlernen, d.h. die Bestandteile unsere Toolboxes. Als zweites werden wir kurz 2nd & 3rd Generation : functional decomposition

Problems with Functional Decomposition Advantage: easy integration of new functions Disadvantage: Data spread around integration of new data types ==> modification of several functions functions tangled due to use of shared data Difficult to localize changes ! in den vorherigen Kapiteln wurde erklärt: 1. in der Informatik darum, Rechnermodelle zu bauen, die Prozessen in der reellen Welt simulieren. 2. Es gibt formale Mitteln, die es erlauben, die Modelle in eine für den Rechner verständlich en Sprache zu schreiben.t. In dieser Vorlesung erden wir das sogenannte objekt-orientierte Programmiermodel als das Mittel für die Beschreibung der Modelle benutzen. Mit anderen Worten, werden wir objekt-orientierte Rechnermodelle der reellen Welt bauen. Wir werden zuerst, die Konstrukte des objekt-orientierten Programmiermodels kennenlernen, d.h. die Bestandteile unsere Toolboxes. Als zweites werden wir kurz

Problems with Object Decomposition Advantage: easy integration of new data Disadvantage: functions spread around integration of new functions ==> modifikation of several objects objects tangled due to higher-level functions involving several classes Difficult to localize changes ! in den vorherigen Kapiteln wurde erklärt: 1. in der Informatik darum, Rechnermodelle zu bauen, die Prozessen in der reellen Welt simulieren. 2. Es gibt formale Mitteln, die es erlauben, die Modelle in eine für den Rechner verständlich en Sprache zu schreiben.t. In dieser Vorlesung erden wir das sogenannte objekt-orientierte Programmiermodel als das Mittel für die Beschreibung der Modelle benutzen. Mit anderen Worten, werden wir objekt-orientierte Rechnermodelle der reellen Welt bauen. Wir werden zuerst, die Konstrukte des objekt-orientierten Programmiermodels kennenlernen, d.h. die Bestandteile unsere Toolboxes. Als zweites werden wir kurz

Problems with Object Decomposition high-level behavior scattered around the implementation of several classes OOAD Z Collab-1 C1 C4 C2 C3 C5 Collab-4 Collab-2 Collab-3 C1 Object-oriented languages do not provide adequate constructs to capture collaborations between several classes. Has been recognized in different forms in the object-oriented community: OO accommodates the addition of new variants of data types better than procedural programming but, the opposite is true when new operations on existing data types are needed visitor pattern: the matter of concern -- definition of new operations on an existing object structure (aggregation is involved besides inheritance) several works complain the lack of constructs for expressing collaboration-based designs C4 C2 C3 C5 Implementation Collaboration -- a distinct (relatively independent aspect of an application that involves several participants, or roles roles played by application classes each class may play different roles in different collaborations each role embodies a separate aspect of the overall class behavior Collaboration-based design s Require to view oo applications in two different ways: (a) in terms of participants or types involved (b) in terms of the tasks or concerns of the design

Problems with Object Decomposition in den vorherigen Kapiteln wurde erklärt: 1. in der Informatik darum, Rechnermodelle zu bauen, die Prozessen in der reellen Welt simulieren. 2. Es gibt formale Mitteln, die es erlauben, die Modelle in eine für den Rechner verständlich en Sprache zu schreiben.t. In dieser Vorlesung erden wir das sogenannte objekt-orientierte Programmiermodel als das Mittel für die Beschreibung der Modelle benutzen. Mit anderen Worten, werden wir objekt-orientierte Rechnermodelle der reellen Welt bauen. Wir werden zuerst, die Konstrukte des objekt-orientierten Programmiermodels kennenlernen, d.h. die Bestandteile unsere Toolboxes. Als zweites werden wir kurz During implementation separate higher-level functions are mixed together During maintenance/evolution individual collaborations need to be factored out of the tangled code

So what? NO ! So, let’s organize!! Let’s have component “Forget about objects” [Udell, BYTE, May 94] NO ! So, let’s organize!! Let’s have component constructs that capture functions cross cutting class boundaries !! Let’s have Aspectual Components to reconcile functions and objects The point is merely that objects are too low-level. If we don’t follow certain principles, we easily end up with “hyper spaghetti’’ objects Collaborations are not explicit in the software. This is what ACs will support. So why?

Reconciling objects and functions: the intuition behind aspectual components modification in den vorherigen Kapiteln wurde erklärt: 1. in der Informatik darum, Rechnermodelle zu bauen, die Prozessen in der reellen Welt simulieren. 2. Es gibt formale Mitteln, die es erlauben, die Modelle in eine für den Rechner verständlich en Sprache zu schreiben.t. In dieser Vorlesung erden wir das sogenannte objekt-orientierte Programmiermodel als das Mittel für die Beschreibung der Modelle benutzen. Mit anderen Worten, werden wir objekt-orientierte Rechnermodelle der reellen Welt bauen. Wir werden zuerst, die Konstrukte des objekt-orientierten Programmiermodels kennenlernen, d.h. die Bestandteile unsere Toolboxes. Als zweites werden wir kurz result expected provided connectors Concrete application

Mezini/Lorenz/Lieberherr Aspectual component Why not just “component”? “Aspectual” is not an English word. We want to distinguish between components that enhance and cross-cut other components and components that only provide new behavior. 11/15/2018 Mezini/Lorenz/Lieberherr

components in den vorherigen Kapiteln wurde erklärt: 1. in der Informatik darum, Rechnermodelle zu bauen, die Prozessen in der reellen Welt simulieren. 2. Es gibt formale Mitteln, die es erlauben, die Modelle in eine für den Rechner verständlich en Sprache zu schreiben.t. In dieser Vorlesung erden wir das sogenannte objekt-orientierte Programmiermodel als das Mittel für die Beschreibung der Modelle benutzen. Mit anderen Worten, werden wir objekt-orientierte Rechnermodelle der reellen Welt bauen. Wir werden zuerst, die Konstrukte des objekt-orientierten Programmiermodels kennenlernen, d.h. die Bestandteile unsere Toolboxes. Als zweites werden wir kurz components

definition result deployment in den vorherigen Kapiteln wurde erklärt: 1. in der Informatik darum, Rechnermodelle zu bauen, die Prozessen in der reellen Welt simulieren. 2. Es gibt formale Mitteln, die es erlauben, die Modelle in eine für den Rechner verständlich en Sprache zu schreiben.t. In dieser Vorlesung erden wir das sogenannte objekt-orientierte Programmiermodel als das Mittel für die Beschreibung der Modelle benutzen. Mit anderen Worten, werden wir objekt-orientierte Rechnermodelle der reellen Welt bauen. Wir werden zuerst, die Konstrukte des objekt-orientierten Programmiermodels kennenlernen, d.h. die Bestandteile unsere Toolboxes. Als zweites werden wir kurz

definition deployment result in den vorherigen Kapiteln wurde erklärt: 1. in der Informatik darum, Rechnermodelle zu bauen, die Prozessen in der reellen Welt simulieren. 2. Es gibt formale Mitteln, die es erlauben, die Modelle in eine für den Rechner verständlich en Sprache zu schreiben.t. In dieser Vorlesung erden wir das sogenannte objekt-orientierte Programmiermodel als das Mittel für die Beschreibung der Modelle benutzen. Mit anderen Worten, werden wir objekt-orientierte Rechnermodelle der reellen Welt bauen. Wir werden zuerst, die Konstrukte des objekt-orientierten Programmiermodels kennenlernen, d.h. die Bestandteile unsere Toolboxes. Als zweites werden wir kurz

CounterImpl DataWithCounter StackImpl QueueImpl LockImpl DataWithLock in den vorherigen Kapiteln wurde erklärt: 1. in der Informatik darum, Rechnermodelle zu bauen, die Prozessen in der reellen Welt simulieren. 2. Es gibt formale Mitteln, die es erlauben, die Modelle in eine für den Rechner verständlich en Sprache zu schreiben.t. In dieser Vorlesung erden wir das sogenannte objekt-orientierte Programmiermodel als das Mittel für die Beschreibung der Modelle benutzen. Mit anderen Worten, werden wir objekt-orientierte Rechnermodelle der reellen Welt bauen. Wir werden zuerst, die Konstrukte des objekt-orientierten Programmiermodels kennenlernen, d.h. die Bestandteile unsere Toolboxes. Als zweites werden wir kurz QueueImpl LockImpl DataWithLock

ShowReadWriteAccesses Weaved Code AutoReset Shapes ShowReadWriteAccesses Point in den vorherigen Kapiteln wurde erklärt: 1. in der Informatik darum, Rechnermodelle zu bauen, die Prozessen in der reellen Welt simulieren. 2. Es gibt formale Mitteln, die es erlauben, die Modelle in eine für den Rechner verständlich en Sprache zu schreiben.t. In dieser Vorlesung erden wir das sogenannte objekt-orientierte Programmiermodel als das Mittel für die Beschreibung der Modelle benutzen. Mit anderen Worten, werden wir objekt-orientierte Rechnermodelle der reellen Welt bauen. Wir werden zuerst, die Konstrukte des objekt-orientierten Programmiermodels kennenlernen, d.h. die Bestandteile unsere Toolboxes. Als zweites werden wir kurz Line NewInstanceLogging Rectangle

DataWithCounter&Lock DataWithLock DataWithCounter&Lock in den vorherigen Kapiteln wurde erklärt: 1. in der Informatik darum, Rechnermodelle zu bauen, die Prozessen in der reellen Welt simulieren. 2. Es gibt formale Mitteln, die es erlauben, die Modelle in eine für den Rechner verständlich en Sprache zu schreiben.t. In dieser Vorlesung erden wir das sogenannte objekt-orientierte Programmiermodel als das Mittel für die Beschreibung der Modelle benutzen. Mit anderen Worten, werden wir objekt-orientierte Rechnermodelle der reellen Welt bauen. Wir werden zuerst, die Konstrukte des objekt-orientierten Programmiermodels kennenlernen, d.h. die Bestandteile unsere Toolboxes. Als zweites werden wir kurz

Mezini/Lorenz/Lieberherr What is an aspect? A slice of high-level, system/application level functionality. Slice: not self-contained. High-level: three meanings multi-party functionality involving several participants one participant may be mapped to a set of otherwise not structurally related classes two neighboring participants may be mapped to classes that are “far apart” (many intermediate classes) Aspect cross-cuts object structure. 11/15/2018 Mezini/Lorenz/Lieberherr

Mezini/Lorenz/Lieberherr Examples Publisher-subscriber protocol: it applies in general to multiple sets of classes in different places in a system's object structure. Logging execution behavior Synchronization 11/15/2018 Mezini/Lorenz/Lieberherr

Need a construct to express aspects Otherwise have tangled code. Would have to spread fragments of aspect definition manually. Resulting in tangled code. Need to control tangling (cannot eliminate it) Solution: aspectual components 11/15/2018 Mezini/Lorenz/Lieberherr

Cross-cutting of aspects better program ordinary program Basic classes: structure Aspect 1 Slice of functionality Aspect 2 avoid tangled programs AOP Slice of functionality Aspect 3 11/15/2018 Mezini/Lorenz/Lieberherr

Informal aspect description: ShowReadAccess ``For any data type in an application, say DataToAccess, any read access operation, AnyType readOp() defined for DataToAccess, and any invocation of this operation on an instance of DataToAccess, dataInstance, display Read access on <string representation of dataInstance>}´´. 11/15/2018 Mezini/Lorenz/Lieberherr

Example of an aspectual component for ShowReadAccess component ShowReadAccess { participant DataToAccess { expect Object readOp(); replace Object readOp() { System.out.println("Read access on " + this.toString()); return expected(); // this calls the // expected version of readOp() } 11/15/2018 Mezini/Lorenz/Lieberherr

Concrete class graph: in Java class Point { private int x = 0; private int y = 0; void set(int x,int y) {this.x = x;this.y = y;} void setX(int x) { this.x = x; } void setY(int y) { this.y = y; } int getX(){ return this.x; } int getY(){ return this.y; } } class Line { ... } class Rectangle {... } 11/15/2018 Mezini/Lorenz/Lieberherr

Mezini/Lorenz/Lieberherr Deployment connector ShowReadAccessConn1 { Point is ShowReadAccess.DataToAccess with {readOp = get*}; } connector ShowReadAccessConn3 { {Point, Line, Rectangle} is ShowReadAccess.DataToAccess with {readOp = get*; } 11/15/2018 Mezini/Lorenz/Lieberherr

Inheritance between components component ShowReadWriteAccess extends ShowReadAccess { participant DataToAccess { expect void writeOp(Object[] args); replace void writeOp(Object[] args){ System.out.println( "Write access on " + this.toString()); expected(args);}} } 11/15/2018 Mezini/Lorenz/Lieberherr

Inheritance between connectors connector ShowReadWriteAccessConn2 extends ShowReadAccessConn3 { {Point,Line,Rectangle} is DataToAccess with { writeOp = set*; } 11/15/2018 Mezini/Lorenz/Lieberherr

Components have flavor of classes Common Have local data and function members One component can inherit from another component Different component/connector separation. Component adaptation code is not part of application. 11/15/2018 Mezini/Lorenz/Lieberherr

What are aspectual components? Aspectual components are language constructs that capture behaviour involving several classes (cross-cuts class boundaries) the programmer uses classes to implement the primary data (object) structure the programmer uses aspectual components to implement higher-level behavior cross-cutting the primary structure in a modular way 11/15/2018 Mezini/Lorenz/Lieberherr

What are aspectual components? Aspectual components have provided and expected interfaces The expected interface consists of an ideal class graph (Participant Graph, PG) to enable defining one aspect of the system with limited knowledge about the object model and/or other aspects defined by other components Aspectual components can be deployed into PGs or concrete class graphs and/or composed/refined by 3rd parties (reuse) by mapping interfaces via explicit connectors 11/15/2018 Mezini/Lorenz/Lieberherr

Aspectual Components (AC) minimal assumptions on application structure Participant Graph P1 P3 P2 + expected interfaces Behavior Definition P P1 meth 1,1 add new functionality + enhance the expected provided = everything declared public ... written to the PG similar to an OO program is written to a concrete class graph meth 1,k P3 meth 3,1 ... meth 3,j

Aspectual Component Def. A set of participants forming a graph called the participant graph (represented, e.g., by a UML class diagram). Participant formal argument to be mapped expects function members (keyword expect) reimplementations (keyword replace) local data and function members 11/15/2018 Mezini/Lorenz/Lieberherr

Aspectual Component Def. (continued) Local classes: visibility: aspectual component Aspectual component-level data and function members. There is a single copy of each global data member for each deployment 11/15/2018 Mezini/Lorenz/Lieberherr

Deployment/Composition of ACs Specified by connectors separately from aspectual components Connectors use regular-expressions to express sets of method names and class names and interface names standard code everywhere simple method name mapping is not enough graphs and regular expression-like constructs for mapping graphs 11/15/2018 Mezini/Lorenz/Lieberherr

Deploying/Composing ACs participant-to-class name map Application Participant Graph P1 P3 expected/provided interface map P2 link-to-paths map Behavior Definition P1 m 1,1 ... m 1,k AC Compiler (CG-to-PG compatability?) P1 executable Java code

Reconciling objects and functions: the intuition behind aspectual components modification in den vorherigen Kapiteln wurde erklärt: 1. in der Informatik darum, Rechnermodelle zu bauen, die Prozessen in der reellen Welt simulieren. 2. Es gibt formale Mitteln, die es erlauben, die Modelle in eine für den Rechner verständlich en Sprache zu schreiben.t. In dieser Vorlesung erden wir das sogenannte objekt-orientierte Programmiermodel als das Mittel für die Beschreibung der Modelle benutzen. Mit anderen Worten, werden wir objekt-orientierte Rechnermodelle der reellen Welt bauen. Wir werden zuerst, die Konstrukte des objekt-orientierten Programmiermodels kennenlernen, d.h. die Bestandteile unsere Toolboxes. Als zweites werden wir kurz result expected required connectors Concrete application

Ideal Class Graph Where Have We Seen That Before ? Quote: Avoid traversing multiple links or methods. A method should have limited knowledge of an object model. A method must be able to traverse links to obtain its neighbors and must be able to call operations on them, but it should not traverse a second link from the neighbor to a third class. Rumbaugh and the Law of Demeter (LoD) 11/15/2018 Mezini/Lorenz/Lieberherr

Adaptive Following LoD C A FRIENDS a S X c b are not accidentally friends other classes exist for other reasons ideal class graph: all are friends, even “far” away classes. B a:From S to A b:From S to B c:From S via X to C 11/15/2018 Mezini/Lorenz/Lieberherr

consider the pricing component ... Deploying/Composing ACs an example ... an application generator from IBM (‘70) Hardgoods Distributors Management Accounting System encode a generic design for order entry systems which could be subsequently customized to produce an application meeting a customer’s specific needs OK, we want a construct (1) orthogonal to the standard object-oriented models - not substitute, rather complement classes (2) support a decomposition granularity that lies between classes and package modules a la Oberon But, what do we mean by adaptive? consider the pricing component ...

pricing component: class diagram Deploying ACs PricerParty pricer LineItemParty float basicPrice(ItemParty item) int discount(ItemParty item, Integer qty, Customer cust) int quantity (); item cust ItemParty CustomerParty charges ChargerParty float cost(Integer qty, Float unitPrice, ItemParty item) pricing component: class diagram

pricing component: collaboration diagram Deploying ACs unitPrice( ... ) { basicPr = basicPrice(item); discount = discount(item, qty, cust); unitPr = basicPr - (discount * basicPr); return unitPr; } price() { int qty = quantity(); quotePr = pricer.unitPrice(item, qty, cust); quotePr += item.additionalCharges(unitPr, qty); return quotePr;} design applies to several applications with different classes playing the roles of different participants !!! price() 1: unitPrice (item, qty, cust) lineItem: LineItemParty pricer: PricerParty 2: additionalCharges(unitPr, qty) item: ItemParty additionalCharges(…){ int total; forall ch in charges { total += ch.cost(…);} return total;} design is fairly simple complexity is a problem with this application generator’s component, though: the pricing component is described in nearly twenty pages of the installation guide the complexity results from numerous, and arbitrary, pricing schemes in use by industry and by the representation of these schemes in the system 2.1: ch=next() 2.2: cost(qty,unitPr,item) ChargerParty ChargerParty ch: ChargerParty pricing component: collaboration diagram

one slice of behavior reused with several applications One AC deployed into several applications Application participant-to-class name map Participant Graph P1 P2 P3 expected interface map Behavior Definition P1 participant-to-class name map m 1,1 ... m 1,k expected interface map Application one slice of behavior reused with several applications 11/15/2018 Mezini/Lorenz/Lieberherr

Deploying/Composing/Refining ACs one slice of high-level behavior reused with several applications one slice of behavior multiply reused in different places of a single application behavior defined in terms of lower-level behavior; high-level behavior definition reused with different lower-level behavior implementations define new behavior by refining existing behavior one slice of high-level behavior reused with several applications one slice of behavior multiply reused in different places of a single application higher-level behavior defined in terms of lower-level behavior; high-level behavior definition reused with different implementations of the lower-level behavior define new behavior by refining existing behavior OK, we want a construct (1) orthogonal to the standard object-oriented models - not substitute, rather complement classes (2) support a decomposition granularity that lies between classes and package modules a la Oberon But, what do we mean by adaptive?

Multiply deploying an AC into an application one slice of behavior multiply deployed into different places of a single application may need to represent several pricing schemes: regular pricing: discounts depending on the number of ordered units, negotiated pricing: customers may have negotiated prices for items, sale pricing: each product has a designated sale price and no discounting allowed Design is the same for all schemes !!! Given a concrete application, each scheme might require the application class model to conform to the design in a specific way

Multiply deploying an AC into application HWProduct Quote customer Customer Tax prod taxes LineItemParty PricerParty ItemParty ChargerParty pricing component regular pricing application HWProduct Quote customer Customer Tax prod taxes LineItemParty PricerParty ItemParty ChargerParty pricing component negotiated pricing float regPrice() float regDiscount(int) float salePrice() float saleDiscount() Application customer prod Quote int quantity int quantity() HWProduct prod() Customer customer() Customer String name float negProdPrice(HWProduct) float negProdDiscount(HWProduct, int) taxes HWProduct float price float salePrice Table discount Tax float percentage float taxCharge(float) 1..N one slice of behavior multiply reused in different places of a single application

Multiply deploying an AC into an application Map 1 connector HWApplWithRegPricing { // connects HWApp, Pricing; Quote is LineItemParty { with{regularPrice = price } }; HWProduct is PricerParty { with { float basicPrice() {return regPrice();} float discount() {return regDiscount();} HWProduct is ItemParty; Tax is ChargerParty;} Application prod Quote HWProduct cust taxes Tax Customer Tax Tax Tax Pricing AC AC compiler (CG-to-PG compatability?)

Multiply deploying an AC into an application Map 2 connector HWApplWithNegPricing { connec ts HWApp, Pricing; Quote implements LineItemParty { provided {negotiatedPrice = price } } Customer implements PricerParty { expected { float basicPrice() {return negProdPrice();} float discount() {return negProdDiscount();} } } HWProduct implements ItemParty; Tax implements ChargerParty;} Application prod Quote HWProduct cust taxes Tax Customer Tax Tax Tax Pricing AC AC compiler (CG-to-PG compatability?)

Deploying/Composing/Refining ACs one slice of high-level behavior reused with several applications one slice of behavior multiply reused in different places of a single application behavior defined in terms of lower-level behavior; high-level behavior definition reused with different lower-level behavior implementations define new behavior by refining existing behavior one slice of high-level behavior reused with several applications one slice of behavior multiply reused in different places of a single application higher-level behavior defined in terms of lower-level behavior; high-level behavior definition reused with different implementations of the lower-level behavior define new behavior by refining existing behavior OK, we want a construct (1) orthogonal to the standard object-oriented models - not substitute, rather complement classes (2) support a decomposition granularity that lies between classes and package modules a la Oberon But, what do we mean by adaptive?

Composing ACs total() 2: price() may be any of the pricing schemes define higher-level behavior in terms of lower-level behavior may be any of the pricing schemes write Total once and reuse with all pricing schemes LineItemParty float price() float price() OrderParty :OrderParty :LineItemParty lineItem :LineItemParty 1:lineItem = next() 2: price() total() OK, we want a construct (1) orthogonal to the standard object-oriented models - not substitute, rather complement classes (2) support a decomposition granularity that lies between classes and package modules a la Oberon But, what do we mean by adaptive?

Composing ACs expected interface of one AC mapped to provided interface of other AC component Total { Participant-Graph: participant Container { expect Item[] items) participant Item { float price(); } Behavior-Definition: Container { public float total() { ... while items.hasElements()) { total += items.nextElement.price(); } return total; } } connector applWithTotal{ connects HWAppl, Total; Order implements Container ; LineItemParty implements Quote expected { price() { return regularPrice(); }; } connector ApplWithPricing { { . . . regularPrice() } Pricing AC

Software Structure with ACs P1 P2 P3 P1 P4 P3 P5 Collaborations are not explicit in the software. This is what ACs will support. So why? P2 P2 P6 P1 11/15/2018 Mezini/Lorenz/Lieberherr

Deploying/Composing/Refining ACs one slice of high-level behavior reused with several applications one slice of behavior multiply reused in different places of a single application behavior defined in terms of lower-level behavior; high-level behavior definition reused with different lower-level behavior implementations define new behavior by refining existing behavior one slice of high-level behavior reused with several applications one slice of behavior multiply reused in different places of a single application higher-level behavior defined in terms of lower-level behavior; high-level behavior definition reused with different implementations of the lower-level behavior define new behavior by refining existing behavior OK, we want a construct (1) orthogonal to the standard object-oriented models - not substitute, rather complement classes (2) support a decomposition granularity that lies between classes and package modules a la Oberon But, what do we mean by adaptive?

pricing component: collaboration diagram Refining ACs define new behavior by refining existing behavior pricing component: collaboration diagram lineItem: LineItemParty pricer: PricerParty item: ItemParty price() 1: unitPrice (item, qty, cust) 2: additionalCharges(unitPr, qty) ch: ChargerParty ChargerParty 2.1: ch=next() 2.2: cost(qty,unitPr,item) additionalCharges(…){ Integer total; forall ch in charges{ total += ch.cost(…)} return total} price() { int qty = quantity(); quotePr = pricer.unitPrice(item, qty, cust); quotePr += item.additionalCharges(unitPr, qty); return quotePr;} unitPrice(... ) { basicPr = basicPrice(item); discount = discount(item, qty, cust); unitPr = basicPr - (discount * basicPr); return unitPr; } price() { int qty = quantity(); quotePr = pricer.unitPrice(item, qty, cust); quotePr += item.additionalCharges(unitPr, qty); quotePr = quotePr - cust.frequentRed(); return quotePr; } frequentRed() { . . . } 3 frequentRed() frequent cust: CustomerParty design is fairly simple complexity is a problem with this application generator’s component, though: the pricing component is described in nearly twenty pages of the installation guide the complexity results from numerous, and arbitrary, pricing schemes in use by industry and by the representation of these schemes in the system

Aging&FrequentCustomer Refining ACs define new behavior by combining existing behavior Pricing FrequentPricing AgingPricing design is fairly simple complexity is a problem with this application generator’s component, though: the pricing component is described in nearly twenty pages of the installation guide the complexity results from numerous, and arbitrary, pricing schemes in use by industry and by the representation of these schemes in the system want to reuse the definition of the basic pricing component Aging&FrequentCustomer Pricing

Summary so far ACs as larger-grained constructs that complement classes in modeling collaborations or behavior that cross-cut class boundaries Generic behavior that can be reused with a family of applications Independent development of components Independent connectors of ACs with applications Independent interfaces that are adapted explicitly Decoupled black-box composition of collaborations Definition of new collaborations as refinements of existing collaborations

Related work Adaptive Programming ACs Rondo visitor pattern (GOF, Krishnamurthi & al) polytypic programming (Jansson & Jeuring, Hinze) role modeling with template classes (VanHilst & Notkin) mixin-layers (Smaragdakis & Batory) contracts (Holland) AOP (Kiczales & Lopes) AOP (Kiczales & Lopes) SOP (Harrison & Ossher)

More related work: Participant graphs Relational databases: views, ANSI/SPARC architecture (1968)! Propagation patterns (1992): generic data model, concrete data model: automating the mapping 11/15/2018 Mezini/Lorenz/Lieberherr

Related work: Views From Mike Werner’s thesis views in databases: provide mechanisms for presenting smaller, simplified versions of a large object system for use by applications and end-users. 11/15/2018 Mezini/Lorenz/Lieberherr

Mezini/Lorenz/Lieberherr Database view A database view can be designed for an individual user or host program. A view is useful in mitigating the effects of schema change on users. The three-level ANSI/SPARC architecture: 1. internal level - Describes the physical storage structure of the database. 2. conceptual level - A global description of the structure of the database in terms of entity types (base tables), data types, relationships and constraints. 3. external level - The set of defined views which form the interface for the database users. D. Tsichritzis and A. Klug. The ANSI/X3/SPARC DBMS Framework. AFIPS Press, 1978. 11/15/2018 Mezini/Lorenz/Lieberherr

relational database view The view definition is a mapping from the conceptual schema to the view schema. When an application program or ad-hoc user queries a view, the view is materialized. The user (or program) can select from the view as if it was a base table, and in certain cases can update from it as well. Logical data independence refers to the ability to change the conceptual level while still supporting existing views defined at the external level. This is done by replacing old view queries, where needed, with new ones which are equivalent from the client's point of view. Provided the view query can be updated, an application program which accesses the database through a view does not need to be altered or even recompiled. 11/15/2018 Mezini/Lorenz/Lieberherr

Mezini/Lorenz/Lieberherr View integration Views are also useful for creating the global conceptual schema in the first place as part of bottom-up design 11/15/2018 Mezini/Lorenz/Lieberherr

Aspect-Oriented Programming (AOP) Definition Aspect-oriented programs consist of complementary, collaborating aspects, each one addressing a different application/system level concern Two aspects A1 and A2 are complementary collaborating aspects if an element a1 of A1 is formulated in terms of partial information about elements of A2 and A1 adds information to A2 not provided by another aspect. 11/15/2018 Mezini/Lorenz/Lieberherr

Mezini/Lorenz/Lieberherr AOP Definition (cont.) The partial information about A2 is called join points and provides the range of the weaving in A2. The domain of the weaving is in A1 and consists of weaves that refer to the join points. The weaves describe enhancements to A2. The join points may be spread through A2. After the weaving, enhancements from a1 effectively cross-cut A2 11/15/2018 Mezini/Lorenz/Lieberherr

Mezini/Lorenz/Lieberherr Graph of components aspect concrete ontology compose connector or refinement 11/15/2018 Mezini/Lorenz/Lieberherr

Components and connectors AC1 AC2 provides requires 11/15/2018 Mezini/Lorenz/Lieberherr

Mezini/Lorenz/Lieberherr Cross-cutting in AOP a2 in A2 Partial Information a1 in A1 The partial information of a2 referred to in a1 Enhancement defined in a1 is spread in a2. a1 adds to a2. 11/15/2018 Mezini/Lorenz/Lieberherr

Example: Write accesses application Example: Write accesses class Point { int _x = 0; int _y = 0; void set(int x, int y) { _x = x; _y = y; } void setX(int x) { _x = x; } void setY(int y) { _y = y; } int getX(){ return _x; } int getY(){ return _y; } aspect aspect ShowAccesses { static before Point.set, Point.setX, Point.setY { System.out.println(“W”); } 11/15/2018 Mezini/Lorenz/Lieberherr

Mezini/Lorenz/Lieberherr AOP example with AC class Point { int _x = 0; int _y = 0; void set(int x, int y) { _x = x; _y = y; } void setX(int x) { _x = x; } void setY(int y) { _y = y; } int getX(){ return _x; } int getY(){ return _y; } component ShowWAccesses { expect { Data-To-Access{ void writeOp(*);} replace void writeOp(){ System.out.println(“W”); expected(*);} } An AC is a better aspect description unit. An aspect written with an AC is more concise and reusable than Aspect/j aspects, due to name maps! Aspects are written independently of applications, or particular classes in the application. They are generic with respect to the primary module structure of the application. connector AddShowWAccesses { //connects appl, ShowWAccesses ... Point is Data-To-Access { … writeOp = set* ... } 11/15/2018 Mezini/Lorenz/Lieberherr

Mezini/Lorenz/Lieberherr Alternative syntax? class Point { int _x = 0; int _y = 0; void set(int x, int y) { _x = x; _y = y; } void setX(int x) { _x = x; } void setY(int y) { _y = y; } int getX(){ return _x; } int getY(){ return _y; } component ShowWAccesses { expected { Data-To-Access{ * write-op(*);} } provided { Data-To-Access { * write-op(*) { System.out.println(“W”); write-op(*);} }} An AC is a better aspect description unit. An aspect written with an AC is more concise and reusable than Aspect/j aspects, due to name maps! Aspects are written independently of applications, or particular classes in the application. They are generic with respect to the primary module structure of the application. connector AddShowWAccesses { connects appl, ShowWAccesses ... Point is Data-To-Access { … write-op = set* ... } 11/15/2018 Mezini/Lorenz/Lieberherr

AOP with ACs Application Participant Graph Structure participant-to-class name map Participant Graph Structure P1 P2 P3 expected interface map Behavior Definition P1 m 1,1 ... m 1,k 11/15/2018 Mezini/Lorenz/Lieberherr

AOP with ACs Application Participant Graph Behavior Definition participant-to-class name map Participant Graph P1 P2 P3 expected interface map Behavior Definition P1 participant-to-class name map m 1,1 ... m 1,k expected interface map Application 11/15/2018 Mezini/Lorenz/Lieberherr

AOP with ACs component Monitor { expected { Data-To-Protect {* access-op(*);} } provided { private Semaphore mutex = new Semaphore(1); Data-To-Protect { * access-op(*) { mutex.P(); * access-op(*); mutex.V(); } Application { . . . FIFOQueue { List elements = new List(); public void put(Object e) { elements.insertLast(e); } public Object get() { e = elements.removeFirst(); return e;} } Collaborations are not explicit in the software. This is what ACs will support. So why? connector ConcurentApplication { connects Application, Monitor; FIFOQueue implements Data-To-Protect { expected { access-op = {put, get} } } ...

AOP with ACs Application { component Rendez-Vous-Synchronization { . . . class HTTPServer { public HTMLDocument getURL(String url) { . . . } public void putURL(String url, HTMLDocument doc) { . . .} class WebBrowser { HTTPServer server; void connectToServer(HTTPServer aServer) { server = aServer;} void onMouseClick() { ... Server.getURL(linkUrlAddress); ... } } component Rendez-Vous-Synchronization { expected { Data-To-Protect {* access-op(*);} } provided { Semaphore mutex = new Semaphore(0); Semaphore sync = new Semaphore(0); Data-To-Protect { access-op(*) { mutex.P(); access-op(*); sync.V();} public void accept() { mutex.V(); sync.P();} connector ConcWebApplication { //connects Application, Rendez-Vous-Synchronization; Application.HTTPServer is Rendez-Vous-Synchronization.Data-To-Protect { expected { access-op = {putURL, getURL} } } ConcWebApplication.HTTPServer myServer = new ConcWebApplication. HTTPServer(); // Thread 1 while (true) {myServer.accept();} //Thread 2 // Thread 3 Browser b1 = new Browser(); Browser b2 = new Browser(); b1.connect(myServer); b2.connect(myServer); Collaborations are not explicit in the software. This is what ACs will support. So why?

Generalized Parameterized Programming Loose coupling is achieved by writing each component in terms of interfaces expected to be implemented by other components. This leads to a parameterized program with cross-cutting parameters P(C1, C2, ...). 11/15/2018 Mezini/Lorenz/Lieberherr

Enterprise Java Beans (EJB) and Aspectual components EJB: a hot Java component technology from SUN/IBM Aspectual components: a conceptual tool for the design of enterprise Java beans (and other components) 11/15/2018 Mezini/Lorenz/Lieberherr

Enterprise JavaBeans (EJB) Addresses aspectual decomposition. An enterprise Bean provider usually does not program transactions, concurrency, security, distribution and other services into the enterprise Beans. An enterprise Bean provider relies on an EJB container provider for these services. 11/15/2018 Mezini/Lorenz/Lieberherr

Mezini/Lorenz/Lieberherr EJB Beans Containers: to manage and adapt the beans. Intercept messages sent to beans and can execute additional code. Similar to reimplementation of expected interface in aspectual component. 11/15/2018 Mezini/Lorenz/Lieberherr

Aspectual components for EJB design/implementation Use ACs to model transactions, concurrency, security, distribution and other system level issues. Translate ACs to deployment descriptors (manually, or by tool). Use ACs to model beans in reusable form. Generate (manually or by tool) Java classes from ACs and connectors. 11/15/2018 Mezini/Lorenz/Lieberherr

Example: Use AC for EJB persistence As an example we consider how persistence is handled by EJB containers. The deployment descriptor of a bean contains an instance variable ContainerManagedFields defining the instance variables that need to be read or written. This will be used to generate the database access code automatically and protects the bean from database specific code. 11/15/2018 Mezini/Lorenz/Lieberherr

Aspectual component: Persistence component Persistence { PerMem p; participant Source { expect Target[] targets; expect void writeOp();} // for all targets:writeOp participant Target expect void writeOp(); replace void writeOp() { // write to persistent memory p expected();}} 11/15/2018 Mezini/Lorenz/Lieberherr

Mezini/Lorenz/Lieberherr Deployment connector PersistenceConn1 { ClassGraph g = ; // from Company to * Company is Persistence.Source; Nodes(g) is Persistence.Target; with {writeOp = write*}; // must be the same writeOp for both // Source and Target } 11/15/2018 Mezini/Lorenz/Lieberherr

Generate deployment descriptor Connector contains information about ContainerManagedFields Connector localizes information; it is not spread through several classes 11/15/2018 Mezini/Lorenz/Lieberherr

Mezini/Lorenz/Lieberherr END 11/15/2018 Mezini/Lorenz/Lieberherr

Inheritance between components component ShowReadWriteAccess extends ShowReadAccess { participant DataToAccess { expect void writeOp(Object[] args); replace void writeOp(Object[] args){ System.out.println( "Write access on " + this.toString()); expected(args);}} } 11/15/2018 Mezini/Lorenz/Lieberherr

Inheritance between connectors connector ShowReadWriteAccessConn2 extends ShowReadAccessConn3 { {Point,Line,Rectangle} is DataToAccess with { writeOp = set*; } 11/15/2018 Mezini/Lorenz/Lieberherr