Interfacce private all'interno di un pacchetto

7

Questo è fondamentalmente lo stesso di Coding to interfaces , ma giocato nel mondo reale di quando ci sono varie complessità ingegneristiche come l'immutabilità delle interfacce e delle implementazioni pubblicate, ecc.

Considera la seguente situazione:

Una libreria orientata agli oggetti a livello di sistema operativo con una serie di interfacce pubblicate e un'implementazione fornita dal sistema operativo.

Alcuni punti di estensione sono forniti in modo che terze parti possano estendere comportamenti specifici implementando un sottoinsieme delle interfacce pubblicate e registrandole con il sistema operativo.

Un programmatore esamina l'intera serie di interfacce pubblicate e dice a se stesso, "sembra che io possa ri-implementare la maggior parte delle funzionalità (con algoritmi migliori), comprese quelle che non sono designate come estensibili." E così il programmatore lavora.

Solo quando l'implementazione del programmatore si trasforma in stile COM con l'implementazione del sistema operativo e fallisce miseramente, il programmatore si è reso conto che la suite di oggetti implementata dal sistema operativo si basa molto sulle comunicazioni che utilizzano interfacce non pubblicate, perché l'interfaccia pubblicata era minimalista e bloccava molte opportunità di ottimizzazione (*).

(*) Nei compiti di codifica / decodifica / codifica (di dati / immagine / suono / compressione video), è noto che determinati stadi di condotte possono annullarsi a vicenda se eseguono l'operazione esattamente opposta / inversa, ad es. G(F(x)) == x .

Un'interazione tipica è come:

  1. Il consumatore chiede al produttore se implementa un'interfaccia speciale X che solo il venditore V conosce.
  2. Se sì, Consumer parla con Producer usando l'interfaccia X e verifica se sono esattamente opposti (# 1).
  3. Se sì, il Consumatore chiede al produttore il suo "livello superiore" (cioè bypassando Producer) (n. 2) in modo che entrambi vengano annullati.

(# 1) e (# 2) sono funzionalità che mancano nell'interfaccia di pubblicazione minimalista. A prima vista sembra che il venditore possa avere la possibilità di fornirli, ma scegliere di non .

Potrebbe anche essere il caso che fornire tali interfacce orientate alla prestazione danneggi gravemente lo spazio dei nomi.

Il risultato finale è che ogni volta che un programmatore fornisce la propria implementazione di una certa classe, o (i) fallisce miseramente, o (ii) esegue molto lentamente, perché non potrebbe interagire con il resto della suite utilizzando le interfacce interne con prestazioni migliorate conosciute solo da quella suite .

Si tratta di un problema più frequente con alcuni sapori della tecnologia Object-Oriented? O è più comune con alcuni sapori di ingegneria basata su componenti?

I sostenitori di OOP sosterranno che il refactoring e la pubblicazione di tali interfacce risolverebbero il problema. Ciò presuppone che sia possibile distribuire una nuova versione della libreria insieme a una nuova serie di interfacce. Per alcune tecnologie questo non è possibile.

Il modo in cui conta è che è QueryInterface consente la query run-time (ed esegue risposta temporale) di interfacce aggiuntive implementate da una classe. Il suo equivalente Java sarebbe come una libreria che fa un uso pesante di instanceof per le interfacce interne al pacchetto.

Ai revisori: sono aperto a suggerimenti su come tagliare la domanda alla sua essenza.

Il termine corretto sembra essere Mixin , grazie a questo domanda .

Questa risposta è parzialmente pertinente, ma il mio esempio si concentra sulle opportunità perse per le ottimizzazioni all'interno di una singola libreria. In sostanza, se un implementatore di terze parti non ha fatto entrambe le cose:

  1. Implementa sia il codificatore che il decoder
  2. Implementa la propria interfaccia proprietaria sia sull'encoder che sul decoder, al fine di rilevare e bypassare le operazioni che si annullano a vicenda

Quindi l'implementazione otterrà solo "prestazioni di base" quando interagirà con codificatori / decodificatori diversi da altri fornitori.

    
posta rwong 17.01.2012 - 06:58
fonte

1 risposta

2

Come regola generale, Public API dovrebbe non cambiare nel tempo (o almeno dovrebbe essere stabile) in modo che le applicazioni esistenti che dipendono da esse non si interrompano mentre più funzionalità per applicazioni aggiuntive sono supportato.

Al contrario, Private API dovrebbe essere consentito (quasi liberamente) senza il quale non è del tutto possibile portare efficacemente quell'evoluzione di cui abbiamo veramente bisogno.

Se trovi che il dato Public API è causa di colli di bottiglia, allora è il problema con l'API precedente in primo luogo. Nel tuo caso specifico, per esempio di transcodifica (che è quello su cui lavoro), Encoding API e Decoding API dovrebbero NON cambiare, ma entrambi i moduli dovrebbero avere API aggiuntive che supporta la transcodifica.

Di corsi, all'interno di tali API, il cambiamento deve essere controllato in modo tale che le classi interne / private non cambino arbitrariamente i loro ruoli / altrimenti ci sono possibilità di rompere il comportamento originale.

Is this a more frequent problem with some flavors of Object-Oriented technology? Or is it more common with some flavors of Component-based Engineering?

NO. Dipende solo dal design non intrinsecamente una limitazione di OO o componenti.

    
risposta data 17.01.2012 - 08:06
fonte

Leggi altre domande sui tag