Re: [oil-devel] Parâmetros do 'newservant'
Renato Cerqueira
rcerq at inf.puc-rio.br
Fri Apr 18 11:38:04 GMT+2 2008
hehe... essa discussão é bem interessante considerando que estamos
falando de
uma linguagem que oferece um tipo de dado bem flexível para esse tipo
de problema (tabelas...) ;-)
abraços,
Renato
On Apr 18, 2008, at 9:49 AM, Renato Maia wrote:
> Olá pessoal.
>
> Obrigado por todas as respostas. Já que vocês foram unânimes sobre a
> opção (b), vou tentar implementá-la. Mas vou restringi-la a API mais
> externa do OiL, ou seja, não vou alterar API da faceta
> 'ServantBroker.broker'.
>
> Não há nada de errado no que o Amadeu disse, pelo contrário.
> Qualquer componente da arquitetura do OiL pode ser substituído, como
> mudar a implementação do ServerBroker só para alterar a ordem dos
> parâmetros. Entretanto, quanto mais genéricos conseguirmos modelar
> os componentes, mais poderá ser reutilizado. Por exemplo, acredito
> que como a arquitetura do OiL está hoje, é possível reutilizar todos
> os componentes da arquitetura com suporte a definição de tipos em
> todos os protocolos que precisem desse suporte. Não acho que ficaria
> legal, fazer com que cada protocolo implementasse um 'ServerBroker'
> ligeiramente diferente toda vez. O que eu quero dizer é que quanto
> mais componentes conseguirmos deixar no 'oil.arch.
> {base,cooperative,typed}', melhor, pois eles formam a base
> reutilizável do framework e portanto menos trabalho para quem for
> implementar suporte para um novo protocolo no OiL. O ideal é
> analisar as necessidades mais comuns de diferentes protocolos e
> fatorá-las em componentes genéricos que possam ser reutilizados.
>
> Sem dúvida a opção (a) é péssima para os usuários de protocolos que
> exijam alguma informação na criação do servant, tal como a interface
> dele. Isso eu já sabia e por isso não mandei para 'oil-users at ...',
> pois lá todos seriam unânimes contra a opção (a) como foi com vocês.
> O meu problema aqui, que eu não sei se consegui ser claro o
> suficiente no último mail, é que a única informação que pode ser
> dada na criação de um servant, independente de qualquer protocolo, é
> a chave ou identificador do objeto. Como o Amadeu comentou muito
> bem, há várias outras informações que podem ser associadas a um
> servant que permitam implementar protocolos mais elaborados. Por
> exemplo, CORBA usa informações de interface para enviar dados
> codificados sem precisar informar os tipos desses dados, permitindo
> um stream menor. Porém é necessário garantir que a mesma descrição
> de interface esteja corretamente presente nos dois pontos da
> comunicação.
>
> Portanto o fato é: informar a chave de um servant é um recurso
> presente em absolutamente todos os "flavors" do OiL. Entretanto
> especificar a interface, apesar de unânime em todos os protocolos
> "mainstream", não é necessário em todos os protocolos. O LuDO é um
> protocolo de mentira, mas que ilustra várias possibilidades para
> protocolos reais, em particular protocolos "dinâmicos", ou seja,
> feitos para linguagens dinâmicas. Portanto não é de estranhar que
> ele seja diferente de protocolos como CORBA, SOAP, JavaRMI que são
> projetados para ser utilizados com linguagens mais estáticas. Um
> exemplo de protocolo que é parecido com o LuDO em vários aspectos é
> o Pyro que é projetado para Python, outra linguagem dinâmica. Bom,
> para resumir, o meu problema é como estender a operação 'newservant'
> para incluir novos parâmetros. Pensando na generalidade da
> arquitetura básica do OiL, o ideal é estender uma operação como a
> 'newservant' incluindo parâmetros adicionais ao seu final, pois
> assim fica fácil escrever implementações genéricas como o Amadeu
> comentou:
>
> function ServerBroker.broker:object(impl, key, ...)
> -- manipula o parâmetro key para que isso não precise ser
> -- feito novamente para cada protocolo, pois esse é um
> -- recurso fatorado para implementação básica do OiL.
> if key == nil then key = self:generate_unique_id(impl) end
>
> -- registra o servant com a chave e repassa quaisquer
> -- informações adicionais
> return self.dipatcher:register(impl, key, ...)
> end
>
> Entretanto, essa forma de extensão fica ruim para o caso de CORBA e
> outros protocolos tipados, porque quem usa um protocolo não está
> interessado na arquitetura interna do OiL ou na sua generalidade.
> Por isso é um problema para mim e resolvi fazer essa discussão com
> vocês. Mas depois das respostas de vocês, acho que o problema é mais
> em como oferecer um açúcar para não irritar os usuários CORBA e cia.
> com os detalhes sobre a generalidade da implementação do OiL. Por
> isso vou fazer algum bacalhau na API externa do OiL, tal como:
>
> if ORB.requiresTypeInfo then -- ainda não sei como descobrir isso.
> function ORB:newservant(impl, iface, key)
> assert(type(key) == "string", "invalid object key")
> return self.ServerBroker.broker:object(impl, key, iface)
> end
> else
> function ORB:newservant(impl, key, ...)
> assert(type(key) == "string", "invalid object key")
> return self.ServerBroker.broker:object(impl, key, ...)
> end
> end
>
> Sei que é uma solução porca, mas não sei como fazer isso melhor.
> Sugestões?
>
> Obrigado mais uma vez pelas respostas.
> Um abração!
>
>
> --
> Renato Maia
> PhD student at PUC-Rio
> __________________________
> http://www.inf.puc-rio.br/~maia/
>
>
>
> _______________________________________________
> OiL-Devel mailing list
> OiL-Devel at lists.luaforge.net
> http://lists.luaforge.net/cgi-bin/mailman/listinfo/oil-devel
More information about the OiL-Devel
mailing list