Pergunta

O que é pior (devido à prevalência ou gravidade) exemplo de abstração inversão que você vê na programação de hoje?

Para aqueles de vocês que não estão familiarizados com o conceito, a abstração inversão é a implementação de baixo nível constrói no topo de alto-nível de construções.Mais precisamente, suponha que você tenha constrói A e B.B é implementado em cima de Um, mas não está exposto em qualquer lugar.Portanto, se você realmente precisa de nível inferior construir Uma, você acaba de implementar Uma em cima da B, quando B é implementado em termos de Um em primeiro lugar.Ver http://en.wikipedia.org/wiki/Abstraction_inversion.

Foi útil?

Solução

Provavelmente o pior exemplo de abuso de abstração que eu já vi foi Este C# fluente, que envolveu elementos básicos de controle de fluxo (se, whiles, expressões sequenciadas) em uma interface fluente.

Então, seu código limpo perfeitamente idiomático:

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

Torna -se essa bagunça:

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

Porque tudo está melhor com Lambdas!

Outras dicas

Parece um tópico bastante morto. Vou responder minha própria pergunta apenas para iniciar alguma discussão. Eu diria que a pior inversão de abstração que eu vi é usar classes/interfaces abstratas no estilo OOP para replicar ponteiros de função. Por exemplo:

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

Uma classe deve ser uma abstração poderosa para quando você precisa encapsular o estado e o comportamento. Um ponteiro de função é algo relativamente simples que é usado para conter apenas comportamento. As funções virtuais são implementadas usando matrizes de ponteiros de função, mas muitos idiomas OO não expõem ponteiros de função ou qualquer coisa diretamente equivalente. Portanto, você acaba usando interfaces e classes para implementar a funcionalidade equivalente a ponteiros de função, e essas classes e interfaces são implementadas em termos de ponteiros de função. Isso leva à complexidade desnecessária e à diminuição do desempenho.

Não tenho certeza se isso está respondendo à sua pergunta, mas vi isso (e fui culpado disso) onde uma boa linguagem de alto nível como Lisp é usada como se fosse fortran ou mesmo linguagem de montagem, porque Esse é o nível em que o programador estava.

IMHO, é uma das ironias de computação que, por mais que seja um idioma de nível alto, se for universal, pode ser usado no nível mais baixo. A sofisticação não é garantia de sofisticação.

O uso de bibliotecas de coleções processuais do lado do cliente para processar conjuntos de resultados SQL.

Como sobre a simulação de ir para programação estrutural através do uso de sinalizador booleano variáveis?No entanto, programação estrutural tornou-se geralmente aceites.Esta não é uma indicação de que a abstração inversão não é sempre uma coisa ruim??

Outra resposta, ou pergunta, se você não se importa. A palavra "abstração" realmente tem uma definição? As abstrações são realmente boas, ruins ou neutras? Quero dizer, eu entendo que o número 2 é abstrato porque significa o que é comum em 2 sapatos, 2 olhos, 2 ciclos, etc. Uma interface ISTack pode ser abstrata porque se aplica a coisas que agem como pilhas. Mas se a sub -rotina A Sub -rotina B significa que é mais abstrata? Por que estamos tão apaixonados por essa palavra?

EDT: Só estou perguntando porque vi pessoas subirem seus narizes em questões "concretas", pensando que a floresta é mais importante que as árvores.

Não tenho certeza se isso realmente se qualifica, mas parece relacionado. Quando o SQL Server 2005 saiu com os recursos do CLR, ouvi um monte de desenvolvedores dizendo coisas como "Bem, agora podemos disparar chamadas de serviço da web diretamente de nossos procedimentos armazenados!" Eu também vi vários tutoriais sobre como fazer isso. Esses são alguns níveis conflitantes de abstração.

Qual é o pior exemplo (devido à prevalência ou gravidade) de inversão de abstração que você vê na programação hoje?

Não sei se isso conta, mas geralmente fico irritado quando vejo aulas com o nome deles implementação ao invés de para que eles são. É realmente um tipo de notação húngara, observe:

  • CustomerFactory
  • DecisionTreevisitor
  • AbstractWindowDecorator
  • JSONDATAADAPTER
  • TabbedDocumentImpl
  • Concretélio

"Factory", "Visitante", "Decorador", "Adaptador", "Impl", "Concrete" - quem se importa com a implementação, para que é usado?

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top