Pregunta

¿Cuál es el peor ejemplo (ya sea de prevalencia o gravedad) de inversión de abstracción que ves en la programación de hoy?

Para aquellos de ustedes que no están familiarizados con el concepto, la inversión de abstracción está implementando construcciones de bajo nivel además de las construcciones de alto nivel. Más precisamente, suponga que tiene las construcciones A y B. B está implementado encima de A, pero A no está expuesto en ninguna parte. Por lo tanto, si realmente necesita la construcción A de nivel inferior, termina implementando A sobre B, cuando B se implementa en términos de A en primer lugar. Ver http://en.wikipedia.org/wiki/Abstraction_inversion .

¿Fue útil?

Solución

Probablemente el peor ejemplo de abuso de abstracción que he visto fue este fluido C # , que envolvió elementos básicos de control de flujo (si, mientras, expresiones secuenciadas) en una interfaz fluida.

Entonces, su código perfectamente idiomático y limpio:

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

Se convierte en este desastre:

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

¡Porque todo es mejor con lambdas!

Otros consejos

Esto parece un tema bastante muerto. Contestaré mi propia pregunta solo para comenzar una discusión. Diría que la peor inversión de abstracción que he visto es usar clases / interfaces abstractas de estilo OOP para replicar punteros de función. Por ejemplo:

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.
}

Se supone que una clase es una abstracción poderosa para cuando se necesita encapsular tanto el estado como el comportamiento. Un puntero de función es algo relativamente simple que se usa para contener solo el comportamiento. Las funciones virtuales se implementan utilizando matrices de punteros de función, pero muchos lenguajes OO no exponen punteros de función ni nada directamente equivalente. Por lo tanto, termina utilizando interfaces y clases para implementar una funcionalidad equivalente a punteros de función, y estas clases e interfaces se implementan en términos de punteros de función. Esto conduce a una complejidad innecesaria y a una disminución del rendimiento.

No estoy seguro de si esto responde a su pregunta, pero he visto esto (y he sido culpable de ello) en el que se usa un lenguaje agradable de alto nivel como Lisp como si fuera Fortran o incluso la Asamblea lenguaje, porque ese es el nivel en el que estaba el programador.

En mi humilde opinión, es una de las ironías de la computación que no importa cuán alto sea un lenguaje, si es universal, puede usarse en el nivel más bajo. La sofisticación no es garantía de sofisticación.

El uso de bibliotecas de colecciones de procedimientos del lado del cliente para procesar conjuntos de resultados de SQL.

¿Qué tal simular goto en la programación estructural mediante el uso de variables booleanas de bandera? Sin embargo, la programación estructural ha sido generalmente aceptada. ¿No es esto una indicación de que la inversión de abstracción no siempre es algo malo?

Otra respuesta, o pregunta, si no te importa. ¿La palabra "abstracción" en realidad tiene una definición? ¿Las abstracciones son realmente buenas, malas o neutrales? Quiero decir, entiendo que el número 2 es abstracto porque representa lo común de 2 zapatos, 2 ojos, 2 ciclos, etc. Una interfaz IStack puede ser abstracta porque se aplica a cosas que actúan como pilas. Pero si la subrutina A llama a la subrutina B, ¿eso significa que es más abstracta? ¿Por qué estamos tan enamorados de esta palabra?

EDT: solo pregunto porque he visto a personas que levantan la nariz en "concreto" problemas, pensar que el bosque es más importante que los árboles.

No estoy seguro de si esto realmente califica, pero parece estar relacionado. Cuando SQL Server 2005 salió con las capacidades de CLR, escuché a un grupo de desarrolladores decir cosas como "bueno, ahora podemos disparar llamadas de servicio web directamente desde nuestros procedimientos almacenados". También vi varios tutoriales sobre cómo hacer esto. Esos son algunos niveles conflictivos de abstracción.

  

¿Qué es lo peor?   prevalencia o gravedad) ejemplo de   inversión de abstracción que ves en   programación hoy?

No sé si esto cuenta, pero generalmente me molesta cuando veo clases nombradas después de su implementación en lugar de para qué sirven . Es realmente una especie de notación húngara, observe:

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

" Fábrica " ;, " Visitante " ;, " Decorador " ;, " Adaptador " ;, " Impl " ;, " Concreto " - ¿a quién le importa cómo se implementa, para qué se utiliza?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top