| 
									
										
										
										
											2013-03-16 08:02:16 +00:00
										 |  |  | ***************************** | 
					
						
							|  |  |  | Contributing to BYOB4 / Snap! | 
					
						
							|  |  |  | by Jens Mönig | 
					
						
							|  |  |  | last changed: 12/09/14 | 
					
						
							| 
									
										
										
										
											2013-04-09 01:49:31 +00:00
										 |  |  | ***************************** | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-03-16 08:02:16 +00:00
										 |  |  | 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 | 
					
						
							| 
									
										
										
										
											2013-04-09 01:49:31 +00:00
										 |  |  | contribution works out. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Working with changesets | 
					
						
							|  |  |  | ----------------------- | 
					
						
							| 
									
										
										
										
											2013-03-16 08:02:16 +00:00
										 |  |  | You'll often want to change or add code in existing JS files. Please don't. Instead | 
					
						
							| 
									
										
										
										
											2013-04-09 01:49:31 +00:00
										 |  |  | 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 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-03-16 08:02:16 +00:00
										 |  |  | 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 | 
					
						
							| 
									
										
										
										
											2013-04-09 01:49:31 +00:00
										 |  |  | 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 | 
					
						
							| 
									
										
										
										
											2013-03-16 08:02:16 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | If you're working on the core Morphic library you can also | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-04-09 01:49:31 +00:00
										 |  |  | 	tolerate eval | 
					
						
							| 
									
										
										
										
											2013-03-16 08:02:16 +00:00
										 |  |  | 	tolerate unfiltered for in | 
					
						
							| 
									
										
										
										
											2013-04-09 01:49:31 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-03-16 08:02:16 +00:00
										 |  |  | although you'll probably not ever going to need either EVAL or FORIN in your | 
					
						
							| 
									
										
										
										
											2013-04-09 01:49:31 +00:00
										 |  |  | changesets anyway. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-03-16 08:02:16 +00:00
										 |  |  | 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 | 
					
						
							| 
									
										
										
										
											2013-04-09 01:49:31 +00:00
										 |  |  | easily shareable among ourselves. | 
					
						
							| 
									
										
										
										
											2013-03-16 08:02:16 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 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 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-04-09 01:49:31 +00:00
										 |  |  | Testing your code | 
					
						
							|  |  |  | ------------------ | 
					
						
							| 
									
										
										
										
											2013-03-16 08:02:16 +00:00
										 |  |  | (don't worry, I'm not talking about formal UnitTest Suites or other BDSM software | 
					
						
							| 
									
										
										
										
											2013-04-09 01:49:31 +00:00
										 |  |  | fetishes, just about playing with what you're creating while you're doing it) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-03-16 08:02:16 +00:00
										 |  |  | 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 | 
					
						
							| 
									
										
										
										
											2013-04-09 01:49:31 +00:00
										 |  |  | whichever libraries are already included, so it'll actually get used. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | In your changeset override the world's | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	customMorphs | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-03-16 08:02:16 +00:00
										 |  |  | function so it returns a list of instances of your Morphs. For "Blocks.js" that | 
					
						
							| 
									
										
										
										
											2013-04-09 01:49:31 +00:00
										 |  |  | code is: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	var BlockMorph; | 
					
						
							|  |  |  | 	var ScriptsMorph; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	WorldMorph.prototype.customMorphs = function () { | 
					
						
							|  |  |  | 		var sm = new ScriptsMorph(); | 
					
						
							|  |  |  | 		sm.setExtent(new Point(800, 600)); | 
					
						
							|  |  |  | 		return [ | 
					
						
							|  |  |  | 			new BlockMorph(), | 
					
						
							|  |  |  | 			sm | 
					
						
							|  |  |  | 		]; | 
					
						
							|  |  |  | 	}; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-03-16 08:02:16 +00:00
										 |  |  | Just modify this code so it returns your list of sample Morphs instead of | 
					
						
							| 
									
										
										
										
											2013-04-09 01:49:31 +00:00
										 |  |  | BlockMorph and ScriptsMorph instances. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-03-16 08:02:16 +00:00
										 |  |  | Once you've added this code to your changeset you can open your sample html file | 
					
						
							| 
									
										
										
										
											2013-04-09 01:49:31 +00:00
										 |  |  | in your browser, and you'll find your sample Morphs in the World's DEMO menu. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Inspectors | 
					
						
							|  |  |  | ---------- | 
					
						
							| 
									
										
										
										
											2013-03-16 08:02:16 +00:00
										 |  |  | 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 | 
					
						
							| 
									
										
										
										
											2013-04-09 01:49:31 +00:00
										 |  |  | it" or "inspect it" (again, like in Squeak). | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-03-16 08:02:16 +00:00
										 |  |  | Needless to say, in the evaluation pane "this" always refers to the inspected | 
					
						
							| 
									
										
										
										
											2013-04-09 01:49:31 +00:00
										 |  |  | object. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Source Code Mgmt | 
					
						
							|  |  |  | ----------------- | 
					
						
							| 
									
										
										
										
											2013-03-16 08:02:16 +00:00
										 |  |  | 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 | 
					
						
							| 
									
										
										
										
											2013-04-09 01:49:31 +00:00
										 |  |  | frequently) be a harmonized common code base. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Thanks! | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-03-16 08:02:16 +00:00
										 |  |  | --Jens |