Mantendo a compatibilidade com versÔes anteriores: sobre a linha de corte do iceberg

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.








All Articles