Upgrade to PRO for Only $50/Year—Limited-Time Offer! 🔥
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Designing JS APis
Search
Caio Gondim
May 17, 2014
Programming
3
260
Designing JS APis
The Good, The Bad, and the Ugly
Caio Gondim
May 17, 2014
Tweet
Share
More Decks by Caio Gondim
See All by Caio Gondim
256 shades of R, G and B
caiogondim
1
110
AB Test
caiogondim
9
690
CSS Layout: O ontem, o hoje e o depois
caiogondim
1
140
Git lightning talk
caiogondim
5
290
HTML5 Sensitivo
caiogondim
5
370
Sublime Text 2 pro tips
caiogondim
21
2.5k
Brazil
caiogondim
2
320
HTML5 - Seu navegador não é mais o mesmo
caiogondim
5
260
História dos Sistemas Operacionais de Videogames
caiogondim
3
890
Other Decks in Programming
See All in Programming
Cell-Based Architecture
larchanjo
0
130
TerraformとStrands AgentsでAmazon Bedrock AgentCoreのSSO認証付きエージェントを量産しよう!
neruneruo
3
840
手が足りない!兼業データエンジニアに必要だったアーキテクチャと立ち回り
zinkosuke
0
770
愛される翻訳の秘訣
kishikawakatsumi
3
330
公共交通オープンデータ × モバイルUX 複雑な運行情報を 『直感』に変換する技術
tinykitten
PRO
0
140
LLMで複雑な検索条件アセットから脱却する!! 生成的検索インタフェースの設計論
po3rin
4
860
「コードは上から下へ読むのが一番」と思った時に、思い出してほしい話
panda728
PRO
39
26k
MAP, Jigsaw, Code Golf 振り返り会 by 関東Kaggler会|Jigsaw 15th Solution
hasibirok0
0
250
FluorTracer / RayTracingCamp11
kugimasa
0
240
著者と進める!『AIと個人開発したくなったらまずCursorで要件定義だ!』
yasunacoffee
0
150
AIエージェントの設計で注意するべきポイント6選
har1101
5
1.2k
モデル駆動設計をやってみようワークショップ開催報告(Modeling Forum2025) / model driven design workshop report
haru860
0
270
Featured
See All Featured
Are puppies a ranking factor?
jonoalderson
0
2.3k
Google's AI Overviews - The New Search
badams
0
860
The Limits of Empathy - UXLibs8
cassininazir
1
190
Marketing Yourself as an Engineer | Alaka | Gurzu
gurzu
0
87
Learning to Love Humans: Emotional Interface Design
aarron
274
41k
Kristin Tynski - Automating Marketing Tasks With AI
techseoconnect
PRO
0
100
How to train your dragon (web standard)
notwaldorf
97
6.4k
Amusing Abliteration
ianozsvald
0
63
Effective software design: The role of men in debugging patriarchy in IT @ Voxxed Days AMS
baasie
0
170
Raft: Consensus for Rubyists
vanstee
141
7.2k
The #1 spot is gone: here's how to win anyway
tamaranovitovic
1
860
How Fast Is Fast Enough? [PerfNow 2025]
tammyeverts
3
400
Transcript
DESIGNING JS APIs THE GOOD, THE BAD AND THE UGLY
GLOBO.COM
GLOBO.COM
BOOKING.COM
LOOP INFINITO
COLETANEA FRONT-END
DESIGN WHY
DEFINITION purpose, planning, or intention that exists or is thought
to exist behind an action, fact, or material object DESIGN WHY
APIs ARE DEVELOPERS UX DESIGN WHY
CODE IS WRITTEN ONCE, READ MANY TIMES DESIGN WHY
NOBODY READS API DOCs DESIGN WHY
BAD THE GOOD THE UGLY THE
BAD THE
BAD THE IMMUTABLE vs MUTABLE var foo = [3, 5,
8]; var bar = foo.slice(1, 2); console.log(foo); //=> [3, 5, 8] console.log(bar); //=> [5] http://ariya.ofilabs.com/2014/02/javascript-array-slice-vs-splice.html
BAD THE IMMUTABLE vs MUTABLE var foo = [3, 5,
8]; var bar = foo.splice(1, 2); console.log(foo); //=> [3] console.log(bar); //=> [5, 8] http://ariya.ofilabs.com/2014/02/javascript-array-slice-vs-splice.html
BAD THE IMMUTABLE vs MUTABLE var foo = [3, 5,
8]; var bar = foo.sliced(1, 2); console.log(foo); //=> [3, 5, 8] console.log(bar); //=> [5] http://ariya.ofilabs.com/2014/02/javascript-array-slice-vs-splice.html
BAD THE IMMUTABLE vs MUTABLE var foo = [3, 5,
8]; foo.slice(1, 2); console.log(foo); //=> [3] http://ariya.ofilabs.com/2014/02/javascript-array-slice-vs-splice.html
BAD THE DOUBLE NEGATIVE foo.disabled = false; bar.setHidden(false); kung.invisible =
false;
BAD THE DOUBLE NEGATIVE foo.enabled = false; bar.setVisible(false); kung.visible =
false;
BAD THE BOOLEAN TRAP var opacitySlider = new Slider(true); var
volumeSlider = new Slider(false); http://ariya.ofilabs.com/2011/08/hall-of-api-shame-boolean-trap.html
BAD THE BOOLEAN TRAP var opacitySlider = new Slider({ horizontal:
true }); var opacitySlider = new Slider({ horizontal: false }); http://ariya.ofilabs.com/2011/08/hall-of-api-shame-boolean-trap.html
BAD THE BOOLEAN TRAP var opacitySlider = new SliderHorizontal(); var
opacitySlider = new SliderVertical(); http://ariya.ofilabs.com/2011/08/hall-of-api-shame-boolean-trap.html
BAD THE INCONSISTENCE // inconsistence button.caption = “Lorem”; radioButton1.value =
“Easy”; radioButton2.value = “Medium”; radioButton3.value = “Hard”; checkbox1.option = “Ipsum”; checkbox2.option = “Dolor”;
BAD THE GOOD THE UGLY THE
GOOD THE
GOOD THE STATIC POLYMORPHISM POLYMORPSHISM IS WHEN MULTIPLE IMPLEMENTATIONS CAN
RESPOND TO THE SAME MESSAGE WITHOUT THE SENDER NEEDING TO KNOW ABOUT THE IMPLEMENTATION
GOOD THE STATIC POLYMORPHISM // inconsistence button.caption = “Lorem”; radioButton1.value
= “Easy”; radioButton2.value = “Medium”; radioButton3.value = “Hard”; checkbox1.option = “Ipsum”; checkbox2.option = “Dolor”;
GOOD THE STATIC POLYMORPHISM // static polymorphism // similar classes,
same API button.value = “Lorem”; radioButton1.value = “Easy”; radioButton2.value = “Medium”; radioButton3.value = “Hard”; checkbox1.value = “Ipsum”; checkbox2.value = “Dolor”;
GOOD THE NAMING BOOLEAN PROPs // getters of boolean props
should // start with *has*, *can* or *is* if (foo.isChecked()) { // ... }
GOOD THE NAMING BOOLEAN PROPs // getters of boolean props
should // start with *has*, *can* or *is* if (foo.hasChildren()) { // ... }
GOOD THE NAMING BOOLEAN PROPs // getters of boolean props
should // start with *has*, *can* or *is* if (foo.canBeClosed()) { // ... }
GOOD THE SPECIALIZED METHODS var car = new Vehicle(110, 2014,
true, false); var plane = new Vehicle(900, 2003, true, true);
GOOD THE SPECIALIZED METHODS var car = new Car(110, 2014);
var plane = new Vehicle(900, 2003);
GOOD THE var car = new Car({ speedMax: 110, fabricationYear:
2014 }); var plane = new Plane({ speedMax: 900, fabricationYear: 2003 }); SPECIALIZED METHODS
VERBAL ACTIONS status.message(“Lorem Ipsum”); page.forward(); page.backward(); GOOD THE
VERBAL ACTIONS status.showMessage(“Lorem Ipsum”); page.goForward(); page.goBackward(); GOOD THE
BAD THE GOOD THE UGLY THE
UGLY THE
UGLY THE var letters = [“a”, “b”, “c”]; $.each(letters, function(index,
val) {}); $.map(letters, function(val, index) {}); $(“li”).map(function(index, val) {}); Secrets of Awesome JS API Design — https://www.youtube.com/watch?v=QlQm786MClE INCONSISTENCE
UGLY THE jQuery(selector [, context]) // Select jQuery(element) // Wrap
jQuery(object) // Wrap jQuery() // Empty $ object jQuery(elementArray) // Wrap jQuery(jQuery object) // Clone jQuery(html [, ownerDocument]) // Create element jQuery(html, props) // Create element jQuery(callback) // Bind DOM loaded function Secrets of Awesome JS API Design — https://www.youtube.com/watch?v=QlQm786MClE NOT SPECIALIZED
UGLY THE var evento = “Front in Fortaleza”; evento.substring(6, 8);
// => "In" evento.substring(8, 6); // => "In" http://ariya.ofilabs.com/2014/02/javascript-string-substring-substr-slice.html INCONSISTENCE
UGLY THE http://ariya.ofilabs.com/2014/02/javascript-string-substring-substr-slice.html var evento = “Front in Fortaleza”; evento.substr(6,
8); // => "in Forta" evento.substr(8, 6); // => " Forta" INCONSISTENCE
var evento = “Front in Fortaleza”; evento.slice(6, 8); // =>
"in" evento.slice(8, 6); // => "" http://ariya.ofilabs.com/2014/02/javascript-string-substring-substr-slice.html UGLY THE INCONSISTENCE
UGLY THE http://bugs.jquery.com/ticket/13103 JQUERY BOOLEAN TRAP $("#hoverme-stop-2").mouseenter(function() { $(this) .find("img")
.stop(true, true) .fadeOut(); });
UGLY THE http://bugs.jquery.com/ticket/13103 JQUERY BOOLEAN TRAP $("#hoverme-stop-2").mouseenter(function() { $(this) .find("img")
.stop({ clearQueue: true, jumpToEnd: true }) .fadeOut(); });
UGLY THE http://bugs.jquery.com/ticket/13103 CASE CONSISTENCY var myRequest = new XMLHttpRequest();
UGLY THE BOOLEAN TRAP event.initKeyEvent( "keypress", true, true, null, null,
false, false, false, false, 9, 0 );
SEE YOU COWBOY
/caiogondim @caio_gondim
[email protected]