170 čitanja

Code Smell 303 - Kako sprečiti razbijanje postojećih klijenata kada napravite promene

by mcsee...5m2025/06/13
Read on Terminal Reader

Predugo; Citati

Trebali biste verzijirati svoje API-je kako biste spriječili slom postojećih klijenata kada izvršite promene
featured image - Code Smell 303 - Kako sprečiti razbijanje postojećih klijenata kada napravite promene
Maximiliano Contieri HackerNoon profile picture

Kada razbijete API-je bez upozorenja, razbijete povjerenje

TL;DR: Trebali biste da verzišete svoje API-je kako biste spriječili slom postojećih klijenata kada napravite promene.

TL;DR: Trebali biste da verzišete svoje API-je kako biste spriječili slom postojećih klijenata kada napravite promene.

Problemi

  • Klijent aplikacije crashes
  • Neuspeh integracije
  • Kršenje principa najmanje iznenađenja
  • Dolazak
  • Slomljeno poverenje
  • Potrebni rollbacks za ugradnju
  • Potrošeno vreme za razvoj
  • Degradacija korisničkog iskustva

Rešenja

  1. Dodavanje semantičke verzije
  2. Uvođenje retroaktivne kompatibilnosti
  3. Stvaranje upozorenja o deprecijaciji
  4. Stvaranje Roadmapa
  5. Koristite sadržaj pregovaranja
  6. Održavanje paralelnih verzija
  7. Ranije obavijestite o promjenama
  8. Postupno smanjite karakteristike
  9. Dokument koji prelomi promene jasno
  10. Provjerite deprecated parametre sa loggingom
  11. Test nove verzije temeljito
  12. Uklanjanje deprecirane funkcionalnosti nakon zalaska sunca

Kontekst

Kada modificirate API-je bez pravilnog izdavanja verzija, kreirate promene koje utiču na sve postojeće klijente.


Prisiljavate potrošače da odmah ažuriraju svoj kod ili se suočavaju sa sistemskim kvarovima.


Prekršite implicitni ugovor između pružatelja API-ja i potrošača.


Moderan softver uvelike se oslanja na stabilnost API-ja, a uvođenje promjena bez upozorenja može stvoriti kaskadne neuspehe u zavisnim sistemima.


To je danas važnije nego ikad od tadamnoge IA grade svoja rešenja koristeći postojeće API dokumentacije.


Kada ažurirate API bez održavanja retroaktivne kompatibilnosti, rizikujete da prekinete sve aplikacije koje ovise o njemu.


To stvara nestabilnost, frustracije i skupe popravke za korisnike.


Ljudi često tolerirajuNedostaciu novim funkcionalnostima, ali nikada prethodno stabilno ponašanje nije prekinuto.


Pravilna verzija osigurava glatke tranzicije i održava pouzdanost vašeg sustava.

Sample kod

Pogrešno 🙂

// user-api-v1.json - Original API response
{
  "id": 317,
  "name": "Mr Nimbus",
  "email": "[email protected]",
  "nationalities": "Brazilian,Canadian,Oceanic"
}

// Later changed to this without versioning:
{
  "userId": 317,
  "fullName": "Mr Nimbus", 
  "emailAddress": "[email protected]",
  "createdAt": "2018-12-09T18:30:00Z",
  "nationalities": ["Brazilian", "Canadian", "Oceanic"]
}

fetch('/api/users/317')
  .then(response => response.json())
  .then(user => {
    // This breaks when API changes field names and data types
    document.getElementById('name').textContent = user.name;
    document.getElementById('email').textContent = user.email;
    // This breaks when nationalities changes from string to array
    document.getElementById('nationalities').textContent 
      = user.nationalities;
  });

Right 👉

// user-api-v1.json - Version 1 (maintained)
{
  "id": 317,
  "name": "Mr Nimbus",
  "email": "[email protected]",
  "nationalities": "Brazilian,Canadian,Oceanic"
}

// user-api-v2.json - Version 2 
// (new structure, backward compatible)
{
  "id": 317,
  "userId": 317,
  "name": "Mr Nimbus",
  "fullName": "Mr Nimbus",
  "email": "[email protected]",
  "emailAddress": "[email protected]",
  "createdAt": "2018-12-09T18:30:00Z",
  "nationalities": "Brazilian,Canadian,Oceanic"
  "nationalitiesList": ["Brazilian", "Canadian", "Oceanic"]
}

// user-api-v3.json - Version 3 
// (new structure, backward not compatible)
{
  "userId": 317,
  "fullName": "Mr Nimbus",
  "emailAddress": "[email protected]",
  "createdAt": "2018-12-09T18:30:00Z",
  "nationalitiesList": ["Brazilian", "Canadian", "Oceanic"]
}

// client-code-versioned.js
const API_VERSION = 'v1';

fetch(`/api/${API_VERSION}/users/317`)
  .then(response => response.json())
  .then(user => {
    document.getElementById('name').textContent = user.name;
    document.getElementById('email').textContent = user.email;
    // V1 handles comma-separated string
    document.getElementById('nationalities').textContent
      = user.nationalities;
  });

