1 / 39

Architecture Implementation Techniques

Architecture Implementation Techniques. Software Architecture. “Programming Your Architecture”. Comp A. Comp A. Comp B. Comp B. Comp C. Comp C. Architectural Structure. class DemoArch { static public void main(String argv[]) {

limei
Télécharger la présentation

Architecture Implementation Techniques

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Architecture Implementation Techniques Software Architecture

  2. “Programming Your Architecture”

  3. Comp A Comp A Comp B Comp B Comp C Comp C Architectural Structure class DemoArch { static public void main(String argv[]) { Architecture arch = new Architecture (“DEMO”); // create components Component a = new Component (“A”); Component b = new Component (“B”); Component c = new Component (“C”); // create connectors Connector d = new Connector(“D”); // add components and connectors arch.addComponent(a); arch.addComponent(b); arch.addComponent(c); arch.addConnector(d); // establish the interconnections arch.attach(a, d); arch.attach(b, d); arch.attach(d, c); } } Architecture - DEMO Connector D Connector D

  4. Send (e1) Comp A Comp B Comp B handles event and sends response public void handle(Event e) { if (e.equals(“Event_C”)) { ... Event e1= new Event(“RSP_to_C”, REPLY); e1.addParameter(“response”, resp); send(e1); }... } Comp C Architectural Interaction Architecture - DEMO Connector D Send (e)

  5. More on Frameworks • Frameworks are meant to assist developers in following a style • But generally do not constrain developers from violating a style if they really want to • Developing applications in a target style does not require a framework • But if you follow good software engineering practices, you’ll probably end up developing one anyway • Frameworks are generally considered as underlying infrastructure or substrates from an architectural perspective • You won’t usually see the framework show up in an architectural model, e.g., as a component

  6. Same Style, Different Frameworks • For a given style, there is no one perfect architecture framework • Different target implementation technologies induce different frameworks • stdio vs. iostream vs. java.io • Even in the same (style/target technology) groupings, different frameworks exist due to different qualitative properties of frameworks • java.io vs. java.nio • Various C2-style frameworks in Java

  7. Evaluating Frameworks • Can draw out some of the qualitative properties just mentioned • Platform support • Target language, operating system, other technologies • Fidelity • How much style-specific support is provided by the framework? • Many frameworks are more general than one target style or focus on a subset of the style rules • How much enforcement is provided?

  8. Evaluating Frameworks (cont’d) • Matching Assumptions • Styles impose constraints on the target architecture/application • Frameworks can induce constraints as well • E.g., startup order, communication patterns … • To what extent does the framework make too many (or too few) assumptions? • Efficiency • Frameworks pervade target applications and can potentially get involved in any interaction • To what extent does the framework limit its slowdown and provide help to improve efficiency if possible (consider buffering in stdio)?

  9. Evaluating Frameworks (cont’d) • Other quality considerations • Nearly every other software quality can affect framework evaluation and selection • Size • Cost • Ease of use • Reliability • Robustness • Availability of source code • Portability • Long-term maintainability and support

  10. Middleware and Component Models • This may all sound similar to various kinds of middleware/component frameworks • CORBA, COM/DCOM, JavaBeans, .NET, Java Message Service (JMS), etc. • They are closely related • Both provide developers with services not available in the underlying OS/language • CORBA provides well-defined interfaces, portability, remote procedure call… • JavaBeans provides a standardized packaging framework (the bean) with new kinds of introspection and binding

  11. Middleware and Component Models (cont’d) • Indeed, architecture implementation frameworks are forms of middleware • There’s a subtle difference in how they emerge and develop • Middleware generally evolves based on a set of services that the developers want to have available • E.g., CORBA: Support for language heterogeneity, network transparency, portability • Frameworks generally evolve based on a particular architectural style that developers want to use • Why is this important?

  12. Middleware and Component Models (cont’d) • By focusing on services, middleware developers often make other decisions that substantially impact architecture • E.g., in supporting network transparency and language heterogeneity, CORBA uses RPC • But is RPC necessary for these services or is it just an enabling technique? • In a very real way, middleware induces an architectural style • CORBA induces the ‘distributed objects’ style • JMS induces a distributed implicit invocation style • Understanding these implications is essential for not having major problems when the tail wags the dog!

  13. Resolving Mismatches • A style is chosen first, but the middleware selected for implementation does not support (or contradicts) that style • A middleware is chosen first (or independently) and has undue influence on the architectural style used • Strategies • Change or adapt the style • Change the middleware selected • Develop glue code • Leverage parts of the middleware and ignore others • Hide the middleware in components/connectors Use the middlewareas the basis fora framework

  14. Hiding Middleware in Connectors Comp 1 Comp 1 Architecture (thread) Async Event RPC (thread) Implementation Comp 2 Comp 2

  15. Building a New Framework • Occasionally, you need a new framework • The architectural style in use is novel • The architectural style is not novel but it is being implemented on a platform for which no framework exists • The architectural style is not novel and frameworks exist for the target platform, but the existing frameworks are inadequate • Good framework development is extremely difficult • Frameworks pervade nearly every aspect of your system • Making changes to frameworks often means changing the entire system • A task for experienced developers/architects

  16. New Framework Guidelines • Understand the target style first • Enumerate all the rules and constraints in concrete terms • Provide example design patterns and corner cases • Limit the framework to the rules and constraints of the style • Do not let a particular target application’s needs creep into the framework • “Rule of three” for applications

  17. New Framework Guidelines (cont’d) • Choose the framework scope • A framework does not necessarily have to implement all possible stylistic advantages (e.g., dynamism or distribution) • Avoid over-engineering • Don’t add capabilities simply because they are clever or “cool”, especially if known target applications won’t use them • These often add complexity and reduce performance

  18. New Framework Guidelines (cont’d) • Limit overhead for application developers • Every framework induces some overhead (classes must inherit from framework base classes, communication mechanisms limited) • Try to put as little overhead as possible on framework users • Develop strategies and patterns for legacy systems and components • Almost every large application will need to include elements that were not built to work with a target framework • Develop strategies for incorporating and wrapping these

  19. Concurrency • Concurrency is one of the most difficult concerns to address in implementation • Introduction of subtle bugs: deadlock, race conditions… • Another topic on which there are entire books written • Concurrency is often an architecture-level concern • Decisions can be made at the architectural level • Done carefully, much concurrency management can be embedded into the architecture framework • Consider our earlier example, or how pipe-and-filter architectures are made concurrent without direct user involvement

  20. Generative Technologies • With a sufficiently detailed architectural model, various implementation artifacts can be generated • Entire system implementations • Requires extremely detailed models including behavioral specifications • More feasible in domain-specific contexts • Skeletons or interfaces • With detailed structure and interface specifications • Compositions (e.g., glue code) • With sufficient data about bindings between two elements

  21. Maintaining Consistency • Strategies for maintaining one-way or round-trip mappings • Create and maintain traceability links from architectural implementation elements • Explicit links in a database, in architectural models, in code comments can all help with consistency checking • Make the architectural model part of the implementation • When the model changes, the implementation adapts automatically • May involve “internal generation” • Generate some or all of the implementation from the architecture

  22. Example Frameworks • Intended for highly distributed and dynamic systems • Many aspects shared with other styles • explicit topological rules • components • connectors • asynchronous messages • Some unique aspects • substrate independence • context-reflective connectorinterfaces A Requests Notifications B C D

  23. Framework Objectives • Traceability • Platform independence • Distribution • Dynamism • Efficiency • Observability • Extensibility

  24. Component Connector Component(name : String) Connector() Component() Connector(name : String) Component(name : String, junk : String) handle(r : Request) : void send(r : Request) : void handle(n : Notification) : void send(n : Notification) : void Architecture ConnectorThread ComponentThread Architecture() ConnectorThread(n : String) Architecture(name : String) ComponentThread() Architecture(name : String, n : int) ComponentThread(s : String) start() : void run() : void stop() : void shutdown() : void handle(r : Request) : void Message handle(n : Notification) : void addComponent(comp : Component) : void Message() addConnector(conn : Connector) : void Message(name : String) weld(conn : Connector, comp : Component) : void name() : String weld(comp : Component, conn : Connector) : void addParameter(parameterName : String, parameterValue : Object) : void weld(conn1 : Connector, conn2 : Connector) : void hasParameter(Name : String) : boolean removeComponent(comp : Component) : void removeParameter(Name : String) : void removeConnector(conn : Connector) : void getParameter(Name : String) : Object setThreadCount(n : int) : void getThreadCount() : int threadFunction() : void notifyArchitecture() : void Request Notification searchFIFO(f : SynchronizedFIFO, o : Object) : Object Request() Notification() Request(Name : String) Notification(Name : String) FrameworkAPI

  25. Message Initial Framework Design – C2 Brick Request #belongs_to Notification inputBuffer outputBuffer IPort topComponents #bottom Port Component bottomComponents Connector #top Semaphor FIFOPort topOutFilterInclude[] #sem componentList #sem #link Architecture ConnectorThread ComponentThread connectorList

  26. Evaluation of C2 • Traceability • design decisions map to style elements, rules, and rationale • Platform independence • implemented in Java JVM, C, C++, and Ada • Distribution • encapsulated inside “border connectors” • Dynamism • leverages context-reflective connectors • Efficiency • 2000 SLOC; loads in under 5KB • Observability • only by tapping into port message queues • Extensibility • only via PL mechanisms (e.g., inheritance)

  27. R Framework Optimizations – oC2 Thread Pool Component A Component B handleRequest Connector C X R R N N R R 1 1 2 2 3 send Request Component D

  28. Evaluation of oC2 • Traceability • faithful to the style’s structural, topological, and data aspects • departure from the style’s behavioral and interaction aspects • Platform independence • implemented in Java JVM, J2ME, and EVC++ • Distribution • encapsulated inside “border connectors” • Dynamism • leverages context-reflective connectors • central message queue improves control over dynamic change • Efficiency • 1800 SLOC; loads in under 1.5KB • Observability • hampered by the centralized message queue • Extensibility • hampered by the centralized message queue

  29. Framework Extensibility – xC2 ArchitectureEventConstants ConnectorThread IConnector ComponentThread #bottom #top Connector Architecture IComponent Component IArchitecture Serializable Brick +topId Message Address +bottomId Request Notification IScaffold

  30. Evaluation of xC2 • Traceability • departure from the style in implementing all of its key aspects • extensive use of OO interfaces • Platform independence • implemented in Java JVM, J2ME, EVC++, and Python • Distribution • encapsulated inside “border connectors” • Dynamism • leverages context-reflective connectors • central message queue improves control over dynamic change • supports component mobility • Efficiency • 1500 SLOC; loads in under 2.5KB • Observability • facilitated by IScaffold interfaces • Extensibility • IScaffold remove thread management from Architecture • symmetric treatment of components and connectors

  31. Evaluation • Shared API • Implementations in numerous PLs • Communication across PL implementations • Hundreds of applications built to date • Allow integration of non-C2 compliant components Two benchmarking applications • 1 component above 1 below • 50 components above 1 below • 100,000 messages • Intel Pentium III 500MHz, 256MB, • JDK 1.4 beta 2, Windows 2000

  32. Android

  33. Architectural Principles • Implicit in / imposed by Android’s Application Framework • Architecture building blocks • Hierarchical decomposition • Architectural styles • Architecture models • Implementation and deployment • Support for NFPs

  34. Architecture Building Blocks • Components • Activity – UI screen-level component • Fragment– module handling events for specific UI portion • Service– background processing • Content Provider – storage and retrieval • Broadcast receiver – message router • Connectors • Explicit Message-Based – Intent via explicit recipient • Implicit Message-Based – Intent via Intent Filter • Data Access – Content Resolver • RPC – direct method invocation using IDL stubs • Configuration • XML Manifest

  35. Hierarchical Decomposition • Top-level • Set of apps • App-level • Set of activities, services, etc. • Activity-level • Set of fragments

  36. Architectural Styles Message-based implicit invocation Message-based explicit invocation Publish-subscribe Shared state Distributed objects

  37. Implementation • Android Development Framework (ADF) • Provides base classes that are extended with app-specific logic • Activity lifecycle • Android Runtime Environment (ART) • Provides implementation of Android’s connectors

  38. Example Android App – K-9 Mail

  39. K-9 Mail App’s Architecture The app runs in its own “sandbox”

More Related