Deprecating the Observer Pattern with Scala.React EPFL-REPORT-176887

Total Page:16

File Type:pdf, Size:1020Kb

Deprecating the Observer Pattern with Scala.React EPFL-REPORT-176887 Deprecating the Observer Pattern with Scala.React EPFL-REPORT-176887 Ingo Maier Martin Odersky EPFL {firstname}.{lastname}@epfl.ch Abstract path object from mouse movements during a drag operation Programming interactive systems by means of the observer and displays it on the screen. For brevity, we use Scala clo- pattern is hard and error-prone yet is still the implementation sures as observers. standard in many production environments. We show how var path: Path = null to integrate different reactive programming abstractions into val moveObserver = { (event: MouseEvent) => a single framework that help migrate from observer-based path.lineTo(event.position) event handling logic to more declarative implementations. draw(path) Our central API layer embeds an extensible higher-order } data-flow DSL into our host language. This embedding is control.addMouseDownObserver { event => enabled by a continuation passing style transformation. path = new Path(event.position) control.addMouseMoveObserver(moveObserver) General Terms Design, Languages } Keywords data-flow language, reactive programming, user control.addMouseUpObserver { event => interface programming, Scala control.removeMouseMoveObserver(moveObserver) path.close() 1. Introduction draw(path) We are seeing a continuously increasing demand in inter- } active applications, driven by a growing number of non- expert computer users. In contrast to traditional batch mode The above example, and as we will argue the observer programs, interactive applications require a considerable pattern as generally defined in [25], encourages one to vio- amount of engineering to deal with continuous user input late an impressive line-up of important software engineering and output. Yet, our programming models for user inter- principles: faces and other kinds of continuous state interactions have Side-effects Observers promote side-effects on the API not changed much. The predominant approach to deal with level. state changes in production software is still the observer Encapsulation Multiple observers are often needed to sim- pattern [25]. For an answer on whether it is actually worth ulate a state machine as in the drag example. The state is bothering we quote an Adobe presentation from 2008 [37] stored in variables (such as path above) that are visible to on the status of current production systems: all involved observers. For practical reasons, these vari- • 1/3 of the code in Adobe’s desktop applications is de- ables are often placed in a broader scope were it can be voted to event handling misused by unrelated code. • 1/2 of the bugs reported during a product cycle exist in Composability Multiple observers, dealing with a single this code concern such as a drag operation, form a loose collection We believe these numbers are bad not only because of the of objects that are installed at different points at different number of bugs is disproportional. We also believe that event times. Therefore, we cannot, e.g., easily add or remove handling code should account for a smaller fraction and that drag behavior. the way to achieve this is to provide better event handling Resource management An observer’s life-time needs to be abstractions. To illustrate the concrete problems of the ob- managed explicitly. For performance reasons, we want to server pattern, we start with a simple and ubiquitous exam- observe mouse move events only during a drag operation. ple: mouse dragging. The following example constructs a Therefore, we need to explicitly install and uninstall the 1 2012/5/4 mouse move observer and we need to remember the sub- • We extend Scala with a typed higher-order reactive pro- ject (point of installation). gramming library that allows to combine reactive pro- Separation of concerns The observers from our example gramming both in a functional as well as in impera- not only trace the mouse path but also call a draw- tive style. We show how these abstraction integrate with ing command, or more generally, include two different Scala’s object system and how the trait concept simplifies concerns in the same code location. It is often prefer- binding observer-based interfaces to our reactive abstrac- able to separate the concerns of constructing the path tions. and displaying it, e.g., as in the model-view-controller • We show how to incorporate a synchronous data-flow (MVC) [31] pattern. language similar to Esterel [6], but extended to a multi- Data consistency We can achieve a separation of concerns valued domain and with higher-order features, into our with a path that itself publishes events when it changes. reactive framework. Unfortunately, there is no guarantee for data consistency • We present an approach based on traits and weak refer- in the observer pattern. Suppose we create a rectangle ences that automatically binds the life-time of observers that represents the bounds of our path, i.e., a publisher to an enclosing object, eliminating a common source of that depends on changes in our original path. Also con- memory leaks in observer-based and reactive program- sider an observer listening to changes in both the path and ming. its bounds in order to draw a framed path. This observer • We show how to implement our language as a library needs to track explicitly whether the bounds are already in terms of a dependency stack, closures and delimited updated and, if not, defer the drawing operation. Other- continuations. In contrast to previous similar systems, our wise the user could observe a frame on the screen that has implementation is agnostic of any host language feature, the wrong size, which is an example of a glitch. and treats every expression uniformly, no matter whether Uniformity Different methods to install different observers built-in or user-defined, including function application, decrease code uniformity. conditionals, loops, exceptions and custom control flow Abstraction The observer pattern promotes the use of heavy- operators, without special treatment by a macro system weight interfaces. The example relies on a control class or explicit lifting. that often defines a much larger interface than a method • We present and analyze performance results of different to install mouse event observers. Therefore, we cannot implementation approaches in Scala.React and present abstract over event sources individually. For instance, we the first performance comparison of two related reac- could let the user abort a drag operation by hitting any tive libraries on different, production quality platforms. predefined key or use a different pointer device such as a In order to obtain meaningful results, we measure per- touch screen or graphics tablet. formance of reactive implementations relative to corre- Semantic distance The example is hard to understand be- sponding observer-based implementations on the same cause the control flow is inverted which results in much platform. We analyze existing functional reactive pro- boilerplate code and increases the semantic distance be- grams and propose favorable solutions using alternative tween the programmers intention and the actual code. abstractions in Scala.React. Mouse dragging is just an example of the more general Although our running example is drawn from user inter- set of input gesture recognition. If we further generalize this face programming, Scala.React can also be used for a many to event sequence recognition with (bounded or unbounded) other event processing domains, such as financial engineer- loops, all the problems we mentioned above still remain. ing, industrial control systems, automatic patient supervi- Many examples in user interface programming are therefore sion, RFID tracking or robotics. equally hard to implement with observers, such as selecting a set of items, stepping through a series of dialogs, editing and marking text – essentially every operation where the user 2. Event streams: a uniform interface for goes through a number of steps. composable events As a first step to simplify event logic we introduce a gen- 1.1 Contributions and Overview eral event interface, addressing the issues of uniformity and We present Scala.React, a library of composable, discrete abstraction from above. A third aspect to this is reusability: reactive programming abstractions that provides several API by hiding event propagation and observer handling behind a layers to allow programmers to stepwise migrate from an general interface, clients can easily publish events for their observer-based to a reactive data-flow programming model own data structures. We introduce a class EventSource[A], that eventually addresses all of the issues raised above. Our which represents generic sources of events of type A. We can contributions are in particular: schedule an event source to emit a value at any time. Here 2 2012/5/4 is how we create an event source of integers and emit two Propagation in Scala.React acts in turns, i.e., emits all pend- events:1 ing changes before it proceeds to the next turn. It is impossi- val es = new EventSource[Int] ble to start a turn before the previous one has finished, which es emit 1; es emit 2 is important to ensure the absence of glitches. Since propa- gation is also synchronous, we can have event streams emit- We can print all events from our event source to the console ting values simultaneously. The given merge operator is bi- as follows: ased towards the receiver, i.e., if event streams a and b emit val ob = observe(es) { x => println("Receiving " + x) } simultaneously, a merge b emits the event from a. We will discuss details of our propagation model in more detail be- Method observe takes event stream es and a closure that low. accepts event values x from es. The resulting observer ob We say that the newly created event stream depends on can be disposed by a single method call to ob.dispose(), the arguments of the merge operator; together they are part which uninstalls ob from all sources. Unlike in the traditional of a larger dependency graph as we will see shortly.
Recommended publications
  • An Empirical Study on Program Comprehension with Reactive Programming
    Jens Knoop, Uwe Zdun (Hrsg.): Software Engineering 2016, Lecture Notes in Informatics (LNI), Gesellschaft fur¨ Informatik, Bonn 2016 69 An Emirical Study on Program Comrehension with Reactive Programming Guido Salvaneschi, Sven Amann, Sebastian Proksch, and Mira Mezini1 Abstract: Starting from the first investigations with strictly functional languages, reactive programming has been proposed as the programming paradigm for reactive applications. The advantages of designs based on this style overdesigns based on the Observer design pattern have been studied for along time. Over the years, researchers have enriched reactive languages with more powerful abstractions, embedded these abstractions into mainstream languages –including object-oriented languages –and applied reactive programming to several domains, likeGUIs, animations, Webapplications, robotics, and sensor networks. However, an important assumption behind this line of research –that, beside other advantages, reactive programming makes awide class of otherwise cumbersome applications more comprehensible –has neverbeen evaluated. In this paper,wepresent the design and the results of the first empirical study that evaluates the effect of reactive programming on comprehensibility compared to the traditional object-oriented style with the Observer design pattern. Results confirm the conjecture that comprehensibility is enhanced by reactive programming. In the experiment, the reactive programming group significantly outperforms the other group. Keywords: Reactive Programming, Controlled
    [Show full text]
  • The Future of Embedded Software
    The Future of Embedded Software Edward A. Lee Professor, Chair of EE, and Associate Chair of EECS UC Berkeley ARTEMIS 2006 Annual Conference Graz, Austria May 22-24, 2006 Why Embedded Software? Why Now? “Information technology (IT) is on the verge of another revolution. Driven by the increasing capabilities and ever declining costs of computing and communications devices, IT is being embedded into a growing range of physical devices linked together through networks and will become ever more pervasive as the component technologies become smaller, faster, and cheaper... These networked systems of embedded computers ... have the potential to change radically the way people interact with their environment by linking together a range of devices and sensors that will allow information to be collected, shared, and processed in unprecedented ways. ... The use of [these embedded computers] throughout society could well dwarf previous milestones in the information revolution.” National Research Council Report Embedded Everywhere Lee, Berkeley 2 The Key Obstacle to Progress: Gap Between Systems and Computing | Traditional dynamic systems theory needs to adapt to better account for the behavior of software and networks. | Traditional computer science needs to adapt to embrace time, concurrency, and the continuum of physical processes. Lee, Berkeley 3 The Next Systems Theory: Simultaneously Physical and Computational The standard model: Embedded software is software on small computers. The technical problem is one of optimization (coping with limited resources). The Berkeley model: Embedded software is software integrated with physical processes. The technical problem is managing time and concurrency in computational systems. Lee, Berkeley 4 Obstacles in Today’s Technology: Consider Real Time Electronics Technology Delivers Timeliness… … and the overlaying software abstractions discard it.
    [Show full text]
  • What Is Spring Framework?
    Software Engineering a.a. 2019-2020 Introduction to Spring Framework Prof. Luca Mainetti Università del Salento Roadmap ■ Introduction to Spring ■ Dependency Injection and IoC ■ Bean ■ AoP ■ Module Architecture Introduction to Spring Framework 2 Luca Mainetti What Is Spring Framework? ■ Spring is the most popular application development framework for Java enterprise ■ Open source Java platform since 2003. ■ Spring supports all main application servers and JEE standards ■ Spring handles the infrastructure so you can focus on your application ■ Current version: 5.0.X Introduction to Spring Framework 3 Luca Mainetti What does Spring offer? ■ Dependency Injection – Also known as IoC (Inversion of Control) ■ Aspect Oriented Programming – Runtime injection-based ■ Portable Service Abstractions – The rest of spring • ORM, DAO, Web MVC, Web, etc. • Allows access to these without knowing how they actually work Introduction to Spring Framework 4 Luca Mainetti Dependency Injection ■ The technology that actually defines Spring (Heart of Spring). ■ Dependency Injection helps us to keep our classes as indepedent as possible. – Increase reuse by applying low coupling – Easy testing – More understandable An injection is the passing of a dependency (a service) to a dependent object (a client). Passing the service to the client, rather than allowing a client to build or find the service, is the fundamental requirement of the pattern. Introduction to Spring Framework 5 Luca Mainetti Dependency Injection and Inversion of Control (IoC) In software engineering, inversion of control (IoC) describes a design in which custom-written portions of a computer program receive the flow of control from a generic, reusable library. ■ The Inversion of Control (IoC) is a general concept, and it can be expressed in many different ways and dependency Injection is merely one concrete example of Inversion of Control.
    [Show full text]
  • Ioc Containers in Spring
    301AA - Advanced Programming Lecturer: Andrea Corradini [email protected] http://pages.di.unipi.it/corradini/ AP-2018-11: Frameworks and Inversion of Control Frameworks and Inversion of Control • Recap: JavaBeans as Components • Frameworks, Component Frameworks and their features • Frameworks vs IDEs • Inversion of Control and Containers • Frameworks vs Libraries • Decoupling Components • Dependency Injection • IoC Containers in Spring 2 Components: a recap A software component is a unit of composition with contractually specified interfaces and explicit context dependencies only. A software component can be deployed independently and is subject to composition by third party. Clemens Szyperski, ECOOP 1996 • Examples: Java Beans, CLR Assemblies • Contractually specified interfaces: events, methods and properties • Explicit context dependencies: serializable, constructor with no argument • Subject to composition: connection to other beans – Using connection oriented programming (event source and listeners/delegates) 3 Towards Component Frameworks • Software Framework: A collection of common code providing generic functionality that can be selectively overridden or specialized by user code providing specific functionality • Application Framework: A software framework used to implement the standard structure of an application for a specific development environment. • Examples: – GUI Frameworks – Web Frameworks – Concurrency Frameworks 4 Examples of Frameworks Web Application Frameworks GUI Toolkits 5 Examples: General Software Frameworks – .NET – Windows platform. Provides language interoperability – Android SDK – Supports development of apps in Java (but does not use a JVM!) – Cocoa – Apple’s native OO API for macOS. Includes C standard library and the Objective-C runtime. – Eclipse – Cross-platform, easily extensible IDE with plugins 6 Examples: GUI Frameworks • Frameworks for Application with GUI – MFC - Microsoft Foundation Class Library.
    [Show full text]
  • Framework Overview with UML Diagrams
    Framework Overview with UML Diagrams Learn to Build Robust, Scalable and Maintainable Applications using PureMVC Framework Overview This document discusses the classes and interfaces of the PureMVC framework; illustrating their roles, responsibilities and collaborations with simple UML (Unified Modeling Language) diagrams. The PureMVC framework has a very narrow goal. That is to help you separate your application’s coding concerns into three discrete tiers; Model, View and Controller. In this implementation of the classic MVC design meta-pattern, the application tiers are represented by three Singletons (a class where only one instance may be created). A fourth Singleton, the Façade, simplifies development by providing a single interface for communications throughout the application. The Model caches named references to Proxies, which expose an API for manipulating the Data Model (including data retrieved from remote services). The View primarily caches named references to Mediators, which adapt and steward the View Components that make up the user interface. The Controller maintains named mappings to Command classes, which are stateless, and only created when needed. The Façade initializes and caches the Core actors (Model, View and Controller), and provides a single place to access all of their public methods. AUTHOR: Cliff Hall <[email protected]> LAST MODIFIED: 3/05/2008 Façade and Core The Façade class makes it possible for the Proxies, Mediators and Commands that make up most of our final application to talk to each other in a loosely coupled way, without having to import or work directly with the Core framework actors. When we create a concrete Façade implementation for our application, we are able to use the Core actors ‘out of the box’, incidental to our interaction with the Façade, minimizing the amount of API knowledge the developer needs to have to be successful with the framework.
    [Show full text]
  • Object-Oriented Analysis, Design and Implementation
    Undergraduate Topics in Computer Science Brahma Dathan Sarnath Ramnath Object-Oriented Analysis, Design and Implementation An Integrated Approach Second Edition Undergraduate Topics in Computer Science Undergraduate Topics in Computer Science (UTiCS) delivers high-quality instruc- tional content for undergraduates studying in all areas of computing and information science. From core foundational and theoretical material to final-year topics and applications, UTiCS books take a fresh, concise, and modern approach and are ideal for self-study or for a one- or two-semester course. The texts are all authored by established experts in their fields, reviewed by an international advisory board, and contain numerous examples and problems. Many include fully worked solutions. More information about this series at http://www.springer.com/series/7592 Brahma Dathan • Sarnath Ramnath Object-Oriented Analysis, Design and Implementation An Integrated Approach Second Edition 123 Brahma Dathan Sarnath Ramnath Department of Information and Computer Department of Computer Science Science and Information Technology Metropolitan State University St. Cloud State University St. Paul, MN St. Cloud, MN USA USA Series editor Ian Mackie Advisory Board Samson Abramsky, University of Oxford, Oxford, UK Karin Breitman, Pontifical Catholic University of Rio de Janeiro, Rio de Janeiro, Brazil Chris Hankin, Imperial College London, London, UK Dexter Kozen, Cornell University, Ithaca, USA Andrew Pitts, University of Cambridge, Cambridge, UK Hanne Riis Nielson, Technical University of Denmark, Kongens Lyngby, Denmark Steven Skiena, Stony Brook University, Stony Brook, USA Iain Stewart, University of Durham, Durham, UK A co-publication with the Universities Press (India) Private Ltd., licensed for sale in all countries outside of India, Pakistan, Bhutan, Bangladesh, Sri Lanka, Nepal, The Maldives, Middle East, Malaysia, Indonesia and Singapore.
    [Show full text]
  • Flapjax: Functional Reactive Web Programming
    Flapjax: Functional Reactive Web Programming Leo Meyerovich Department of Computer Science Brown University [email protected] 1 People whose names should be before mine. Thank you to Shriram Krishnamurthi and Gregory Cooper for ensuring this project’s success. I’m not sure what would have happened if not for the late nights with Michael Greenberg, Aleks Bromfield, and Arjun Guha. Peter Hopkins, Jay McCarthy, Josh Gan, An- drey Skylar, Jacob Baskin, Kimberly Burchett, Noel Welsh, and Lee Butterman provided invaluable input. While not directly involved with this particular project, Kathi Fisler and Michael Tschantz have pushed me along. 1 Contents 4.6. Objects and Collections . 32 4.6.1 Delta Propagation . 32 1. Introduction 3 4.6.2 Shallow vs Deep Binding . 33 1.1 Document Approach . 3 4.6.3 DOM Binding . 33 2. Background 4 4.6.4 Server Binding . 33 2.1. Web Programming . 4 4.6.5 Disconnected Nodes and 2.2. Functional Reactive Programming . 5 Garbage Collection . 33 2.2.1 Events . 6 2.2.2 Behaviours . 7 4.7. Evaluations . 34 2.2.3 Automatic Lifting: Transparent 4.7.1 Demos . 34 Reactivity . 8 4.7.2 Applications . 34 2.2.4 Records and Transparent Reac- 4.8 Errors . 34 tivity . 10 2.2.5 Behaviours and Events: Conver- 4.9 Library vs Language . 34 sions and Event-Based Derivation 10 4.9.1 Dynamic Typing . 34 4.9.2 Optimization . 35 3. Implementation 11 3.1. Topological Evaluation and Glitches . 13 4.9.3 Components . 35 3.1.1 Time Steps . 15 4.9.4 Compilation .
    [Show full text]
  • The Problem with Threads
    The Problem With Threads Edward A. Lee Robert S. Pepper Distinguished Professor and Chair of EECS UC Berkeley -and - Senior Technical Adviser, director, and co-founder of BDTI Class #: ESC-211 Embedded Systems Conference (ESC) Tuesday, 3 April 2007 Concurrency in Software Practice, As of 2007 | Component technologies z Objects in C++, C#, or Java z Wrappers as service definitions | Concurrency z Threads (shared memory, semaphores, mutexes, …) z Message Passing (synchronous or not, buffered, …) | Distributed computing z Distributed objects wrapped in web services, Soap, CORBA, DCOM, … Lee, Berkeley & BDTI 2 z1 Observations Threads and objects dominate SW engineering. z Threads: Sequential computation with shared memory. z Objects: Collections of state variables with procedures for observing and manipulating that state. Even distributed objects create the illusion of shared memory through proxies. z The components (objects) are (typically) not active. z Threads weave through objects in unstructured ways. z This is the source of many software problems. Lee, Berkeley & BDTI 3 The Buzz “Multicore architectures will (finally) bring parallel computing into the mainstream. To effectively exploit them, legions of programmers must emphasize concurrency.” The vendor push: “Please train your computer science students to do extensive multithreaded programming.” Lee, Berkeley & BDTI 4 z2 Is this a good idea? Lee, Berkeley & BDTI 5 My Claim Nontrivial software written with threads, semaphores, and mutexes are incomprehensible to humans. Lee, Berkeley & BDTI 6 z3 To Examine the Problems With Threads and Objects, Consider a Simple Example “The Observer pattern defines a one-to-many dependency between a subject object and any number of observer objects so that when the subject object changes state, all its observer objects are notified and updated automatically.” Design Patterns, Eric Gamma, Richard Helm, Ralph Johnson, John Vlissides (Addison-Wesley Publishing Co., 1995.
    [Show full text]
  • Inversion of Control in Spring – Using Annotation
    Inversion of Control in Spring – Using Annotation In this chapter, we will configure Spring beans and the Dependency Injection using annotations. Spring provides support for annotation-based container configuration. We will go through bean management using stereotypical annotations and bean scope using annotations. We will then take a look at an annotation called @Required, which allows us to specify which dependencies are actually required. We will also see annotation-based dependency injections and life cycle annotations. We will use the autowired annotation to wire up dependencies in the same way as we did using XML in the previous chapter. You will then learn how to add dependencies by type and by name. We will also use qualifier to narrow down Dependency Injections. We will also understand how to perform Java-based configuration in Spring. We will then try to listen to and publish events in Spring. We will also see how to reference beans using Spring Expression Language (SpEL), invoke methods using SpEL, and use operators with SpEL. We will then discuss regular expressions using SpEL. Spring provides text message and internationalization, which we will learn to implement in our application. Here's a list of the topics covered in this chapter: • Container configuration using annotations • Java-based configuration in Spring • Event handling in Spring • Text message and internationalization [ 1 ] Inversion of Control in Spring – Using Annotation Container configuration using annotation Container configuration using Spring XML sometimes raises the possibility of delays in application development and maintenance due to size and complexity. To solve this issue, the Spring Framework supports container configuration using annotations without the need of a separate XML definition.
    [Show full text]
  • Monadic Functional Reactive Programming
    Monadic Functional Reactive Programming Atze van der Ploeg Centrum Wiskunde & Informatica [email protected] Abstract FRP is based on the notion of a reactive computation: a monadic Functional Reactive Programming (FRP) is a way to program reac- computation which may require the occurrence of external events tive systems in functional style, eliminating many of the problems to continue. The Monadic FRP variant of a signal is a signal that arise from imperative techniques. In this paper, we present an computation: a reactive computation that may also emit values alternative FRP formulation that is based on the notion of a reac- during the computation. tive computation: a monadic computation which may require the This novel formulation has two differences with other FRP occurrence of external events to continue. A signal computation approaches: is a reactive computation that may also emit values. In contrast to • In contrast to signals in other FRP formulations, signal compu- signals in other FRP formulations, signal computations can end, tations can end. This leads to a simple, monadic interface for leading to a monadic interface for sequencing behavioral changes. sequencing behavioral changes. This interface has several advantages: routing is implicit, sequencing • behaviors is easier and more intuitive than the switching combina- In other FRP approaches, either the entire FRP expression is tors found in other FRP approaches, and dynamic lists require much re-evaluated on each external stimulus, or impure techniques less boilerplate code. In other FRP approaches, either the entire are used to prevent redundant re-computations: re-computing FRP expression is re-evaluated on each external stimulus, or impure the current value of signal while the input it depends on has not techniques are used to prevent redundant re-computations.
    [Show full text]
  • Design Patterns in Ocaml
    Design Patterns in OCaml Antonio Vicente [email protected] Earl Wagner [email protected] Abstract The GOF Design Patterns book is an important piece of any professional programmer's library. These patterns are generally considered to be an indication of good design and development practices. By giving an implementation of these patterns in OCaml we expected to better understand the importance of OCaml's advanced language features and provide other developers with an implementation of these familiar concepts in order to reduce the effort required to learn this language. As in the case of Smalltalk and Scheme+GLOS, OCaml's higher order features allows for simple elegant implementation of some of the patterns while others were much harder due to the OCaml's restrictive type system. 1 Contents 1 Background and Motivation 3 2 Results and Evaluation 3 3 Lessons Learned and Conclusions 4 4 Creational Patterns 5 4.1 Abstract Factory . 5 4.2 Builder . 6 4.3 Factory Method . 6 4.4 Prototype . 7 4.5 Singleton . 8 5 Structural Patterns 8 5.1 Adapter . 8 5.2 Bridge . 8 5.3 Composite . 8 5.4 Decorator . 9 5.5 Facade . 10 5.6 Flyweight . 10 5.7 Proxy . 10 6 Behavior Patterns 11 6.1 Chain of Responsibility . 11 6.2 Command . 12 6.3 Interpreter . 13 6.4 Iterator . 13 6.5 Mediator . 13 6.6 Memento . 13 6.7 Observer . 13 6.8 State . 14 6.9 Strategy . 15 6.10 Template Method . 15 6.11 Visitor . 15 7 References 18 2 1 Background and Motivation Throughout this course we have seen many examples of methodologies and tools that can be used to reduce the burden of working in a software project.
    [Show full text]
  • Characterizing Callbacks in Javascript
    Don’t Call Us, We’ll Call You: Characterizing Callbacks in JavaScript Keheliya Gallaba Ali Mesbah Ivan Beschastnikh University of British Columbia University of British Columbia University of British Columbia Vancouver, BC, Canada Vancouver, BC, Canada Vancouver, BC, Canada [email protected] [email protected] [email protected] Abstract—JavaScript is a popular language for developing 1 var db = require(’somedatabaseprovider’); web applications and is increasingly used for both client-side 2 http.get(’/recentposts’, function(req, res){ and server-side application logic. The JavaScript runtime is 3 db.openConnection(’host’, creds, function(err, conn){ inherently event-driven and callbacks are a key language feature. 4 res.param[’posts’]. forEach(function(post) { 5 conn.query(’select * from users where id=’ + post Unfortunately, callbacks induce a non-linear control flow and can [’user’], function(err, results){ be deferred to execute asynchronously, declared anonymously, 6 conn.close(); and may be nested to arbitrary levels. All of these features make 7 res.send(results[0]); callbacks difficult to understand and maintain. 8 }); 9 }); We perform an empirical study to characterize JavaScript 10 }); callback usage across a representative corpus of 138 JavaScript 11 }); programs, with over 5 million lines of JavaScript code. We Listing 1. A representative JavaScript snippet illustrating the comprehension find that on average, every 10th function definition takes a and maintainability challenges associated with nested, anonymous callbacks callback argument, and that over 43% of all callback-accepting and asynchronous callback scheduling. function callsites are anonymous. Furthermore, the majority of callbacks are nested, more than half of all callbacks are asynchronous, and asynchronous callbacks, on average, appear more frequently in client-side code (72%) than server-side (55%).
    [Show full text]