Domanda

Qual è l'esempio peggiore (dovuto alla prevalenza o alla gravità) dell'inversione dell'astrazione che vedi oggi nella programmazione?

Per quelli di voi che non hanno familiarità con il concetto, l'inversione dell'astrazione sta implementando costrutti di basso livello in cima a costrutti di alto livello. Più precisamente, supponiamo di avere costrutti A e B. B è implementato sopra A, ma A non è esposto da nessuna parte. Pertanto, se hai davvero bisogno del costrutto di livello inferiore A, finisci per implementare A sopra B, quando B viene implementato in termini di A in primo luogo. Vedi http://en.wikipedia.org/wiki/Abstraction_inversion .

È stato utile?

Soluzione

Probabilmente il peggior esempio di abuso di astrazione che abbia mai visto è stato questo fluente C # , che racchiudeva elementi di controllo del flusso di base (if, whiles, espressioni in sequenza) in un'interfaccia fluida.

Quindi il tuo codice perfettamente idiomatico e pulito:

var selectedTextBox = (TextBox)sender,
if (IsAdmin)
{
    selectedTextBox.Enabled = true;
    selectedTextBox.Text = superSecretPassword;
}
else
{ 
    selectedTextBox.Clear();
}

Diventa questo casino:

Cast<TextBox>(sender).
    WithIf(IsAdmin,
        With(selectedTextBox => selectedTextBox.Enabled = true).
        With(selectedTextBox => selectedTextBox.Text = superSecretPassword),
        With(selectedTextBox => selectedTextBox.Clear());

Perché tutto è meglio con lambdas!

Altri suggerimenti

Sembra un argomento piuttosto morto. Risponderò alla mia domanda solo per iniziare una discussione. Direi che la peggiore inversione di astrazione che abbia mai visto è l'uso di classi / interfacce astratte in stile OOP per replicare i puntatori a funzioni. Ad esempio:

interface foo {
    int bar();
}

class myClass1 implements foo {
    // No member variables.

    int bar() {
        // Implementation
    }

    // No other methods.
}

class myClass2 implements foo {
    // No member variables.

    int bar() {
        // Implementation
    }

    // No other methods.
}

Una classe dovrebbe essere una potente astrazione per quando è necessario incapsulare sia lo stato che il comportamento. Un puntatore a funzione è qualcosa di relativamente semplice che viene utilizzato solo per contenere il comportamento. Le funzioni virtuali sono implementate usando matrici di puntatori a funzione, ma molti linguaggi OO non espongono i puntatori a funzione o qualcosa di direttamente equivalente. Si finisce quindi per utilizzare interfacce e classi per implementare funzionalità equivalenti ai puntatori a funzione, e queste classi e interfacce sono esse stesse implementate in termini di puntatori a funzione. Ciò comporta una complessità non necessaria e una riduzione delle prestazioni.

Non sono sicuro che questo stia rispondendo alla tua domanda, ma ho visto questo (e me ne sono reso colpevole) in cui viene usato un bel linguaggio di alto livello come Lisp come se fosse Fortran o anche Assembly lingua, perché questo è il livello al quale era programmatore.

IMHO, è una delle ironie del calcolo che non importa quanto sia alto un linguaggio, se è universale, può essere usato al livello più basso. La sofisticazione non è garanzia di raffinatezza.

L'uso di librerie di raccolte procedurali sul lato client per elaborare set di risultati SQL.

Che ne dici di simulare goto nella programmazione strutturale attraverso l'uso di variabili booleane di flag? Tuttavia, la programmazione strutturale è stata generalmente accettata. Non è forse un'indicazione che l'inversione dell'astrazione non è sempre una cosa negativa ??

Un'altra risposta, o domanda, se non ti dispiace. La parola "astrazione"? hai davvero una definizione? Le astrazioni sono effettivamente buone, cattive o neutre? Voglio dire, capisco che il numero 2 è astratto perché rappresenta ciò che è comune su 2 scarpe, 2 occhi, 2 cicli, ecc. Un'interfaccia IStack può essere astratta perché si applica a cose che si comportano come pile. Ma se la subroutine A chiama la subroutine B significa che è più astratta? Perché siamo così innamorati di questa parola?

EDT: lo sto chiedendo solo perché ho visto persone alzare il naso a "concrete" problemi, pensando che la foresta sia più importante degli alberi.

Non sono sicuro che questo si qualifichi davvero, ma sembra correlato. Quando SQL Server 2005 è uscito con le funzionalità CLR, ho sentito un gruppo di sviluppatori che dicevano cose come " bene, ora possiamo attivare le chiamate ai servizi Web direttamente dalle nostre procedure memorizzate! & Quot; Ho anche visto diversi tutorial su questo. Questi sono alcuni livelli contrastanti di astrazione.

  

Qual è il peggio (a causa di entrambi   prevalenza o gravità) esempio di   inversione di astrazione in cui vedi   programmazione oggi?

Non so se questo conta, ma di solito mi arrabbio quando vedo le classi che prendono il nome dalla loro implementazione invece di a cosa servono . È davvero una specie di notazione ungherese, osserva:

  • CustomerFactory
  • DecisionTreeVisitor
  • AbstractWindowDecorator
  • JsonDataAdapter
  • TabbedDocumentImpl
  • ConcreteListHandler

" Factory " ;, " Visitatore " ;, " Decoratore " ;, " Adapter " ;, " Impl " ;, " Concrete " - a chi importa come è implementato, a cosa serve?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top