archjava a software architecture tool –components –connections –constraints on how components...
Post on 21-Dec-2015
222 views
TRANSCRIPT
ArchJava
• A software architecture tool– components– connections– constraints on how components interact
• Implementation must conform to architecture
References
• ECOOP 2002 paper
• ICSE 2002 paper
• website on ArchJava
• ArchJava reference manual
Architectural Conformance
• communication integrity– each component in the implemented system
may only communicate directly with the components to which it is connected in the architecture.
public component class Parser { public port in { provides void setInfo(Token symbol, SymTabEntry e); requires Token nextToken() throws ScanException; } public port out { provides SymTabEntry getInfo(Token t); requires void compile (AST ast);} void parse (String file) { Token tok = in.nextToken(); AST ast = parseFile(tok); out.compile(ast); } AST parseFile(Token lookahead) { … } void setInfo(Token t, SymTabEntry e) {… } SymTabEntry getInfo(Token t) { … } …}
strange that parse does not belong to a port; parse isprovided.
collaboration Parser { public participant in { provides void setInfo(Token symbol, SymTabEntry e); requires Token nextToken() throws ScanException; } public participant out { provides SymTabEntry getInfo(Token t); requires void compile (AST ast); void parse (String file) { Token tok = in.nextToken(); AST ast = parseFile(tok); out.compile(ast); } AST parseFile(Token lookahead) { … } void setInfo(Token t, SymTabEntry e) {… } SymTabEntry getInfo(Token t) { … } …}
can we do the samewith an aspectual collaboration?
public component class Compiler { private final Scanner scanner = … ; private final Parser parser = … ; private final CodeGen codegen = … ;
connect scanner.out, parser.in; connect parser.out, codegen.in
public static void main(String args[]) { new Compiler().compile(args); } public void compile(String args[]) { // for each file in args do: … parser.parse(file); … }
Composite components
• sub component: component instance nested within another component.
• singleton sub components: final
• connections: connect primitive is symmetric– bind each required method to a provided
method with same name and signature– args to connect: components own ports or those
of subcomponents in final fields
Composite components
• Provided methods can be implemented by forwarding invocations to sub components or to the required methods of another port.
• Alternative connection semantics: write smart connectors.
• Only a component’s parent can invoke its methods directly.
Dynamic architectures
• create component instances with new.
• typed references to sub components may not escape the scope of their parent.
• Garbage collection when components are no longer reachable through references or connections.
public component class WebServer { private final Router r = new Router(); connect r.request, create; // may be instantiated at run-time // personality analogy connect pattern Router.workers, Worker.serve; public void run() { r.listen(); } private port create { provides r.workers requestWorkers() { final Worker newWorker = new Worker(); r.workers connection = connect(r.workers, newWorker.serve); return connection; } }}
public component class Router {
Limitations of ArchJava
• only Java• inter-component connections must be
implemented through method calls (not events, for example)
• focus on communication integrity• no reasoning about temporal ordering of
architectural events• shared data
Example: Aphyds
• Developed by EE professor with PhD in CS
Hypotheses
• Do those hypotheses hold for aspectual collaborations? A port corresponds to a participant.
• In ArchJava: no renaming of methods in connectors
Hypotheses
• Refactoring an application to expose its architecture is done most efficiently in small increments
• Applications can be translated into ArchJava with a modest amount of effort and without excessive code bloat
Hypotheses
• Expressing software in ArchJava highlights refactoring opportunities by making communication protocols explicit.
• Note: the name of a port gives a clue about the purpose of the port’s methods.
Hypotheses
• Using separate ports and connections to distinguish different protocols and describing protocols with separate provided and required port interfaces may ease program understanding tasks.
• Communication integrity in ArchJava encourages local communication and helps to reduce coupling between components.
Architectural Refactoring during Translation
• ArchJava’s
Ideas
• Can ArchJava constraints be simulated in AspectJ? Simulate a component class with aspects that check the constraints?
• What are the connections between ports and participants?
• Law of Demeter and default architecture.
Ports and Participants
• Sounds like ports are a second very useful application of the participant idea. Participants are connected in a graph; ports don’t rely on that.
Ports and Participants
• ArchJava• has provides/requires• connect: link ports• no renaming• no component merging
• AC• has provides/requires• attach: link participants• renaming of method names• component merging
component class Flying { port flier { provides void fly(); requires void takeOff(); requires void land(); …}}component class Bat { port flier_infra { provides void takeOff(); provides void land(); … } }component class FlyingBat { private final Flying f = … ; private final Bat b = … ; connect f.flier, b.flier_infra; public void fly() { f.fly();}}
Topic Switch
Hygienic Components and Mixins
class AddAttribute<C,Attribute> extends C{
// mixin class that adds a field of type
// Attribute to any class C
private Attribute _a;
void setAttribute(Attribute a) {_a = a;}
Attribute getAttribute() {return _a;}
}
class Point { … }