[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"$f1eeefzsgcnus6":3,"$f1q9rekdexwyqp":175},{"data":4},[5],{"id":6,"slug":7,"locale":8,"type":9,"title":10,"subtitle":11,"summary":12,"body":13,"primary_topic":14,"knowledge_status":15,"practical_validation":16,"workflow_status":17,"author_id":18,"published_at":19,"updated_at":19,"review_due_at":20,"canonical_url":21,"seo_title":10,"seo_description":12,"hero_asset_id":20,"reading_time":22,"version":23,"technology_versions":24,"review_frequency_days":25,"parent_content_id":26,"sort_in_parent":27,"hub_entry_status":28,"content_blocks":29,"hero_alt_text":21,"hero_caption":21,"hero_credit":21,"publication_scope":165,"access_level":166,"approved_at":167,"approved_by":168,"review_note":21,"home_enabled":169,"home_slot":170,"home_variant":171,"home_priority":172,"home_eyebrow":20,"home_valid_from":20,"home_valid_to":20,"home_image_asset_id":20,"promotion_kind":173,"sponsor_name":20,"sponsor_url":20,"sponsor_disclosure":174},"09f4f7ad-024c-468b-9db3-7435a27066bf","modernizzazione-legacy-sanitario-branch-by-abstraction","it","CAPSULE","Branch by Abstraction: sostituire un componente dietro un contratto stabile","Cambiare implementazione progressivamente senza mantenere per mesi un enorme branch di codice.","Branch by Abstraction introduce un'astrazione stabile davanti a vecchia e nuova implementazione, permettendo sostituzione e rollback controllati nello stesso flusso applicativo.","Che problema risolve\nAlcune sostituzioni non richiedono un intero Strangler a livello di routing. Se un'applicazione usa direttamente un provider, repository o client esterno, si può prima introdurre un contratto astratto e poi cambiare l'implementazione dietro quel contratto.\nSequenza\nEstrarre un'interfaccia dal comportamento realmente necessario, non da tutte le API del legacy.\n\nAdattare l'implementazione corrente a quella interfaccia senza cambiare comportamento.\n\nCreare la nuova implementazione in parallelo.\n\nAggiungere selezione per configurazione, feature flag o percentuale di traffico.\n\nConfrontare comportamento e telemetria.\n\nRimuovere la vecchia implementazione e, quando non serve più, semplificare l'astrazione.\n\nEsempi adatti\nIdentity Provider: Keycloak oggi, provider federato domani.\n\nImaging Viewer: viewer legacy oggi, DICOMweb\u002FVueMotion tramite adapter domani.\n\nRepository documentale o servizio di firma.\n\nMotore di reporting o renderer PDF.\n\nAccesso a una vecchia anagrafica sostituito progressivamente dall'EMPI.\n\nDifferenza rispetto a Strangler Fig\nStrangler Fig opera tipicamente sul confine esterno di una capability e devia richieste tra sistemi. Branch by Abstraction opera dentro un'applicazione o un bounded context e sostituisce una dipendenza dietro un'interfaccia. I due pattern possono essere combinati.\nIl rischio\nL'astrazione può diventare il minimo comune denominatore tra vecchio e nuovo, impoverendo il dominio. Va progettata dal punto di vista del consumer moderno. Se le semantiche sono diverse, serve anche un ACL.\nPerché aiuta il rollback\nPoiché entrambe le implementazioni rispettano lo stesso contratto, il rollback può essere un cambio di configurazione invece di un ripristino applicativo completo. Questo è utile nelle fasi di cutover ad alto rischio.\n\nBranch by Abstraction è particolarmente efficace per provider e adapter: consente una sostituzione tecnica senza costringere il dominio a conoscere le alternative.","58ba728e-da9d-409d-a6c7-31325e3773a8","REVIEWED","NOT_PERFORMED","PUBLISHED","fbbfd4b6-f4c7-4740-94a6-f81eb8fbb1b2","2026-08-25T18:15:41.242Z",null,"",6,3,{},365,"776fc737-dda9-4c82-bd56-b6ba0b7148d6",8,"AVAILABLE",[30,161],{"id":31,"type":32,"version":33,"doc":34},"9dd08916-7dd9-58a4-9597-a287cbe3db7f","rich_text",1,{"type":35,"content":36},"doc",[37,45,50,55,96,101,134,139,143,148,152,157],{"type":38,"attrs":39,"content":41},"heading",{"level":40},2,[42],{"type":43,"text":44},"text","Che problema risolve",{"type":46,"content":47},"paragraph",[48],{"type":43,"text":49},"Alcune sostituzioni non richiedono un intero Strangler a livello di routing. Se un'applicazione usa direttamente un provider, repository o client esterno, si può prima introdurre un contratto astratto e poi cambiare l'implementazione dietro quel contratto.",{"type":38,"attrs":51,"content":52},{"level":40},[53],{"type":43,"text":54},"Sequenza",{"type":56,"attrs":57,"content":58},"orderedList",{"start":33,"type":20},[59,66,72,78,84,90],{"type":60,"content":61},"listItem",[62],{"type":46,"content":63},[64],{"type":43,"text":65},"Estrarre un'interfaccia dal comportamento realmente necessario, non da tutte le API del legacy.",{"type":60,"content":67},[68],{"type":46,"content":69},[70],{"type":43,"text":71},"Adattare l'implementazione corrente a quella interfaccia senza cambiare comportamento.",{"type":60,"content":73},[74],{"type":46,"content":75},[76],{"type":43,"text":77},"Creare la nuova implementazione in parallelo.",{"type":60,"content":79},[80],{"type":46,"content":81},[82],{"type":43,"text":83},"Aggiungere selezione per configurazione, feature flag o percentuale di traffico.",{"type":60,"content":85},[86],{"type":46,"content":87},[88],{"type":43,"text":89},"Confrontare comportamento e telemetria.",{"type":60,"content":91},[92],{"type":46,"content":93},[94],{"type":43,"text":95},"Rimuovere la vecchia implementazione e, quando non serve più, semplificare l'astrazione.",{"type":38,"attrs":97,"content":98},{"level":40},[99],{"type":43,"text":100},"Esempi adatti",{"type":102,"content":103},"bulletList",[104,110,116,122,128],{"type":60,"content":105},[106],{"type":46,"content":107},[108],{"type":43,"text":109},"Identity Provider: Keycloak oggi, provider federato domani.",{"type":60,"content":111},[112],{"type":46,"content":113},[114],{"type":43,"text":115},"Imaging Viewer: viewer legacy oggi, DICOMweb\u002FVueMotion tramite adapter domani.",{"type":60,"content":117},[118],{"type":46,"content":119},[120],{"type":43,"text":121},"Repository documentale o servizio di firma.",{"type":60,"content":123},[124],{"type":46,"content":125},[126],{"type":43,"text":127},"Motore di reporting o renderer PDF.",{"type":60,"content":129},[130],{"type":46,"content":131},[132],{"type":43,"text":133},"Accesso a una vecchia anagrafica sostituito progressivamente dall'EMPI.",{"type":38,"attrs":135,"content":136},{"level":40},[137],{"type":43,"text":138},"Differenza rispetto a Strangler Fig",{"type":46,"content":140},[141],{"type":43,"text":142},"Strangler Fig opera tipicamente sul confine esterno di una capability e devia richieste tra sistemi. Branch by Abstraction opera dentro un'applicazione o un bounded context e sostituisce una dipendenza dietro un'interfaccia. I due pattern possono essere combinati.",{"type":38,"attrs":144,"content":145},{"level":40},[146],{"type":43,"text":147},"Il rischio",{"type":46,"content":149},[150],{"type":43,"text":151},"L'astrazione può diventare il minimo comune denominatore tra vecchio e nuovo, impoverendo il dominio. Va progettata dal punto di vista del consumer moderno. Se le semantiche sono diverse, serve anche un ACL.",{"type":38,"attrs":153,"content":154},{"level":40},[155],{"type":43,"text":156},"Perché aiuta il rollback",{"type":46,"content":158},[159],{"type":43,"text":160},"Poiché entrambe le implementazioni rispettano lo stesso contratto, il rollback può essere un cambio di configurazione invece di un ripristino applicativo completo. Questo è utile nelle fasi di cutover ad alto rischio.",{"id":162,"type":163,"version":33,"text":164},"fa4676b9-1666-5b8a-a58f-23e6896dc1e4","callout","Branch by Abstraction è particolarmente efficace per provider e adapter: consente una sostituzione tecnica senza costringere il dominio a conoscere le alternative.","PORTAL","ANONYMOUS","2026-08-25T18:15:39.793Z","794a9185-136c-4415-ab23-cd144eb5870e",false,"LATEST","AUTO",0,"EDITORIAL","Sponsorizzato",{"sources":176,"secondaryTopics":177,"tags":178,"primaryTopic":179,"technologies":183},[],[],[],[180],{"id":14,"name":181,"slug":182},"Software Architecture","software-architecture",[]]