Slide 1

Slide 1 text

proposal-first-class-protocol

Slide 2

Slide 2 text

せ⵸: @brn (ꫬꅿ⨳ⵃa.k.a ـٕ٦ظ) 耵噟: ؿٗٝزؒٝسؒٝآص،٥iOSؒٝآص، ⠓爡: Cyberagent ،سذؙأةآؔRightSegment٥AI Messenger ـؚٗ: http://abcdef.gets.b6n.ch/ Twitter: https://twitter.com/brn227 GitHub: https://github.com/brn

Slide 3

Slide 3 text

What is this proposal ? protocolך䲿周 ⯋ղכinterfaceך䲿周׌׏׋կ

Slide 4

Slide 4 text

What is 'protocol' ? classָ㹋鄲ׅץֹ鋉秈׾邌ׅկ 㹋䡾כקה׿וinterfaceהずׄדծ swiftװobjective-cדכinterface׾protocolהㄎןծ javaדכず瘝ך׮ך׾interfaceהㄎע(稢ְַ鎉铂➬圫♳ך麩ְכ֮ ׷ָ)

Slide 5

Slide 5 text

Ecmascript way ׃ַ׃Ecmascriptךprotocolכֿך⚕倯ה׮殯ז׷杝荈ך➬圫ָ䲿 周ׁ׸גְ׷կ

Slide 6

Slide 6 text

As Symbol 植㖈䲿周⚥ךֿךproposalכprotocol׾ծ ًاحس׾䭯אSymbolך꧊さה׃ג邌ׅկ

Slide 7

Slide 7 text

protocol ProtocolName {! // 実装が必要なシンボルを宣言 thisMustBeImplemented;! ! // メソッド実装 youGetThisMethodForFree() {! return this[ProtocolName.thisMustBeImplemented]();! }! }! ! class ClassName implements ProtocolName {! [ProtocolName.thisMustBeImplemented]() {! ...! }! } !

Slide 8

Slide 8 text

Extends Existing class 傀㶷ךclassח㼎׃ג׮protocol׾㹋鄲ׅ׷ֿהָדֹ׷կ

Slide 9

Slide 9 text

protocol Functor {! map;! }! ! Promise.prototype[Functor.map] = () => {! ...! }! ! Protocol.implement(Promise, Functor);!

Slide 10

Slide 10 text

'implements' keyword 倜׋חimplements怴皾㶨ָ鷄⸇ׁ׸׷

Slide 11

Slide 11 text

Promise implements Functor // true! ! if (MyClass implements SomeProtocol) { }!

Slide 12

Slide 12 text

Extends protocol protocolכ➭ךprotocol׾䭁䓸דֹ׷

Slide 13

Slide 13 text

protocol A { a; }! protocol B extends A { b; }! ! class C implements B {! [A.a]() {}! [B.b]() {}! }! ! class D implements A {! [A.a]() {}! }!

Slide 14

Slide 14 text

Default Implementation ⴱ劍㹋鄲׮鷄⸇דֹ׷

Slide 15

Slide 15 text

protocol A { a; }! ! protocol B extends A {! [A.a]() { ... }! }!

Slide 16

Slide 16 text

Static protocol ꫼涸ًاحس׮protocolדⵖ䖴ׅ׷ֿהָ〳腉

Slide 17

Slide 17 text

protocol A {! static b() {}! }! ! class C implements A { }! C[A.b]();!

Slide 18

Slide 18 text

Issues 傀㶷ךؙٓأ׾䭁䓸ׅ׷㜥さծprototypeפך湫䱸➿Ⰵהְֲ䲿周ָ 遤׻׸גְ׷կ ְֻ׵ז׿ד׮儗➿鹼׸זךדծ➿剏周׾䲿周׃גְֶ׋կ

Slide 19

Slide 19 text

Proposed 1 Protocol.impelemtꟼ侧ך痥♲䒷侧ד㹋鄲

Slide 20

Slide 20 text

protocol Functor {! map;! }! ! // If implementation is not satisfied, throw TypeError.! Protocol.implement(Array, Functor, {! [Functor.map]: Array.prototype.map! });!

Slide 21

Slide 21 text

Proposed 2 傀㶷ךؙٓأ׮ⱄ䏝implementsؗ٦ٙ٦سד䭁䓸〳腉ח

Slide 22

Slide 22 text

protocol Functor {! map;! }! ! // We can implements protocol after declaration.! Array implements Functor {! [Functor.map]: Array.prototype.map! }!

Slide 23

Slide 23 text

TypeScript? ה׶ִ֮׆ծ傀㶷ךinterfaceכ婍ׅד֮׹ֲהךֿהկ protocol׾וך״ֲז㘗ה׃ג䪔ֲַכ劢㹀 Allow dynamic name in typesהְֲ㘗ךفٗػذ؍せחsymbol׾ ⢪ֲֿהָדֹ׷PRָ鹌׿דְ׷ךדծ ֿ׸ָ㹋鄲ׁ׸׷הprotocol׮أي٦ؤחְֽ׷ַ׮կ

Slide 24

Slide 24 text

׀幠耮֮׶ָהֲ׀ְׂת׃׋