tc39 / proposal-first-class-protocols

a proposal to bring protocol-based interfaces to ECMAScript users
352 stars 9 forks source link

Traits based approach #34

Open iddan opened 6 years ago

iddan commented 6 years ago

I'd like to suggest a different approach for this proposal: instead of a class to implement protocols on declaration it will implement different protocols in a different statement for each protocol. This approach is known as Traits and can be seen in Scala, Rust, and other languages.

Traits enable better separation of concerns, composability, and are a static single solution for associating a protocol to a class, already declared (like Object) or not.

References:

Traits: Composable Units of Behavior | Nathanael Schärli, Stéphane Ducasse, Oscar Nierstrasz and Andrew Black

Syntax

protocol ProtocolName {
  // declare a symbol which must be implemented
  requiredMethodName;

  // and some methods that are provided by implementing this protocol
  providedMethodName(...parameters) {
    methodBody;
  }
}

class ClassName {
}

implement ProtocolName for ClassName {
    [ProtocolName.requiredMethodName]() {
        // this is the implementation for this class
    }
}

Example

protocol ToString {
  tag;

  toString() {
    return `[object ${this[ToString.tag]}]`;
  }
}

implement ToString for Object {
  [ToString.tag] = "Object";
}