Antes de começarmos a falar sobre os princĂpios de design de uma API extensĂvel, devemos discutir o mĂnimo de higiene. Um grande nĂșmero de problemas nĂŁo teria acontecido se os desenvolvedores de API fossem um pouco mais responsĂĄveis ââna identificação de sua ĂĄrea de responsabilidade.
1. Fornece a quantidade mĂnima de funcionalidade
A qualquer momento, sua API Ă© como um iceberg: ela tem uma parte visĂvel (documentada) e uma parte nĂŁo documentada invisĂvel. Em uma boa API, essas duas partes se relacionam aproximadamente como a superfĂcie e a parte subaquĂĄtica de um iceberg real, 1 em 10. Por que isso? Por duas razĂ”es Ăłbvias.
Os computadores existem para facilitar as coisas complexas, nĂŁo vice-versa. O cĂłdigo que os desenvolvedores escreverĂŁo sobre sua API deve descrever a solução para um problema complexo em termos simples e concisos. Se os desenvolvedores forem forçados a escrever mais cĂłdigo em sua API do que vocĂȘ mesmo escreveu, algo deu errado aqui. Talvez essa API simplesmente nĂŁo seja necessĂĄria.
Remover funcionalidade da API Ă© impossĂvel sem perdas graves. Se vocĂȘ prometeu fornecer alguma funcionalidade, agora vocĂȘ deve fornecĂȘ-la "para sempre" (atĂ© o final do suporte para esta versĂŁo principal da API). Declarar funcionalidade sem suporte Ă© um processo complexo, repleto de conflitos potenciais com o consumidor.
A regra nÂș 1 Ă© a mais simples: se vocĂȘ nĂŁo precisa expor alguma funcionalidade, nĂŁo precisa expor. Ele pode ser formulado da seguinte forma: cada entidade, cada campo, cada mĂ©todo na API pĂșblica Ă© uma solução de produto . Deve haver bons motivos para uma entidade ser documentada.
2. Evite ĂĄreas cinzentas e eufemismo
, . , . , , , «» - , â API, , . «» . .
API , :
;
â , , ..;
. , , .
3.
. , : - , , ?
1. SDK .
//
let order = api.createOrder();
//
let status = api.getStatus(order.id);
, - . , id 404
, , . , strong eventual.
? , . , â . , â .
: «, !» â , , . , , createOrder
, SDK - :
let order = api.createOrder();
let status;
while (true) {
try {
status = api.getStatus(order.id);
} catch (e) {
if (e.httpStatusCode != 404 || timeoutExceeded()) {
break;
}
}
}
if (status) {
âŠ
}
, , , . API, createOrder
SDK , getStatus
.
â API. , , .
2. :
let resolve;
let promise = new Promise(
function (innerResolve) {
resolve = innerResolve;
}
);
resolve();
, callback-, new Promise
, resolve
resolve()
. : new Promise
callback-.
, , . API â . , ; , , API. .
3. , API , :
//
//
//
object.animateWidth('100px', '500px', '1s');
//
object.observe('widthchange', observerFunction);
: observerFunction
? , SDK 10 â observerFunction 10 '140px', '180px' .. '500px'. API â , observerFunction
.
- â , , , , SDK 10 . , , observerFunction
'500px' - â - .
â callback â .
4. , , :
GET /v1/orders/{id}/events/history
â
{
"event_history": [
{
"iso_datetime": "2020-12-29T00:35:00+03:00",
"new_status": "created"
},
{
"iso_datetime": "2020-12-29T00:35:10+03:00",
"new_status": "payment_approved"
},
{
"iso_datetime": "2020-12-29T00:35:20+03:00",
"new_status": "preparing_started"
},
{
"iso_datetime": "2020-12-29T00:35:30+03:00",
"new_status": "ready"
}
]
}
, - « », . .. "preparing_started", "ready", "payment_approved". , - â , . , , .
, (, - ) - , - â , . , - , . . - ; , .
-, ; -, "payment_approved" "preparing_started" ( â , , ) .
.
4.
, , â . - , .
, , - . - , «». , , . - , .. -, , , - , .
« -» â , , - , . . «» â API; â « », III.
Este Ă© um rascunho para um capĂtulo futuro do livro sobre desenvolvimento de API. O trabalho Ă© feito no Github . A versĂŁo em inglĂȘs do mesmo capĂtulo Ă© publicada na mĂdia . Eu agradeceria se vocĂȘ pudesse compartilhar no reddit - eu mesmo nĂŁo posso de acordo com a polĂtica da plataforma.