Skip to content

Instantly share code, notes, and snippets.

@tmbtech
Forked from leonyu/coding-styles.md
Created May 16, 2016 20:02
Show Gist options
  • Select an option

  • Save tmbtech/694bdfdc0eede7a6bbcc5c0a9d65df77 to your computer and use it in GitHub Desktop.

Select an option

Save tmbtech/694bdfdc0eede7a6bbcc5c0a9d65df77 to your computer and use it in GitHub Desktop.
  • All implementations assume console.log is a static function with side-effect.
  • All implementations assume HELLO_WORLD is a constant and does not need to be abstracted and does not need to be passed in as an argument.

Declarative

const HelloWorld = (<div>{HELLO_WORLD}</div>);
// usage
React.render(HelloWorld, doment.body)

Imperative

Procedural

Direct invocation

console.log(HELLO_WORLD);
// usage
// none - procedural code 

Subroutine

function printHelloWorld() {
  console.log(HELLO_WORLD);
}
// usage
printHelloWorld();

Static-typed object-oriented

Static

Static method
class HelloWorld {
  static print() {
    console.log(HELLO_WORLD);
  }
}
// usage
HelloWorld.print();
Static invocation from method
class HelloWorld {
  print() {
    console.log(HELLO_WORLD);
  }
}
// usage
new HelloWorld().print()

Injection-based

constructor injection
class HelloWorld {
  constructor(console) {
    this.console = console;
  }
  print() {
    this.console.log(HELLO_WORLD);
  }
}
// usage
new HelloWorld(console).print();
Parameter Injection
class HelloWorld {
  print(console) {
    console.log(HELLO_WORLD);
  }
}
// usage
new HelloWorld().print(console);
Autowired Injection
class HelloWorld {
  $console;
  print(console) {
    this.$console.log(HELLO_WORLD);
  }
}
// usage
Singleton.get(HelloWorld).print(console);

Inheritance

Classical Inheritance

// following code would not work as Console is not publically initializable
class HelloWorld extends Console {
  print() {
    this.log(HELLO_WORLD);
  }
}
// usage
new HelloWorld().log();

Prototypical inheritance

let myConsole = Object.create(console);
myConsole.print = function () {
  this.log(HELLO_WORLD);
};
// usage
myConsole.print();

Old-school class pattern

// following code would not work as Console is not publically initializable
function HelloWorld() {
}
HelloWorld.prototype = new Console();
HelloWorld.prototype.print = function () {
  this.log(HELLO_WORLD);
};
// usage
new HelloWorld().log();

Dynamic-typed object-oriented

Mixin

Static invocation
const HelloWorldMixin = {
  printHelloWorld() {
    console.log(HELLO_WORLD);
  }
};
// usage
const obj = Object.assign({}, HelloWorldMixin);
obj.printHelloWorld();
Parameter injection
const HelloWorldMixin = {
  printHelloWorld(console) {
    console.log(HELLO_WORLD);
  }
};
// usage
const obj = Object.assign({}, HelloWorldMixin);
obj.printHelloWorld(console);

Monkey-pactching

Monkey-pactching with mixins
const HelloWorldMixin = {
  printHelloWorld() {
    console.log(HELLO_WORLD);
  }
};
// usage
Object.assign(console, HelloWorldMixin);
console.printHelloWorld();
Monkey-pactching with method
console.printHelloWorld = function() {
   this.log(HELLO_WORLD);
}
// usage
console.printHelloWorld();

Factory / Builder

Constructor Injection

function createHelloWorld(f) {
  return {
    print() {
        f.log(HELLO_WORLD);
    }
  }
}
// usage
createHelloWorld(console).print();

Parameter Injection

function createHelloWorld() {
  return {
    print(console) {
      console.log(HELLO_WORLD);
    }
  };
}
// usage
createHelloWorld().print(console);

IIFE / old-school module pattern

const HelloWorld = (function createHelloWorld() {
  return {
    print(console) {
      console.log(HELLO_WORLD);
    }
  };
})();
// usage
HelloWorld.print(console);

Functional programming

Eager Eval

Side-effect on usage

// This is a contrived case as IO is all about side-effect
function helloWorld() {
  return HELLO_WORLD;
}
// usage
console.log(helloWorld());

Side-effect on binding

function helloWorld(console) {
  return console.log(HELLO_WORLD);
}
// usage
helloWorld(console);

Lazy Eval

early binding

function helloWorld(f) {
  return () => f.log(HELLO_WORLD);
}
// usage
helloWorld(console)();
Late Binding
function helloWorld() {
  return (f) => f.log(HELLO_WORLD);
}
// usage
helloWorld()(console);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment