AL+

Limba: RO (română) EN (English)

Scrieți-ne: paul@alplustech.com

Codul Swift comun are nevoie de un contract pentru lățimea întregilor

Verificați lățimea Int la limita dintre iOS și wasm32 înainte de a reutiliza algoritmi Swift; alegeți stocare mai largă doar dacă o cere contractul datelor.

Read this article in English

Codul-sursă comun păstrează un algoritm doar dacă reprezentările păstrează valorile de care are nevoie acel algoritm. Un tip întreg suficient de larg pe o platformă poate ascunde o dependență de acea platformă atunci când este folosit pe alta. Înainte de a considera că pachetele Swift comune păstrează comportamentul între platforme, precizați lățimea valorilor relevante acolo unde datele trec dintr-un mediu în altul.

Această cerință este mai restrânsă și mai utilă decât înlocuirea fiecărui întreg cu un tip mai larg. Unele numere descriu poziții într-o colecție locală. Altele transportă valori care trebuie să rămână intacte la stocare, transfer și utilizare pe mai multe platforme. Alegerea corectă decurge din contractul valorii. Faptul că un nume de tip este acceptat de compilator în ambele medii nu dovedește că acel contract rămâne intact.

Munca descrisă a început înaintea publicării articolului

În relatarea tehnică Goodnotes publicată la 1 iunie 2026, echipa descrie un proiect web început în 2021 și folosit deja în producție. Articolul prezintă o muncă anterioară, nu o lansare de produs din iunie. Observația relevantă este precisă: pe wasm32, Int are 32 de biți, iar unele presupuneri privind valori pe 64 de biți au impus folosirea explicită a Int64.

Sinteza Swift despre luna mai, publicată la 3 iunie, trimite ulterior la această relatare. Luna din titlu descrie subiectele sintezei; nu mută publicarea în mai. Nicio sinteză care include atât lansări, cât și propuneri acceptate nu dovedește că fiecare funcționalitate discutată fusese livrată atunci într-un set stabil de instrumente.

Argumentul de aici nu depinde de preluarea cifrelor din relatare privind performanța, dimensiunea fișierului binar sau proporția de cod comun. Acestea sunt rezultatele raportate de autor pentru Goodnotes. Nu sunt măsurători ale altei aplicații și nu pot justifica economic o rescriere fără legătură cu acel proiect. Punctul de plecare util este diferența dintre reprezentări, pe care o echipă o poate examina în propria proiectare.

Porniți de la sensul valorii

Să luăm un exemplu ipotetic: un format comun de document conține un identificator întreg. Dacă formatul permite valori dincolo de intervalul unui întreg cu semn pe 32 de biți, citirea câmpului într-un întreg cu lățime dependentă de platformă creează o obligație pe care platforma mai îngustă nu o poate îndeplini. Algoritmul poate rămâne identic, deși datele lui de intrare nu mai pot fi reprezentate. Problema apare înainte de discuția despre portabilitatea algoritmului în sine.

Alt câmp poate conține un număr mic, cu o limită clară. Dacă maximul face parte din contractul domeniului și toate calculele intermediare rămân în intervalul acceptat, o reprezentare mai largă poate să nu aducă niciun câștig de corectitudine. Cele două câmpuri nu ar trebui să primească aceeași regulă doar fiindcă ambele foloseau întâmplător Int într-o implementare pentru iOS.

Pentru fiecare valoare care trece dintr-un mediu în altul, stabiliți dacă are semn, intervalul permis și unitatea de măsură. O durată exprimată într-o unitate mai fină poate crește numeric mult mai repede decât aceeași durată exprimată într-o unitate mai mare. O înmulțire pentru calcularea unei alocări poate depăși intervalul numărului final. Analiza trebuie să includă valorile intermediare, alături de datele stocate și de rezultatele finale.

Aceasta este o examinare a proiectării, nu afirmația că o anumită aplicație are în prezent o defecțiune. Exemplul arată ce dovezi ar fi necesare: valorile permise ale câmpului, reprezentarea pe platforma vizată și operațiile dintre citire și scriere. Fără aceste fapte, prescrierea unei schimbări de tip ar fi o presupunere.

Conversia are nevoie de o limită vizibilă

O separare utilă deosebește valorile domeniului de indicii dependenți de platformă. Un model comun poate păstra o valoare în reprezentarea cerută de contract, iar un adaptor poate decide dacă acea valoare poate fi folosită drept indice sau număr de elemente în mediul local. Adaptorul trebuie să aibă un răspuns explicit când conversia este imposibilă. Pierderea tăcută de informație ar schimba datele de intrare, lăsând impresia că operația continuă neschimbată.

Răspunsul depinde de produs. O valoare externă invalidă poate necesita respingere; un document valid, dar neacceptat de aplicație, poate necesita o explicație clară. Reducerea valorii doar pentru a încăpea într-un parametru existent poate transforma oricare dintre situații într-un comportament înșelător. Stabiliți ce condiție a întâlnit aplicația înainte de a decide ce vede utilizatorul.

Această separare face și mentenanța mai concretă. Persoana care verifică modificarea poate examina regula de conversie fără să reinterpreteze fiecare operație aritmetică din pachetul comun. Cei care contribuie ulterior pot deosebi o valoare a domeniului cu lățime fixă de un tip ales pentru comoditatea platformei. Claritatea contează chiar dacă aplicația mai rulează o vreme pe o singură platformă.

Stocarea mai largă are un domeniu de aplicare

Contraargumentul cel mai puternic este simplu: multe date din aplicații au deja limite situate confortabil în interiorul intervalului pe 32 de biți. Schimbarea fiecărui întreg poate răspândi conversii prin API-urile colecțiilor și poate îngreuna citirea codului local. Este posibil să nu rezolve nicio problemă de reprezentare observată. Păstrarea unui întreg cu lățimea platformei poate fi rezonabilă când capacitatea sa dependentă de platformă face parte din utilizarea intenționată.

Concluzia este, așadar, condiționată. Algoritmii comuni au nevoie de verificarea presupunerilor privind reprezentarea, nu de o regulă universală pentru Int64. O decizie bună de portare poate lăsa multe câmpuri neschimbate și poate impune o lățime explicită doar acolo unde valorile o cer. Poate identifica și comportamente specifice platformei, care ar trebui păstrate în spatele unui adaptor, fără a le forța în nucleul comun.

Dacă pregătiți un proiect de dezvoltare software la comandă pentru mobil și web, cereți contractul datelor alături de planul de reutilizare. Stabiliți ce valori trebuie să rămână intacte și unde pot eșua conversiile. Astfel, reutilizarea codului primește o limită care poate fi verificată înainte ca pachetul comun să devină o promisiune de comportament identic.