summaryrefslogtreecommitdiff
path: root/contributing to BYOB4.txt
diff options
context:
space:
mode:
authorjmoenig <jens@moenig.org>2013-03-16 09:02:16 +0100
committerjmoenig <jens@moenig.org>2013-03-16 09:02:16 +0100
commit0b510366d230399a38f18a8db92dd396a0dad42e (patch)
treeffb841d64bca04799ebc470701b71e59e726017e /contributing to BYOB4.txt
downloadsnap-0b510366d230399a38f18a8db92dd396a0dad42e.tar.gz
snap-0b510366d230399a38f18a8db92dd396a0dad42e.zip
Creation
Diffstat (limited to 'contributing to BYOB4.txt')
-rwxr-xr-xcontributing to BYOB4.txt173
1 files changed, 173 insertions, 0 deletions
diff --git a/contributing to BYOB4.txt b/contributing to BYOB4.txt
new file mode 100755
index 0000000..988a660
--- /dev/null
+++ b/contributing to BYOB4.txt
@@ -0,0 +1,173 @@
+*****************************
+Contributing to BYOB4 / Snap!
+by Jens Mönig
+last changed: 12/09/14
+*****************************
+
+Attached is the current development code base for BYOB4 a.k.a. Snap. It consists of
+several JavaScript, HTML and text files, and while some of it may be functional
+most parts will be in flux and subject to frequent, even fundamental modifications.
+This document lays out a few simple guidelines ensuring that collaborative code
+contribution works out.
+
+
+Working with changesets
+-----------------------
+You'll often want to change or add code in existing JS files. Please don't. Instead
+use a changeset. The way I always do it myself is to copy the empty
+
+ changeset.js
+
+file and rename it to something like
+
+ JensChangesToMorphic.js
+
+Into this file I write all the functions I want to add to Morphic. If I want to
+change a function in Morphic.js I copy it to the changeset and edit it there. Then
+I always validate the changeset with
+
+ JSLint.com
+
+Please check your code frequently with JSLint!
+
+For our Snap code set JSLint's settings to:
+
+ assume a browser
+ tolerate missing 'use strict' pragma
+
+ [4] indentation
+ [78] maximum line length
+
+If you're working on the core Morphic library you can also
+
+ tolerate eval
+ tolerate unfiltered for in
+
+although you'll probably not ever going to need either EVAL or FORIN in your
+changesets anyway.
+
+There are, of course, other tools - like JSHint and Firebug - that help you debug
+your code. Feel free to use whichever suits you best, but let's all agree on
+JSLint's (nitpicky!) formatting rules so we get code that's well readable and
+easily shareable among ourselves.
+
+
+Coding style
+------------
+Snap's codebase is both big and fast moving. We'll continue to churn out several
+builds per day for a long time, hunting bugs and adding features throughout the
+whole application. We'll also need to be able to get our heads around the whole
+codebase. Being able to read and to quickly understand the code is most important,
+much more so than mathematical elegance.
+
+Let me really stress this point: In creating Snap we're neither playing "Code Golf"
+(solving a problem using the least number of keystrokes) nor are we trying to
+outsmart Knuth. Instead we're maintaining a large number of small interchangeable
+code chunks, therefore:
+
+
+Avoid
+-----
+ * accessing the DOM
+
+ * frameworks (e.g. JQuery)
+
+ * modules and namespaces (e.g. IIFE)
+
+ - all of Snap is a single "World" with unique names for everything
+
+ - remember: Changesets contain "small interchangeable code chunks"...
+
+ * passing "thisArg" to functions like map(), filter() or forEach()
+
+ - except in call()
+ - always use "myself" to reference "this" in an outer scope instead
+
+ * meta-class systems
+
+ - use Morphic's way of creating class-like constructors instead
+
+ - initialize all attributes either in the constructor or in an init()
+ method, so you now the object's structure by casting a single look
+ upon it. Avoid adding adding attributes elsewhere, or if you do,
+ initialize them explicitly to "null" in the constructor or init()
+ code
+
+ * nested ternary operators
+
+ * RegEx
+
+ * overwriting existing definitions
+
+ - except in changesets, duh :-)
+ - create new constructors instead
+
+ * non-descriptive names for variables, functions, objects
+
+ * giant functions
+
+ - which often are "modules in disguise",
+ especially if they define local helper functions
+
+ - create a new constructor instead
+
+
+Testing your code
+------------------
+(don't worry, I'm not talking about formal UnitTest Suites or other BDSM software
+fetishes, just about playing with what you're creating while you're doing it)
+
+To test your changesets just add another line in the html stub file with your
+changeset. Make sure to put your changeset /after/ Morphic.js and Blocks.js and
+whichever libraries are already included, so it'll actually get used.
+
+In your changeset override the world's
+
+ customMorphs
+
+function so it returns a list of instances of your Morphs. For "Blocks.js" that
+code is:
+
+ var BlockMorph;
+ var ScriptsMorph;
+
+ WorldMorph.prototype.customMorphs = function () {
+ var sm = new ScriptsMorph();
+ sm.setExtent(new Point(800, 600));
+ return [
+ new BlockMorph(),
+ sm
+ ];
+ };
+
+Just modify this code so it returns your list of sample Morphs instead of
+BlockMorph and ScriptsMorph instances.
+
+Once you've added this code to your changeset you can open your sample html file
+in your browser, and you'll find your sample Morphs in the World's DEMO menu.
+
+
+Inspectors
+----------
+To actually test play with your Morphs you can right-click on them and open an
+inspector on them. You can open more than one inspector on each object. The
+inspector pretty much works the same as in Smalltalk. It even has an evaluation
+pane at the bottom, in which you can type in any JS code, mark it with your mouse
+(or select all with ctrl-a), righ-click on the selection and either "do it", "show
+it" or "inspect it" (again, like in Squeak).
+
+Needless to say, in the evaluation pane "this" always refers to the inspected
+object.
+
+
+Source Code Mgmt
+-----------------
+The good thing about changesets is that you can continue working on them regardless
+of new dev releases that happen in the meantime. When you feel you've got something
+that's finished just send me your changeset, and I'll work all the changesets into
+the Snap codebase and release another dev version. That way there will always (and
+frequently) be a harmonized common code base.
+
+Thanks!
+
+--Jens