* move stuff in here * reorganizing because zx needs to feel special * add base58/base64 explainer draft
3.5 KiB
Style Guide
-
Generally, try to write TypeScript that is more like Erlang and less like Javascript
-
Code is read more often than it is written. So be kind to people reading the code. Make it obvious and simple.
-
All of these rules are fuzzy and there are times where it is good or necessary to break them. You're an adult, use your best judgment.
-
It's OK to write code with a larger number of lines if the result is code that is more readable.
-
Don't try to be l33t. Boring code is best
-
Don't sacrifice readability for "performance". It's far easier to optimize inefficient/correct code than to correct efficient/incorrect code.
-
It should be simple. It should just work. And it should be obvious to anyone reading the code why it works.
-
Prefer
letovervarorconst -
Avoid taking advantage of mutability. A recursive function is usually better than a loop
- Put your "this does stuff" code in a function called
mainand then call it.
// no
do_something();
do_something_else();
// yes
function main()
{
do_something();
do_something_else();
}
main();
- Every
ifshould have anelse
// no
function foo(bar)
{
if (some_condition(bar))
{
return;
}
do_something();
do_something_else();
}
// yes
function foo(bar)
{
if (some_condition(bar))
{
return;
}
else
{
do_something();
do_something_else();
}
}
-
Avoid hidden state like the plague (this means don't make objects; use records instead). All of your ingredients should be declared visually near where they are used.
This means no oopy jogger jizz, "stamps", etc
-
Every function should have a unique name so that someone unfamiliar with the codebase can
grep -rn function_nameand find it immediately -
Do not use the ternary operator
returnValue = condition ? ifTrue : else. It's just obnoxious (most of the time) -
In general, avoid binary operators. If you must use them, don't be niggardly with parentheses. Disambiguating infix precedence is a nightmare.
-
Inequalities should follow the left-to-right orientation of the number line
// cringe
let x = y > z;
// based
let x = z < y;
-
Don't assume the person reading the code is a domain expert in JavaScript. Avoid using weird JS syntax or runtime quirks.
-
If you must, put weird things in variables or functions that have a semantic name
// wat
if (window == window.parent)
{
...
}
else
{
...
}
// obvious
let we_are_executing_this_in_a_browser = (window == window.parent);
if (we_are_executing_this_in_a_browser)
{
...
}
else
{
...
}
-
Names should be in
snake_case -
Indentation is 4 spaces
-
Align things that deserve to be aligned
function foo(bar : x,
baz : y,
quux : z)
{
}
- Open and close braces should align vertically so someone reading can just scan to find the other delimiter.
// yuck
if (condition) {
...
} else if (some_other_condition) {
...
} else {
...
}
// nice
// it's easy for a reader to visually match the open/close braces,
// and then to look at the line immediately above the opening brace
// to see what the code block corresponds to
if (condition)
{
...
}
else if (some_other_condition)
{
...
}
else
{
...
}
-
Avoid sawtoothy code with a lot of nesting. If you're writing sawtoothy code, you should probably factor it into many simple functions.
-
It is much easier to understand 20 simple functions than 1 complicated function.