185 lines
9.5 KiB
Plaintext
185 lines
9.5 KiB
Plaintext
@c This document is part of the GNU ease.js manual.
|
|
@c Copyright (C) 2011, 2013 Mike Gerwitz
|
|
@c Permission is granted to copy, distribute and/or modify this document
|
|
@c under the terms of the GNU Free Documentation License, Version 1.3
|
|
@c or any later version published by the Free Software Foundation;
|
|
@c with no Invariant Sections, no Front-Cover Texts, and no Back-Cover
|
|
@c Texts. A copy of the license is included in the section entitled ``GNU
|
|
@c Free Documentation License''.
|
|
|
|
@node About
|
|
@unnumbered About GNU ease.js
|
|
|
|
GNU ease.js is a classical object-oriented framework for Javascript, intended to
|
|
eliminate boilerplate code and "ease" the transition into JavaScript from other
|
|
object-oriented languages.
|
|
|
|
Current support includes:
|
|
@itemize @bullet
|
|
@item Simple and intuitive class definitions
|
|
@item Classical inheritance
|
|
@item Abstract classes and methods
|
|
@item Interfaces
|
|
@item Visibility (public, protected and private members)
|
|
@item Static, constant and final members
|
|
@end itemize
|
|
|
|
While the current focus of the project is Object-Oriented design, it is likely
|
|
that ease.js will expand to other paradigms in the future.
|
|
|
|
|
|
@section History
|
|
ease.js was initially developed for use at the author's place of employment in
|
|
order to move the familiar concept of object-oriented development over to
|
|
JavaScript for use in robust web applications. JavaScript lacks basic core
|
|
principals of object-oriented development, the most major of which is proper
|
|
encapsulation.
|
|
|
|
The library would be required to work both server and client-side, supporting
|
|
all major web browsers as far back as Internet Explorer 6. Since it would be
|
|
used in a production system and would be used to develop a core business
|
|
application, it must also work flawlessly. This meant heavy unit testing.
|
|
|
|
The solution was to develop a library that would first work server-side. The
|
|
software of choice for server-side JavaScript was @uref{http://nodejs.org,
|
|
Node.js}. Node uses the CommonJS format for modules. This provided an intuitive
|
|
means of modularizing the code without use of an Object Oriented development
|
|
style (the closest other option would be Prototypal). ease.js was first
|
|
developed to work on Node.js.
|
|
|
|
Moving the code over to the browser is not a difficult concept, since the entire
|
|
library relied only on standard JavaScript. A couple important factors had to be
|
|
taken into account, mainly that CommonJS modules don't simply ``work''
|
|
client-side without some type of wrapper, not all browsers support ECMAScript 5
|
|
and the assertion system used for tests is a Node.js module.
|
|
|
|
This involved writing a simple script to concatenate all the modules and
|
|
appropriately wrap them in closures, thereby solving the CommonJS issue. The
|
|
required assertions were ported over to the client. The only issue was then
|
|
ECMAScript 5 support, which with a little thought, the browser could gracefully
|
|
fall back on by sacrificing certain features but leaving the core functionality
|
|
relatively unscathed. This provides a proper cross-browser implementation and,
|
|
very importantly, allows the unit tests to be run both server and client side.
|
|
One can then be confident that ease.js will operate on both the server and a
|
|
wide range of web browsers without having to maintain separate tests for each.
|
|
|
|
Needless to say, the development was successful and the project has been used in
|
|
production long before v0.1.0-pre was even conceived. It was thought at the
|
|
beginning of the project that versions would be unnecessary, due to its relative
|
|
simplicity and fairly basic feature set. The project has since evolved past its
|
|
original specification and hopes to introduce a number of exciting features in
|
|
the future.
|
|
|
|
The project is owned and developed independently by Mike Gerwitz. There is no
|
|
ownership by his employer.
|
|
|
|
On 22 December 2013, ease.js officially became a part of GNU with the kind help
|
|
and supervision of Brandon Invergo.
|
|
|
|
|
|
@section Why ease.js?
|
|
There already exists a number of different ways to accomplish inheritance and
|
|
various levels of encapsulation in JavaScript. Why ease.js? Though a number of
|
|
frameworks did provide class-like definitions, basic inheritance and other minor
|
|
feature sets, none of them seemed to be an all-encompassing solution to providing
|
|
a strong framework for Object-Oriented development in JavaScript.
|
|
|
|
ease.js was first inspired by John Resig's post on "Simple JavasScript
|
|
Inheritance"@footnote{John's blog post is available at
|
|
@uref{http://ejohn.org/blog/simple-javascript-inheritance/}.}. This very basic
|
|
example provided a means to define a ``class'' and extend it. It used a
|
|
PHP-style constructor and was intuitive to use. Though it was an excellent
|
|
alternative to defining and inheriting classes by working directly with
|
|
prototypes, it was far from a solid solution. It lacked abstract methods,
|
|
interfaces, encapsulation (visibility) and many other important features.
|
|
Another solution was needed.
|
|
|
|
Using John's example as a base concept, ease.js was developed to address those
|
|
core issues. Importantly, the project needed to fulfill the following goals:
|
|
|
|
@table @strong
|
|
@item Intuitive Class Definitions
|
|
Users of Object-Oriented languages are used to a certain style of class
|
|
declaration that is fairly consistent. Class definitions within the framework
|
|
should be reflective of this. A programmer familiar with Object-Oriented
|
|
development should be able to look at the code and clearly see what the class is
|
|
doing and how it is defined.
|
|
|
|
@item Encapsulation
|
|
The absolute most important concept that ease.js wished to address was that of
|
|
encapsulation. Encapsulation is one of the most important principals of
|
|
Object-Oriented development. This meant implementing a system that would not
|
|
only support public and private members (which can be done conventionally in
|
|
JavaScript through ``privileged members''), but must also support
|
|
@emph{protected} members. Protected members have long been elusive to JavaScript
|
|
developers.
|
|
|
|
@item Interfaces / Abstract Classes
|
|
Interfaces and Abstract Classes are a core concept and facilitate code reuse and
|
|
the development of consistent APIs. They also prove to be very useful for
|
|
polymorphism. Without them, we must trust that the developer has implemented the
|
|
correct API. If not, it will likely result in confusing runtime errors.
|
|
We also cannot ensure an object is passed with the expected API through the use
|
|
of polymorphism.
|
|
|
|
@item Inheritance
|
|
Basic inheritance can be done through use of prototype chains. However, the
|
|
above concepts introduce additional complications. Firstly, we must be able to
|
|
implement interfaces. A simple prototype chain cannot do this (an object cannot
|
|
have multiple prototypes). Furthermore, protected members must be inherited by
|
|
subtypes, while making private members unavailable. In the future, when traits
|
|
are added to the mix, we run into the same problem as we do with interfaces.
|
|
|
|
@item CommonJS, Server and Client
|
|
The framework would have to be used on both the server and client. Server-side,
|
|
@uref{http://nodejs.org, Node.js} was chosen. It used a CommonJS format for
|
|
modules. In order to get ease.js working client side, it would have to be
|
|
wrapped in such a way that the code could remain unchanged and still operate the
|
|
same. Furthermore, all tests written for the framework would have to run both
|
|
server and client-side, ensuring a consistent experience on the server and
|
|
across all supported browsers. Support would have to go as far back as Internet
|
|
Explorer 6 to support legacy systems.
|
|
|
|
@item Performance
|
|
Everyone knows that Object-Oriented programming incurs a performance hit in
|
|
return for numerous benefits. ease.js is not magic; it too would incur a
|
|
performance it. This hit must be low. Throughout the entire time the software is
|
|
running, the hit must be low enough that it is insignificant (less than 1% of
|
|
the total running time). This applies to any time the framework is used - from
|
|
class creation to method invocation.
|
|
|
|
@item Quality Design
|
|
A quality design for the system is important for a number of reasons. This
|
|
includes consistency with other languages and performance considerations. It
|
|
must also be easily maintainable and extensible. Object-Oriented programming is
|
|
all about @emph{restricting} what the developer can do. It is important to do so
|
|
properly and ensure it is consistent with other languages. If something is
|
|
inconsistent early on, and that inconsistency is adopted throughout a piece of
|
|
software, fixing the inconsistency could potentially result in breaking the
|
|
software.
|
|
|
|
@item Heavily Tested
|
|
The framework would be used to develop critical business applications. It needed
|
|
to perform flawlessly. A bug could potentially introduce flaws into the entire
|
|
system. Furthermore, bugs in the framework could create a debugging nightmare,
|
|
with developers wondering if the flaw exists in their own software or the
|
|
framework. This is a framework that would be very tightly coupled with the
|
|
software built atop of it. In order to ensure production quality, the framework
|
|
would have to be heavily tested. As such, a test-driven development cycle is
|
|
preferred.
|
|
|
|
@item Well Documented
|
|
The framework should be intuitive enough that documentation is generally
|
|
unneeded, but in the event the developer does need help in implementing the
|
|
framework in their own software, the help should be readily available. Wasting
|
|
time attempting to figure out the framework is both frustrating and increases
|
|
project cost.
|
|
|
|
@end table
|
|
|
|
The above are the main factors taken into consideration when first developing
|
|
ease.js. There were no existing frameworks that met all of the above criteria.
|
|
Therefore, it was determined that ease.js was a valid project that addressed
|
|
genuine needs for which there was no current, all-encompassing solution.
|
|
|