Che cos'è uno spessore?


Risposte:


92

Da Wikipedia:

Nella programmazione per computer, uno shim è una piccola libreria che intercetta in modo trasparente un'API, modificando i parametri passati, gestendo l'operazione stessa o reindirizzando l'operazione altrove. Gli spessori in genere si verificano quando cambia il comportamento di un'API, causando in tal modo problemi di compatibilità per le applicazioni meno recenti che fanno ancora affidamento sulla funzionalità precedente. In questi casi, l'API precedente può ancora essere supportata da un sottile livello di compatibilità in cima al codice più recente. Gli spessori possono anche essere utilizzati per eseguire programmi su piattaforme software diverse da quelle per cui sono stati sviluppati.


83
Questa risposta non è diversa dal fare una vera ricerca su Google su Wikipedia. Un esempio sarebbe carino.
dance2die

4
Sembra un uso del modello di progettazione della facciata per l'interfacciamento delle librerie.
blz

84

Il termine "shim" come definito in Wikipedia sarebbe tecnicamente classificato, in base alla sua definizione, come un modello di progettazione "strutturale". I molti tipi di modelli di progettazione "strutturali" sono descritti in modo abbastanza chiaro nei modelli di progettazione software orientati agli oggetti (alcuni direbbero defacto) che fanno riferimento a "Modelli di progettazione, elementi di software orientato agli oggetti riutilizzabili" meglio noti come "Banda di quattro" .

Il testo "Gang of Four" delinea almeno 3 modelli ben noti noti come "Proxy", "Adapter" e "Facade" che forniscono tutti funzionalità di tipo "shim". Nella maggior parte dei campi è spesso volte l'uso e / o mancato utilizzo di acronimi diversi per lo stesso concetto di radice che causa confusione alle persone. L'uso della parola "shim" per descrivere i più specifici modelli di progettazione "strutturale" "Proxy" , "Adapter" e "Facade" è certamente un chiaro esempio di questo tipo di situazione. Un "shim" è semplicemente un termine più generale per i tipi più specifici di modelli "strutturali" "Proxy", "Adapter", "Facade" e possibilmente altri.


5
Questa risposta indica che uno spessore è un modello di progettazione (uno dei tanti), nomina alcuni modelli di progettazione simili e si distingue per il modo in cui le persone vengono confuse da diversi acronimi. Ma in realtà non risponde alla domanda originale su cosa sia uno spessore, cosa faccia o come venga usato.
Richie Thomas,

53

Spiegazione semplice via Cartoon

Un esempio di spessore:

My Dog Ralph è un fortunato bash-tard (doppio gioco di parole previsto)

Sommario

Nota: l'analogia è tesa. Di solito Ralph otterrà ESATTAMENTE quello che ha chiesto, ma la meccanica di COME è stata ottenuta è qualcosa che non poteva aspettarsi.

Uno shim è un codice che si occupa di ciò che viene chiesto (per "intercettazione"), senza che nessuno sia più saggio al riguardo. Questo è il concetto generale. Ora dovresti essere in grado di leggere e comprendere la voce di Wikipedia sugli spessori.


13

Per quanto riguarda le origini della parola, abbandonare il widget Dizionario di Apple

noun
   a washer or thin strip of material used to align parts, 
   make them fit, or reduce wear.

verb ( shimmed, shimming) [ trans. ]
   wedge (something) or fill up (a space) with a shim.

ORIGIN early 18th cent.: of unknown origin

Questo sembra adattarsi abbastanza bene a come i web designer usano il termine.



12

Secondo l'articolo di Microsoft "Demistificazione degli spessori" :

È una metafora basata sulla parola inglese shim, che è un termine ingegneristico usato per descrivere un pezzo di legno o metallo che viene inserito tra due oggetti per adattarli meglio insieme. Nella programmazione per computer, uno shim è una piccola libreria che intercetta in modo trasparente un'API, modifica i parametri passati, gestisce l'operazione stessa o reindirizza l'operazione altrove. Gli spessori possono anche essere utilizzati per l'esecuzione di programmi su piattaforme software diverse da quelle per cui sono stati sviluppati.

Interpreto questo per indicare che uno shim è un termine generico per qualsiasi libreria di codice che agisce da intermediario e modifica parzialmente o completamente il comportamento o il funzionamento di un programma. Come un vero intermediario, può influire sui dati passati a quel programma o sui dati restituiti da quel programma.

L'articolo usa l'API di Windows come esempio e ho trovato pertinente la seguente frase:

In genere l'applicazione non è a conoscenza del fatto che la richiesta sta per una shim DLL anziché per Windows stessa e Windows non è a conoscenza del fatto che la richiesta provenga da una fonte diversa dall'applicazione (poiché la shim DLL è solo un'altra DLL all'interno del processo dell'applicazione) .

Per generalizzare questa citazione, i due programmi che producono il "pane" del "shim sandwich" non dovrebbero essere in grado di distinguere tra parlare con il loro programma di contropartita e parlare con lo shim.

Quali sono alcuni pro e contro dell'utilizzo degli spessori?

Ancora una volta, dall'articolo:

È possibile correggere le applicazioni senza accesso al codice sorgente o senza modificarle affatto. Si incorre in un minimo di sovraccarico di gestione aggiuntivo ... e in questo modo è possibile risolvere un numero ragionevole di applicazioni. Il rovescio della medaglia è il supporto in quanto la maggior parte dei fornitori non supporta applicazioni con shim. Non è possibile correggere tutte le applicazioni utilizzando gli spessori. La maggior parte delle persone in genere considera gli shim per le applicazioni in cui il fornitore non è in attività, il software non è abbastanza strategico da richiedere supporto o desidera solo guadagnare un po 'di tempo.

Nel contesto di questa domanda, termini come "proxy", "adattatore" e "facciata" hanno più senso (almeno per me) dopo aver letto il link sopra.


3

Come abbiamo visto in molte risposte qui, uno shim è una sorta di adattatore che fornisce funzionalità a livello di API che non faceva necessariamente parte di tale API. Questo thread ha molte risposte valide e complete, quindi non sto espandendo ulteriormente la definizione.

Tuttavia, penso di poter aggiungere un buon esempio, ovvero Javascript ES5 Shim ( https://github.com/es-shims/es5-shim ):

Javascript si è evoluto molto negli ultimi anni e, tra le molte altre modifiche alle specifiche del linguaggio, sono stati aggiunti molti nuovi metodi ai suoi oggetti principali.

Ad esempio, nella specifica ES2015 (aka ES5), il metodo findè stato aggiunto al Arrayprototipo. Supponiamo quindi che tu stia eseguendo il tuo codice usando un motore JavasScript prima di questa specifica (es: Nodo 0.12) che non offre ancora quel metodo. Caricando lo shim ES5, questi nuovi metodi verranno aggiunti aArray prototipo, consentendoti di utilizzarli anche se non stai eseguendo una specifica JavaScript più recente.

Potresti chiedere: perché qualcuno dovrebbe farlo invece di aggiornare l'ambiente a una versione più recente (diciamo Nodo 8)?

Esistono molti casi reali in cui tale approccio ha senso. Un buon esempio:

Supponiamo che tu abbia un sistema legacy in esecuzione in un vecchio ambiente e che devi utilizzare tali nuovi metodi per implementare / correggere una funzionalità. L'aggiornamento del tuo ambiente è ancora in corso perché ci sono problemi di compatibilità che richiedono molte modifiche e test del codice (un componente critico).

In questo esempio, potresti provare a creare la tua versione di tale funzionalità, ma ciò renderebbe il tuo codice più difficile da leggere, più complesso, in grado di introdurre nuovi bug e richiedere tonnellate di test aggiuntivi solo per coprire una funzionalità che sai che lo farà essere disponibile nella prossima versione.

Invece, è possibile utilizzare questo spessore e utilizzare questi nuovi metodi, sfruttando il fatto che questa correzione / funzionalità sarà compatibile dopo l'aggiornamento, poiché si stanno già utilizzando i metodi noti per essere disponibili nella specifica successiva. E c'è un motivo in più: dal momento che questi metodi sono nativi della prossima specifica della lingua, ci sono buone probabilità che funzionino più velocemente di qualsiasi implementazione che avresti potuto fare se avessi provato a creare la tua versione.

Un altro scenario reale in cui tale approccio è il benvenuto è a livello di browser. Supponiamo che tu abbia bisogno di supportare il vecchio browser e desideri sfruttare queste nuove funzionalità. Javascript è un linguaggio che ti consente di aggiungere / modificare metodi nei suoi oggetti principali (come l'aggiunta di metodi al prototipo di array), e quelle librerie di shim sono abbastanza intelligenti da aggiungere tali metodi solo se manca l'implementazione attuale.

PS: 1) Vedrai il termine "Polyfill" relativo a questi spessori Javascript. Polyfill è un tipo di shim più specializzato che viene utilizzato per garantire la compatibilità futura in diverse specifiche a livello di browser. A proposito, il mio esempio sopra si riferisce esattamente a tale esempio.

2) Gli spessori non si limitano a questo esempio (aggiunta di funzionalità che saranno disponibili in una versione futura). Esistono diversi casi d'uso che potrebbero essere considerati anche uno spessore.

3) Se sei curioso di sapere come viene implementato questo polyfill specifico, puoi aprire le specifiche Javascript Array.find e scorrere fino alla fine della pagina dove troverai un'implementazione canonica per questo metodo.


0

SHIM è un altro livello di controllo di sicurezza che viene eseguito per tutti i servizi, per proteggere i sistemi a monte. Il server SHIM convalida ogni richiesta in arrivo, con le credenziali dell'utente delle intestazioni, rispetto alle credenziali dell'utente, che vengono passate nella richiesta (SOAP / RESTFUL).

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.