// Or with content negotiation
fetch('/api/users/317', {
  headers: {
    'Accept': 'application/vnd.api+json;version=1'
  }
})
  .then(response => response.json())
  .then(user => {
    document.getElementById('name').textContent = user.name;
    document.getElementById('email').textContent = user.email;
    document.getElementById('nationalities').textContent 
      = user.nationalities;
  });

Detekcija

  • [x] Poluautomatski

Ovaj miris možete otkriti kada pronađete API-je koji mijenjaju imena polja, uklanjaju polja ili mijenjaju strukturu podataka bez održavanja retroaktivne kompatibilnosti.


Potražite aplikacije klijenta koje se prekidaju nakon implementacije API-ja.


Provjerite da li nedostaju naslovi verzija ili sheme za verziju URL-a.


Praćenje dnevnika grešaka za iznenadne pike u neuspjehu klijenta nakon izdavanja.

U toku dana ️

  • Apis

Nivo

  • [x] Posrednik

Zašto je bijecija važna ️

Potrebno je održati stabilanMapaizmeđu vašeg API ugovora i očekivanja klijenata.


Kada razbijete ovoBijecijapromjenom API-ja bez verziranja kršite temeljni princip da se klijenti mogu osloniti na dosljedne sučelje.


You create a mismatch between what clients expect to receive and what your API provides.


To prekida jedan-na-jedan korespondenciju između API obećanja i API isporuke, što dovodi do neuspjeha sistema i gubitka poverenja.


Kada prekinete mapiranje između vašeg API-ja i poslovne logike koju predstavlja, klijenti ne mogu pouzdano komunicirati sa vašim sistemom.


Ova neusklađenost dovodi do nedostataka, prekida vremena, nedostatka poverenja i lošeg korisničkog iskustva.

Ova generacija

AI generatori često stvaraju ovaj miris kada ih zamolite da "izboljeđuju" ili "aktualiziraju" postojeće API-je.


Oni se fokusiraju na to da API bude "bolji" bez razmatranja retroaktivne kompatibilnosti.


Potrebno je eksplicitno uputiti AI alate za održavanje postojećih imena polja i dodati verziju prilikom izrade promena.


Često preferiraju čisti dizajn u odnosu na stabilnost, osim akoEksplicitnoRekli su drugačije.

Detekcija

AI generatori mogu popraviti ovaj miris kada pružite jasne upute o strategijama za verziju API-ja.


Trebali biste ih zamoliti da implementiraju semantičko verzijiranje, održavaju retroaktivnu kompatibilnost i kreiraju migracijske staze za deprecirane funkcije.

Isprobajte ih!

Zapamtite: AI asistenti čine mnogo grešaka

Predložen prompt: Kreirajte verziju API-ja kako biste sprečili prelom promena

Predložen prompt: Kreirajte verziju API-ja kako biste sprečili prelom promena

Without Proper Instructions

With Specific Instructions

ChatGPT

ChatGPT

Claude

Claude

Perplexity

Perplexity

Copilot

Copilot

Gemini

Gemini

DeepSeek

DeepSeek

Meta AI

Meta AI

Grok

Grok

Qwen

Qwen

Čačak

Čačak

Klod

Klod

zbunjenost

zbunjenost

Piloti

Piloti

Blizanci

Blizanci

duboko

duboko

Cilj AI

Cilj AI

Grožđe

Grožđe

Knjiga

Knjiga

Zaključak

Uvek treba da verzišete svoje API-je kako biste sprečili da promene utječu na aplikacije klijenta.


Čak i od vaše prve verzije.


Kada održavate stabilne ugovore kroz pravilno izdavanje verzija, gradite povjerenje sa potrošačima API-ja i omogućite glatku evoluciju vaših sistema.


Promene su neizbežne, ali ne bi trebale slomiti vaše klijente.


Uvek verzišite svoje API-je, pažljivo deprecate i proaktivno komunicirajte kako biste izbegli nepotrebne poremećaje.

Odnosi

https://hackernoon.com/misusing-http-status-codes-wrecks-your-api-monitoring-and-client-logic

https://hackernoon.com/how-to-find-the-stinky-parts-of-your-code-part-iv-7sc3w8n

https://hackernoon.com/how-to-find-the-stinky-parts-of-your-code-part-xii

https://hackernoon.com/how-to-find-the-stinky-parts-of-your-code-part-xxii

https://hackernoon.com/how-to-find-the-stinky-parts-of-your-code-part-xxxiv

https://hackernoon.com/how-to-find-the-stinky-parts-of-your-code-part-xxxv

Disclaimer

Mirisi su mojiMišljenje.

Krediti

Fotografije odĐancarlo RevolledojeUslovi


API-ji su zauvijek, pa ih pažljivo dizajnirajte

API-ji su zauvijek, pa ih pažljivo dizajnirajte

Džordž Fowler


Ovaj članak je deo CodeSmell serije.


L O A D I N G
. . . comments & more!

About Author

Maximiliano Contieri HackerNoon profile picture
Maximiliano Contieri@mcsee
I’m a sr software engineer specialized in Clean Code, Design and TDD Book "Clean Code Cookbook" 500+ articles written

HANG TAGS

OVAJ ČLANAK JE PREDSTAVLJEN U...

Trending Topics

blockchaincryptocurrencyhackernoon-top-storyprogrammingsoftware-developmenttechnologystartuphackernoon-booksBitcoinbooks
OSZAR »