Award winning technologies

Slides:



Advertisements
Similar presentations
Chapter 23 Organizing list implementations. This chapter discusses n The notion of an iterator. n The standard Java library interface Collection, and.
Advertisements

Transparency No. 1 Java Collection API : Built-in Data Structures for Java.
Lists and the Collection Interface Chapter 4. Chapter Objectives To become familiar with the List interface To understand how to write an array-based.
AITI Lecture 19 Linked List Adapted from MIT Course 1.00 Spring 2003 Lecture 26 and Tutorial Note 9 (Teachers: Please do not erase the above note)
Java Review Interface, Casting, Generics, Iterator.
Software Development CSU 670 Fall 2007 Karl Lieberherr.
Lists and the Collection Interface Chapter 4. Chapter 4: Lists and the Collection Interface2 Chapter Objectives To become familiar with the List interface.
Fall 2007CS 2251 Lists and the Collection Interface Chapter 4.
About the Presentations The presentations cover the objectives found in the opening of each chapter. All chapter objectives are listed in the beginning.
Interpreter By: Mahmoodreza Jahanseir Amirkabir University of Technology Computer Engineering Department Fall 2010.
ECE450 - Software Engineering II1 ECE450 – Software Engineering II Today: Design Patterns VI Composite, Iterator, and Visitor Patterns.
Java Software Solutions Lewis and Loftus Chapter 2 1 Copyright 1997 by John Lewis and William Loftus. All rights reserved. Software Concepts -- Introduction.
Searching Also: Logarithms. 2 Searching an array of integers If an array is not sorted, there is no better algorithm than linear search for finding an.
Starting Chapter 4 Starting. 1 Course Outline* Covered in first half until Dr. Li takes over. JAVA and OO: Review what is Object Oriented Programming.
REFACTORING Lecture 4. Definition Refactoring is a process of changing the internal structure of the program, not affecting its external behavior and.
Java Programming: Advanced Topics 1 Collections and Wealth of Utilities.
Collections in Java. Kinds of Collections Collection --a group of objects, called elements –Set-- An unordered collection with no duplicates SortedSet.
Copyright © 2002, Systems and Computer Engineering, Carleton University Patterns.ppt * Object-Oriented Software Development Part 11.
111 © 2002, Cisco Systems, Inc. All rights reserved.
Hello.java Program Output 1 public class Hello { 2 public static void main( String [] args ) 3 { 4 System.out.println( “Hello!" ); 5 } // end method main.
Refactoring1 Improving the structure of existing code.
Java 5 Part 1 CSE301 University of Sunderland Harry Erwin, PhD.
1/20/03A2-1 CS494 Interfaces and Collection in Java.
Not only mark-up languages! There are other many other grammar formalisms and tools than XML. Some of them standardized (ASN). Even XML does not always.
Design Patterns Gang Qian Department of Computer Science University of Central Oklahoma.
John J. Sung TA Consulting. Motivation for TraversalJ KL Enterprises identified AOP Enter into the AOP market early Add value by adding traversals to.
Chapter 6 Introduction to Defining Classes. Objectives: Design and implement a simple class from user requirements. Organize a program in terms of a view.
Chapter 3 Collections. Objectives  Define the concepts and terminology related to collections  Explore the basic structures of the Java Collections.
Application development with Java Lecture 21. Inheritance Subclasses Overriding Object class.
Iterators ITI 1121 N. El Kadri. Motivation Given a (singly) linked-list implementation of the interface List, defined as follows, public interface List.
CMSC 202 Containers and Iterators. Container Definition A “container” is a data structure whose purpose is to hold objects. Most languages support several.
Interpreter By: Mahmoodreza Jahanseir Amirkabir University of Technology Computer Engineering Department Fall 2010.
COM1205 TraversalJ Project* Pengcheng Wu Feb.25,2003.
Collections Dwight Deugo Nesa Matic
1 Chapter 4 Unordered List. 2 Learning Objectives ● Describe the properties of an unordered list. ● Study sequential search and analyze its worst- case.
COMPOSITE PATTERN NOTES. The Composite pattern l Intent Compose objects into tree structures to represent whole-part hierarchies. Composite lets clients.
Copyright © 2007 Pearson Education, Inc. Publishing as Pearson Addison-Wesley Starting Out with Java From Control Structures through Data Structures by.
 It is a pure oops language and a high level language.  It was developed at sun microsystems by James Gosling.
Lists and the Collection Interface Chapter 4. Chapter 4: Lists and the Collection Interface2 Chapter Objectives To become familiar with the List interface.
Sets and Maps Chapter 9.
Topic 2: binary Trees COMP2003J: Data Structures and Algorithms 2
Searching.
Lecture 12 Inheritance.
Chapter 5: Control Structures II
MPCS – Advanced java Programming
Shell Script Assignment 1.
Lecture 9-2: Interacting with the Superclass (super);
For John.
Data Modeling II XML Schema & JAXB Marc Dumontier May 4, 2004
Presentation by Julie Betlach 7/02/2009
Java Intro III.1 (Fr Feb 23).
DemeterJ Collaborative Behavior (using DJ) .prj ProjectControl
The Metacircular Evaluator
Improving the structure of existing code
Third lecture Review Visitor pattern DemeterJ 12/25/2018 SD.
Dynamic Data Structures and Generics
Interpreter Pattern.
Third lecture Review Visitor pattern DemeterJ 2/17/2019 SD.
Lecture 14: Inheritance Building Java Programs: A Back to Basics Approach by Stuart Reges and Marty Stepp Copyright (c) Pearson All rights reserved.
Protocols CS 4311 Wirfs Brock et al., Designing Object-Oriented Software, Prentice Hall, (Chapter 8) Meyer, B., Applying design by contract, Computer,
Building Java Programs
Searching.
Building Java Programs
Lecture 13 Introduction to High-Level Programming (S&G, §§7.1–7.6)
Review: libraries and packages
Building Java Programs
Building Java Programs
Software Design Lecture : 39.
Building Java Programs
ITEC324 Principle of CS III
Presentation transcript:

Award winning technologies We use three winners: Eclipse, JAXB, AspectJ 12/2/2018 SD

2003 JavaWorld Editors' Choice Awards Best Java IDE Borland JBuilder 8.0, Borland Software Eclipse 2.1, Eclipse.org IntelliJ IDEA 3.0, JetBrains 12/2/2018 SD

2003 JavaWorld Editors' Choice Awards Best Java-XML Tool JAXB (Java Architecture for XML Binding), Sun Microsystems Xalan-Java 2.5, The Apache XML Project Xerces2 Java Parser 2.4, The Apache XML Project 12/2/2018 SD

2003 JavaWorld Editors' Choice Awards Most Innovative Java Product or Technology AspectJ 1.0.6, Eclipse.org Eclipse 2.1, Eclipse.org JavaServer Faces, Java Community Process (Java Specification Request (JSR) 127) 12/2/2018 SD

DemeterJ Collaborative Behavior (using DJ) .prj ProjectControl Structure-shy Traversal / Selective Visitor Patterns Collaborative Behavior (using DJ) .prj .beh (99% Java) ProjectControl Class dictionary generate Classes compile .cd .java .class follow parse ObjectDescriptions Objects print .input Structure-shy Object Pattern Similar to JAXB Java Virtual Machine 12/2/2018 SD

12/2/2018 SD

Growth plan pattern Intent Could also be called: Build your adaptive programs incrementally. Use structural and behavioral simplifications which allow, ideally, for growth by addition and refinement. Could also be called: Evolutionary development, Agile development 12/2/2018 SD

Earlier Patterns Four Patterns Structure-shy Traversal Selective Visitor Structure-shy Object Class Graph 12/2/2018 SD

How your project/hw directory should look like /personality-proj /growth-phase1 /growth-phase2 /growth-phase3 … Each directory contains a running program. 12/2/2018 SD

Growth plan Motivation: It is useful to have at all times a simplified version of the program running. good for your self-confidence good for your customers: feedback Build applications in growth phases, where a phase next can do more than a previous phase previous. 12/2/2018 SD

Growth plan Motivation (continued): We want to build next as much as possible out of previous by adding or refining, not by modifying previous. next ideally reuses the test inputs of previous. Application: Use this pattern when you build applications involving more than a small number of classes (say 5). 12/2/2018 SD

Growth plan Solution: A good strategy is to build a relative big chunk of the class dictionary of the application and to test it with several input sentences. Then build a structural shrinking plan (whose inverse is a structural growth plan) consisting of a decreasing (in size) sequence of class dictionaries. 12/2/2018 SD

Growth plan Solution (continued): For the smallest class dictionary you should be able to implement some interesting behavior. For each phase in the structural growth plan you implement increasingly more complex behavior. 12/2/2018 SD

Growth plan Solution (continued): The structural growth steps should ideally be language extending so that the inputs of phase i also are legal inputs for phase i+1. The behavioral growth steps should ideally be additive and should require only small modifications. 12/2/2018 SD

Growth plan behavior phases L1 Í L2 Í L3 structure, grammar phases P4 (P0, P1) (P2,P3) (P4) 12/2/2018 SD

OS simulation example Phase 1: Structure: Start with full class dictionary and use the following slices: tg1 = from FileSystem to * and tg2 = from Commands to CreateEmptyFile. Behavior: Main.cdir. Commands::process(tg2){ CommandVisitor cv = ...; tg2.traverse(this,cv);} CommandVisitor::before(CreateEmptyFile h){ create SimpleFile sf; addElement(sf);} 12/2/2018 SD

OS simulation example Phase 1: Why useful? What does it test? We can check whether simple files that are created anywhere in the input, are properly added to the root directory. Program already shows some of the right behavior: if we only have touch commands. But also on other inputs it shows useful behavior. 12/2/2018 SD

Phase 1: class dictionary FileSystem = <root> CompoundFile EOF. File : SimpleFile | CompoundFile common <f> FileName. SimpleFile = "simple". CompoundFile = "compound" <contents> PList(File) [<parent> CompoundFile]. 12/2/2018 SD

Phase 1: class dictionary Commands = List(Command) EOF. Command : Simple. Simple : MakeDirectory | ChangeDirectoryUp | ChangeDirectoryDown | RecursiveCopy | DiskUsage | Find | Echo | SymbolicLink | RemoveDirectory | CreateEmptyFile | RemoveFile. MakeDirectory = "mkdir" DirectoryName. ChangeDirectoryUp = "cd ..". ChangeDirectoryDown = "cd" DirectoryName. RecursiveCopy = "cp -r ../* ." . DiskUsage = "du .". SymbolicLink = "ln -s" <from> FileName <to> FileName. RemoveDirectory = "rmdir" DirectoryName. 12/2/2018 SD

Phase 1: class dictionary // "touch f" creates an empty file called f. CreateEmptyFile = "touch" FileName. RemoveFile = "rm" FileName. Find = "find . -name" DirectoryName "-print". Echo = "echo" Message. FileName = Ident. DirectoryName = Ident. Message = String. PList(S) ~ "(" {S} ")". List(S) ~ {S}. Main = . 12/2/2018 SD

Desired behavior (example) FileSystem fs = new FileSystem( new CompoundFile(new FileName( new Ident ("root")), new File_PList() ) ); File_PList filelist1 = fs.get_root().get_contents(); CompoundFile a = new CompoundFile( new FileName( new Ident ("a")), new File_PList()); filelist1.addElement(a); 12/2/2018 SD

Desired behavior (example) CompoundFile b = new CompoundFile( new FileName( new Ident ("b") ), new File_PList()); filelist1.addElement(b); 12/2/2018 SD

Desired behavior (example) File_PList filelist2 = a.get_contents(); CompoundFile c = new CompoundFile( new FileName( new Ident ("c") ), new File_PList()); filelist2.addElement(c); 12/2/2018 SD

Phase 1 Commands { {{ void process(TraversalGraph where) { CommandVisitor cV = new CommandVisitor(); where.traverse(this, cV); } }} 12/2/2018 SD

Phase 1 CommandVisitor { {{ void before(CreateEmptyFile host){ SimpleFile sf = SimpleFile.parse("simple " + (Ident) Main.cg.fetch(host, "from CreateEmptyFile to" + Main.FIdent); // host.get_filename().get_ident()); // SimpleFile sf = new SimpleFile( // host.get_filename()); Main.cdir.get_contents().addElement(sf); System.out.println(" CreateEmptyFile "); } }} } 12/2/2018 SD

Phase 1 Main { (@ static CompoundFile cdir; static ClassGraph cg; static String FIdent = " edu.neu.ccs.demeter.Ident "; static public void main(String args[]) throws Exception { Commands cs = Commands.parse(System.in); cs.print(); System.out.println(); FileSystem fs = FileSystem.parse( "compound () root"); 12/2/2018 SD

Phase 1: Main continued cdir = fs.get_root(); cg = new ClassGraph(true, false); ClassGraph cgCommandsWithoutTail = new ClassGraph(Main.cg, "from Commands bypassing -> *,tail,* to *"); cs.process(new TraversalGraph ("from Commands to *”, cgCommandsWithoutTail)); 12/2/2018 SD

Input for testing phase 1 touch a touch b mkdir x touch c cd x touch d 12/2/2018 SD

OS simulation example Phase 2: Structure: Use larger part of class dictionary: tg2 = from Commands to {CreateEmptyFile, MakeDirectory}. CommandVisitor::before(MakeDirectory h){ create CompoundFile cf; addElement(cf);} 12/2/2018 SD

OS simulation example Phase 2: Why useful? What does it test? We can check whether simple files and directories that are created anywhere in the input, are properly added to the root directory. Program already shows some of the right behavior: if we only have touch and mkdir commands. But also on other inputs it shows useful behavior. 12/2/2018 SD

Input for testing phases 1 and 2 touch a touch b mkdir x touch c cd x touch d 12/2/2018 SD

Phase 2 CommandVisitor { {{ void before(MakeDirectory host){ Ident id = (Ident) Main.cg.fetch(host, "from MakeDirectory to" + Main.FIdent); CompoundFile cf = CompoundFile.parse("compound ()" + id); cf.set_parent(Main.cdir); // new CompoundFile( // new FileName(host.get_directoryname().get_ident()), // new File_PList(),Main.cdir); Main.cdir.get_contents().addElement(cf); System.out.println(" MakeDirectory "); } 12/2/2018 SD

What is next? ChangeDirectoryDown ChangeDirectoryUp Which one is easier to test? It is very important that we can test each phase to get immediate gratification whether we did it right. 12/2/2018 SD

OS simulation example Phase 3: Structure: Use larger part of class dictionary: tg2 = from Commands to {CreateEmptyFile, MakeDirectory, ChangeDirectoryDown}. Change CommandVisitor: entry for ChangeDirectoryDown; Search through current directory to find directory to enter. Update Main.cdir. 12/2/2018 SD

Input for testing phases 1, 2, 3 touch a touch b mkdir x touch c cd x touch d 12/2/2018 SD

OS simulation example Phase 4: Structure: Use larger part of class dictionary: tg2 = from Commands to {CreateEmptyFile, MakeDirectory, ChangeDirectoryDown, ChangeDirectoryUp}. Change class dictionary: parent field. Change display: infinite loop: 2 options. Change CommandVisitor: entry for ChangeDirectoryUp; update entry for MakeDirectory: maintain parent. 12/2/2018 SD

Input for testing phase 4 mkdir x cd x mkdir y cd y touch d cd .. touch c 12/2/2018 SD

For phases 3 and 4: List Structure List(X) first X_List NonEmpty_X_List next it X 12/2/2018 SD

Iterating through a DemeterJ list Have an X_List xlist; java.util.Enumeration en = xlist.elements(); while (en.hasMoreElements()) { if (e.equals((X) en.nextElement())) { found = true; } found = false; } Enumeration Interface boolean hasMoreElements(); Object nextElement(); 12/2/2018 SD

Iterating through a DemeterJ list: in class X_List public java.util.Enumeration elements() { return new X_List(first); } public Object nextElement() { X car = first.get_it(); first = first.get_next(); return (Object) car; 12/2/2018 SD

Iterating through a DemeterJ list: in class X_List public boolean hasMoreElements() { return (first != null); } 12/2/2018 SD

Enumeration interface is old fashioned Use Iterator interface instead boolean hasNext(); Object next(); void remove(); (optional operation) Compare to Enumeration Interface boolean hasMoreElements(); Object nextElement(); 12/2/2018 SD

Enumeration interface is old fashioned ListIterator is a subinterface of Iterator boolean hasNext(); Object next(); void remove(); (optional operation) add, hasPrevious, previousIndex, nextIndex, previous, set 12/2/2018 SD

Java documentation The functionality of the Enumeration interface is duplicated by the Iterator interface. … shorter method names ... New implementations should consider using Iterator in preference to Enumeration. 12/2/2018 SD

Traversal with a ListIterator void traverse_maxSize(IntegerRef m){ for (ListIterator i=this.listIterator(); i.hasNext();) { DirectoryEntry de = (DirectoryEntry) i.next(); de.traverse_maxSize(m); } 12/2/2018 SD

How can you get an Iterator? Interface Collection: Iterator iterator(); Example: class Vector implements interface List interface List extends interface Collection Therefore: Use the Iterator interface to go through a vector 12/2/2018 SD

Change display() method f root :FileName :FileSystem :CompoundFile contents first :File_PList :NonEmpty_File_PList next it :CompoundFile parent f contents 12/2/2018 SD

Testing for Type in Java if (f instanceof CompoundFile) { cf = (CompoundFile) f; ... } USE SPARINGLY! 12/2/2018 SD

OS simulation example Phase 5: Structure: Use larger part of class dictionary: tg2 = from Commands to {CreateEmptyFile, MakeDirectory, ChangeDirectoryDown, ChangeDirectoryUp, DiskUsage}. Change CommandVisitor: entry for DiskUsage: requires itself a traversal. 12/2/2018 SD

Output to expect In a DemeterJ diretory: du . ./gen/classes ./gen . 12/2/2018 SD

OS simulation example Phase 5: Traversal in visitor: from CompoundFile to File Visitor: before CompoundFile: print path from current directory 12/2/2018 SD

Growth plan Solution (continued): For the smallest class dictionary you should be able to implement some interesting behavior. For each phase in the structural growth plan you implement increasingly more complex behavior. The structural growth steps should fall into one or both of the following categories: 12/2/2018 SD

Growth plan Solution (continued): cd = class dictionary Growth plan Solution (continued): weakly object extending cd transformations The next class dictionary defines more objects but does not invalidate any existing objects. What runs now should run later. Reuse of test objects. language extending cd transformations The next cd defines a super language of the language of the current cd. 12/2/2018 SD

Object-extending transformations relations on class graphs, associated with transformations, fundamental for reuse object-equivalence preserves the set of objects weak extension enlarges the set of objects extension enlarges and augments the set of objects 12/2/2018 SD

Part clusters What can be put into parts? PartClusters of a class v is a list of pairs, one for each induced part of v. Each pair consists of the part name and the set of construction classes whose instances can be assigned to the part PartClustersFurnace(TempSensor) = {temp {Kelvin, Celsius}, trigger {Integer}} 12/2/2018 SD

Object-equivalence Let G1 and G2 be two class graphs. G1 is object-equivalent to G2 if for the concrete classes VC1 of G1 and the concrete classes VC2 of G2: VC1 = VC2 and for all v in VC1: PartClustersG1(v)= PartClustersG2(v). 12/2/2018 SD

Covered Let PC1 and PC2 be two part clusters. PC1 is covered by PC2 if for each pair (l,T1) in PC1 there exists a pair (l,T2) in PC2 such that T1 Í T2. Tightly covered means: covered and |PC1| = |PC2|. 12/2/2018 SD

Weak extension Let G1 and G2 be two class graphs. G1 is a weak extension of G2 if for the concrete classes VC1 of G1 and the concrete classes VC2 of G2: VC1 Í VC2 and for all v in VC1: PartClustersG1(v) is tightly covered by PartClustersG2(v). 12/2/2018 SD

Extension Let G1 and G2 be two class graphs. G1 is an extension of G2 if for the concrete classes VC1 of G1 and the concrete classes VC2 of G2: VC1 Í VC2 and for all v in VC1: PartClustersG1(v) is covered by PartClustersG2(v). 12/2/2018 SD

Properties The three class graph relations have the following inclusion properties: object-equivalence Í weak-extension Í extension 12/2/2018 SD

DelA* AbsR* RepR* DisR* AddA* H DelA* AbsR* RepR* DisR* AddA* G F H object-equivalent F G inheritance A B C D E A B C E 12/2/2018 SD

Primitive Transformations Addition of Abstract Class (AddA) Deletion of Abstract Class (DelA) Abstraction of Common Reference (AbsR) Distribution of Common Reference (DisR) Replacement of Reference (RepR) object-equivalence = DelA* AbsR* RepR* DisR* AddA*. 12/2/2018 SD

Primitive Transformations Addition of Abstract Class (AddA) adds an abstract class u and subclass edges outgoing from u. u must not have any outgoing construction edges. Deletion of Abstract Class (DelA) inverse of AddA. Deletes an abstract class u and all its subclass edges. u must not have any incoming construction or subclass edges nor any outgoing construction edges. 12/2/2018 SD

Primitive Transformations Abstraction of Common Reference (AbsR) moves a construction edge common to a set of sibling classes up to their direct superclass. Distribution of Common Reference (DisR) moves a construction edge to the direct subclasses. 12/2/2018 SD

Primitive Transformations Replacement of Reference (RepR) reroutes a construction edge (v,l,u1) to a new target (v,l,u2) where u1 and u2 have the same set of concrete subclasses. 12/2/2018 SD

Primitive Transformations Addition of Concrete Class (AddC) Generalization of Reference (GenR) Addition of Reference (AddR) Equiv = object equivalence weak-extension = (Equiv((GenR)Equiv)*AddC* extension = (Equiv((AddR|GenR)Equiv)*AddC* 12/2/2018 SD

Primitive Transformations Addition of Concrete Class (AddC) adds an “empty” concrete class Generalization of Reference (GenR) reroutes a construction edge (v,l,u1) to a new target (v,l,u2), where u2 is a direct superclass of u1. 12/2/2018 SD

Primitive Transformations Addition of Reference (AddR) adds a new construction edge between existing vertices of the class graph. 12/2/2018 SD

Warning In the following viewgraphs is-a and has-a edges should be switched. 12/2/2018 SD

DelA* AbsR* RepR* DisR* AddA* H DelA* AbsR* RepR* DisR* AddA* G F H object-equivalent F G inheritance A B C D E A B C E 12/2/2018 SD

H F2 DisR* AddA* G F H D2 F G A B C D E A B C E 12/2/2018 SD

H F2 RepR* DisR* AddA* G F H D2 F G A B C D E A B C E 12/2/2018 SD

AbsR* RepR* DisR* AddA* H F2 AbsR* RepR* DisR* AddA* G F H D2 F G A B C D E A B C E 12/2/2018 SD

DelA* AbsR* RepR* DisR* AddA* H F2 DelA* AbsR* RepR* DisR* AddA* G H D2 F G A B C D E A B C E 12/2/2018 SD

Connections weak extension implies language extension If two cds are in a weakly object-extending relationship they can be brought to a language extending relationship with appropriate syntax. object-equivalent extension implies language-equivalent extension similar 12/2/2018 SD

Growth plan behavior transformations should ideally extend the program by addition instead of modifying it: use inheritance between visitor classes add methods, traversals, visitors refine methods and visitors refine strategies (add more constraints) 12/2/2018 SD

Growth plan behavior phases L1 Í L2 Í L3 structure, grammar phases P4 (P0, P1) (P2,P3) (P4) 12/2/2018 SD

Growth plan Consequences: Following Growth plan has a number of benefits: Gradual building of confidence in your software development skills. Show prototypes to your customers. Simplified testing. Find earliest phase where a bug shows up. faster compilation and generation 12/2/2018 SD

Growth plan Implementation: Create separate directories for each growth phase. Document changes. See chapter 13 in AP book for study of class graph extension. Also follow the pages listed under index entry growth plan. 12/2/2018 SD

Example Same adaptive program for Terminal Buffer Rule checking works for both phases. Faster for phase 1. Cd_graph = <first> Adj. Adj = <vertex> Vertex <ns> Construct “.”. Construct = “=“ <l1> Labeled_vertex <l2> Labeled_vertex. Labeled_vertex = “<“ <label_name> Label “>“ <class_name> Vertex. Vertex = <name> Ident. Label = <name> Ident. phase 1 Cd_graph = <first> Adj <rest> Adj_list. Adj = <vertex> Vertex <ns> Neighbors “.”. Neighbors : Construct | Alternat. Construct = “=“ <c_ns> Any_vertex_list. Labeled_vertex = “<“ <label_name> Label “>“ <class_name> Vertex. Vertex = <name> Ident. Any_vertex_list = <first> Any_vertex <rest> Any_vertex_list. Any-Vertex : Labeled_vertex | Syntax_vertex. ... phase 2 NOT even an extension 12/2/2018 SD

Conclusion Using Adaptive Programming you can apply the Growth Plan pattern effectively. You can start with simple structures and generalize your program to more general structures easily. 12/2/2018 SD

Further information Paul Bergstein’s OOPSLA 91 paper Walter Huersch’s Ph.D. thesis Linda Seiter’s Ph.D. thesis 12/2/2018 SD

End of lecture 12/2/2018 SD