proposal-first-class-protocols icon indicating copy to clipboard operation
proposal-first-class-protocols copied to clipboard

Traits based approach

Open iddan opened this issue 7 years ago • 0 comments

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";
}

iddan avatar Sep 14 '18 22:09 iddan