2008-11-19 16 views
9

¿Cuál es el peor ejemplo de inversión de abstracción (ya sea por prevalencia o gravedad) que se ve en la programación actual?Inversión de la peor inversión

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

+1

wiki de la comunidad? – wheaties

Respuesta

9

Probablemente el peor ejemplo de abuso de abstracción que he visto alguna vez fue this fluent C#, que envolvió los elementos básicos de control de flujo (si, a la vez, expresiones secuenciadas) en una interfaz fluida.

Así que su perfección idiomática, código limpio:

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

Se convierte en este lío:

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!

1

No estoy seguro de si esto responde su pregunta, pero he visto esto (y he sido culpable de ello) cuando un buen lenguaje de alto nivel como Lisp se usa como si fuera Fortran o incluso Lenguaje ensamblador, porque ese es el nivel en el que se encontraba el programador.

En mi humilde opinión, una de las ironías del cálculo es que, independientemente de cuán alto sea el nivel del idioma, si es universal, puede utilizarse al nivel más bajo. La sofisticación no es garantía de sofisticación.

+2

No realmente. Los lenguajes de alto nivel a menudo están diseñados para que pueda programar un nivel más bajo si no hay una buena manera de expresar lo que quiere en un nivel alto. Esto es más como simplemente no usar una abstracción, en lugar de invertirla. – dsimcha

2

Esto parece un tema bastante muerto. Responderé a mi propia pregunta solo para comenzar una discusión. Diría que la peor inversión de abstracción que he visto es el uso de clases/interfaces abstractas 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 poderosa abstracción para cuando se necesita encapsular el estado y el comportamiento. Un puntero a la función es algo relativamente simple que solo se utiliza para contener el comportamiento. Las funciones virtuales se implementan usando matrices de punteros a función, pero muchos lenguajes OO no exponen punteros a funciones ni nada directamente equivalente. Por lo tanto, terminan usando interfaces y clases para implementar funcionalidades equivalentes a punteros de función, y estas clases e interfaces se implementan ellas mismas en términos de punteros de función. Esto lleva a una complejidad innecesaria y un rendimiento reducido.

+1

Odio ver que una pregunta interesante también muera. Como puede ver en mi (s) otra (s) respuesta (s), creo que hay demasiado culto a la idea en este campo (como el uso de la palabra "poderoso") en lugar de una simple explicación de los pros y los contras. –

+4

C#, F #, Delphi, C++, Python, Ruby, OCaml, Perl, Javascript, Scala, Lisp + Clos, D, y una gran cantidad de otros lenguajes OOP que admiten lambdas y funciones de primera clase. Java es realmente el único lenguaje "grande" que queda para agregar soporte para punteros de función. – Juliet

0

Otra respuesta, o pregunta, si no te importa. ¿La palabra "abstracción" en realidad tiene una definición? ¿Las abstracciones son 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 abstracto porque se aplica a cosas que actúan como pilas. Pero si la subrutina A llama a la subrutina B ¿significa eso que es más abstracto? ¿Por qué estamos tan enamorados de esta palabra?

EDT: Solo estoy preguntando porque he visto gente que se molesta por cuestiones "concretas", pensando que el bosque es más importante que los árboles.

0

No estoy seguro de si esto realmente califica, pero parece relacionado. Cuando SQL Server 2005 salió con las capacidades CLR, escuché a un grupo de desarrolladores decir cosas como "bueno, ¡ahora podemos despedir las llamadas al 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.

1

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

0

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

No sé si esto cuenta, pero por lo general obtener molestaba cuando veo a clases el nombre de su aplicación en lugar de para que son. Es realmente una especie de notación húngara, observe:

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

"de fábrica", "visitante" , "Decorador", "Adaptador", "Impl", "Concreto": a quién le importa cómo se implementa, para qué se usa?

+3

Factory, Adaptor y Handler son todos usos legítimos para algo en mi opinión: una fábrica fabrica cosas, un adaptador adapta cosas y un manejador maneja cosas. Impl, Concrete y (discutiblemente) visitante son solo notación tonta. –

1

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

+0

Me encanta la respuesta. Sin embargo, evitar las variables de indicador es una de las razones por las cuales los lenguajes estructurados modernos se rompen y continúan, y algunos incluso han etiquetado break y continue. Aun así, sigo usando goto ** ocasionalmente ** para evitar la anidación excesiva y saltar adelante dentro de una función cuando manejo casos especiales. De hecho, hace que el código sea más legible, y tiendo a molestarme cuando me veo obligado a programar en un idioma sin goto. – dsimcha

Cuestiones relacionadas