Note: The Chidamber & Kemerer object-oriented metrics suite is one of
the most common ways of measuring complexity of a system but there are
many other principles and techniques which can be applied for this purpose.
Note: Adhering to the SOLID principles is one of the most common ways to reduce
the complexity of a system but there are many other principles and techniques which
can be applied for this purpose.
Note: Some JavaScript developers don't like when I say this but I think that doing things like using closures to emulate a private property is not what I would consider as natural OOP (using the "private" access modifier).
var Person = (function () { function Person(name, surname) { this.name = name; this.surname = surname; } Person.prototype.greet = function () { return "Hello! my name is " + this.name + " " + this.surname; }; return Person; })();
class Person { public name; public surname; constructor(name, surname) { this.name = name; this.surname = surname; } public greet() { return `Hello! my name is ${this.name} ${this.surname}`; } }
var __extends = (this && this.__extends) || function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; function __() { this.constructor = d; } __.prototype = b.prototype; d.prototype = new __(); }; var Animal = (function () { function Animal(theName) { this.name = theName; } Animal.prototype.move = function (meters) { /* ... */ }; return Animal; })(); var Snake = (function (_super) { __extends(Snake, _super); function Snake(name) { _super.call(this, name); } Snake.prototype.move = function (meters) { /* ... */ _super.prototype.move.call(this, meters); }; return Snake; })(Animal);
class Animal { name:string; constructor(theName: string) { this.name = theName; } move(meters: number = 0) { /* ... */ } } class Snake extends Animal { constructor(name: string) { super(name); } move(meters = 5) { /* ... */ super.move(meters); } }
require([ "./source/inversify.config", "./source/models/filter_state_model" ], function (kernel, FilterStateModel) { // code goes here ... });
import { kernel } from "./source/inversify.config"; import { FilterStateModel } from "./source/inversify.config"; // code goes here ...
Parse.User.logIn("user", "pass", { success: function(user) { query.find({ success: function(results) { results[0].save({ key: value }, { success: function(result) { // the object was saved. } }); } }); } });
Parse.User.logIn("user", "pass").then(function(user) { return query.find(); }).then(function(results) { return results[0].save({ key: value }); }).then(function(result) { // the object was saved. });
Promise.all([Primise1, Primise2, PrimiseN]).then(function() { console.log("all the files were created"); });
async function updateEntity() { var success = false; var user = await Parse.User.logIn(user, pass); if(user !== null) { let results = await query.find(); success = await results[0].save({ key: value }; } return success; } await updateEntity(); if(success) { // the object was saved. }
@Component({ selector: 'todo-app', appInjector: [ AngularFire, bind(Firebase).toValue(new Firebase('https://webapi.firebaseio-demo.com/test')) ]}) @View({ templateUrl: 'todo.html', directives: [NgFor] }) class TodoApp { todoService: FirebaseArray; todoEdit: any; todoFilter: Boolean; constructor(sync: AngularFire) { this.todoService = sync.asArray(); this.todoEdit = null; this.todoFilter = null; } editTodo($event, todo) { this.todoEdit = todo; } }
function f() { return "hello"; }
function f(s: string) { return s; } // It is also possible to define the type of a function using the optional type annotations var f : (s: string) => string; f = function(s: string) { return s; }
interface ISerializable { serialize() : string; } interface IMainSkill { use() : bool; } interface IPerson { name : string; surname : string; greet() : string; } class MockMainSkill implements IMainSkill { use() { return true; } } describe("Person Class", () => { // TDD & BDD it("should be able to greet", () => { var mainSkill = new MockMainSkill(); // SOLID: Liskov substitution principle var luke : IPerson = new Person("Luke", "Skywalker", mainSkill); expect(luke.name).to.equal("Luke"); expect(luke.surname).to.equal("Skywalker"); expect(luke.greet()).to.equal("Hello! my name is Luke Skywalker"); }); } class Person implements IPerson, ISerializable { // SOLID: Interface segregation principle private _skill : IMainSkill; // SOLID: Dependency inversion principle public name : string; public surname : string; constructor(name: string, surname: string, skill : IMainSkill) { /* ... */ } greet() : string { /* ... */ }; serialize() : string { /* ... */ }; }
interface IValidatable { validate() : void; } class CustomCollection<T extends IValidatable> { // SOLID: Open/Close principle private itemArray: Array<T>; constructor() { this.itemArray = []; } Add(item: T) { this.validate(); this.itemArray.push(item); } // ... } class User implements IValidatable{ public name; validate() { if(name === null) throw new Error(); } } class Message implements IValidatable{ public message; validate() { if(message === null) throw new Error(); } } var myMessage = new CustomCollection<Message>(); var myUsers = new CustomCollection<User>(); myUsers.Add(new User()); myUsers.Add(new Message()); // Error because of generic type validation