Pergunta

Outra maneira de fazer esta pergunta é: o que é inversão de controle de acordo com você

Faço esta pergunta porque o artigo da Wikipedia sobre IoC foi sequestrado por um não-OO explicação. Este é retirado do página de discussão e é a partir de 2007:

Tomei a liberdade de reescrever completamente a página, como o conteúdo anterior foi completamente tomado por sentido "orientada a objeto" murmúrio ...

Eu não vejo como inversão de controle faz com que qualquer fora sentido da linguagem OO. Já existem muitas explicações para abrir mão do controle em linguagens procedurais (programação de eventos é um) e puramente linguagens funcionais não precisa de um conceito como inversão de controle, uma vez que têm funções de ordem superior.

Além disso, na artigo onde Martin Fowler elabora sobre IoC ele exclusivamente lida com exemplos OO.

Assim, é IoC exclusivamente um conceito OO, eo que é isso exatamente?

Para mim, IoC tenta transformar funções em dados dentro das limitações que a maioria das linguagens OO impõem, e tenta passar essas funções-como-os dados como argumentos para outras funções. Isso não é a única parte do COI, mas há um pouco disso.

Há também o padrão de design de fábrica, onde as árvores de objetos estão sendo construídos e configurados antes de ser passado.

Para mim, IoC é exclusivamente um conceito OO.

Qual é a sua resposta?

Foi útil?

Solução

Você olha para o problema teórico do ponto de vista de implementao. A primeira questão que se coloca deve ser exatamente o controle você Invert ?

Em seguida, você vai perceber que não importa wether seu um objeto, método, função ou outros enfeites que é passado ao redor, mas o que realmente o código faz.

Em suma, quando você faz Dependency Injection, você inverter o controle da criação e uso de dependências (de recursos).

Quando você dá uma função API do Windows um ponteiro para uma função de retorno, você dar-lhes o controle de chamar a sua função com seus próprios parâmetros.

Então você vê, IoC é apenas um conceito teórico, e é claro, pode haver diferentes implementações práticas do mesmo.

Outras dicas

Inversão de controle definitivamente não é mais um conceito OO.

IoC existe e é usado com bastante freqüência em línguas não-OO. É muito comum em C, por exemplo. Um bom exemplo disso é a API Windows -. Qualquer momento que você chamar as funções da API do Windows que funcionam através de chamadas de retorno, você está basicamente usando IoC em sua forma mais primitiva

Por exemplo, dê uma olhada no href="http://msdn.microsoft.com/en-us/library/ms633497.aspx" rel="noreferrer"> EnumWindows função . Usando isso, você passar um ponteiro de função (EnumWindowsProc) para uma biblioteca, e seu código é executado a partir do código da biblioteca.

Compare isso com a definição de inversão de controle da Wikipedia: "Inversão de controle ocorre quando um procedimento de biblioteca chama processo de usuário (s)"

É exatamente o mesmo.

No entanto, IoC torna-se realmente muito poderoso, flexível e fácil de usar quando você adiciona um sistema de tipos rico e muitas das outras ferramentas que vêm com OOP. Isso torna mais comum, já que é "agradável" para trabalhar, mas não existia antes da OOP.

Bem, o conceito de "inversão de controle" parece aplicável em todos os lugares você tem alguma maneira de passar ponteiros de função ao redor. Basicamente, plug-in conceitos e DLLs com assinaturas compatíveis (pense de motoristas, por exemplo) são nada mais que uma forma de IoC.

No entanto, ao usar IoC com um tipo rico e modelo de contêiner, você vai ser basicamente no mundo OO automaticamente. E os conceitos de OOP mapear muito bem a conceitos IoC, especialmente em linguagens que suportam herança múltipla com aulas virtuais puras (ou "interfaces", como aqueles que também são chamados).

Na verdade, a implementação OO do COI está bastante elaborado, porque as funções muitas vezes não são cidadãos de primeira classe.

Como Azder mencionado: IoC é usado para uma série de razões. Vou resumir algumas aqui para convencer:)

A iteração

#ruby
{1,2,3}.each{ |i| puts i }

#haskell
map [1,2,3] ( \i -> write i )

//the stl algorithms
int printint( int i ){ return printf( "%d", i ); }
std::foreach( onetwothree.begin(), onetwothree.end(), &printi );

criação de rosca

CreateThread( NULL, 0, &myFunction, NULL, 0, NULL );

General evento despacho

//javascript
document.getElementById( "mybutton" )
            .addEventListener( 
                 function(e){ alert("buttonPressed") } );

Nenhum destes exemplos são orientada a objectos, q.e.d ..

scroll top