• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

joaoqalves

Construção de uma aplicação modular

10 mensagens neste tópico

Boa tarde pessoal, venho aqui por uma dúvida que a mim me parece muito pertinente:

estou numa fase de remodelação e de repensamento das minhas práticas e técnicas de programação e, desde há muito, queria que as minhas aplicações fossem modulares, ou seja, quero dizer que eu faria o "core" da aplicação e depois podia, ou não, adicionar os "módulos", "plugins", "extensões", whatever, que fossem necessários. Ora bem, qual é a melhor forma de fazer isto ?

Ultimamente tenho-me virado para a web (asp[.net] e php, e ando a ver se entro no Ruby), e tanto o asp.net, como o php ou o Ruby têm POO. Bem, não sei se vocês têm propriamente experiência nisto, contudo mais do que eu alguns daqui terão.

Normalmente, quando me pedem uma aplicação, eu faço mesmo à medida, sem tirar nem pôr, o que depois me acarreta mais trabalho e mais sacrifício à hora de implementar algumas coisas e remodelar outras. Bem sei que pode ser bem mais trabalhoso e complicado criar uma aplicação assim, mas sinceramente não me importo, pois estou a fazer aplicações para o meu próprio uso diário, portanto quero as coisas bem feitas. Já agora, para programação "não-web" (C#, Vb.net, Java, etc) pode ser implementado um sistema parecido ou terá de ser algo diferente?

Espero que tenham compreendido o que escrevi, pois nem sabia ao certo de que forma me havia de expressar

Cumps

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Isso é um paradigma importante e que deve quase sempre ser tomado em conta.

Há várias formas de se conseguir esse efeito, sendo umas mais efectivas que outras dependendo tambem da natureza da extensibilidade da aplicação.

O exemplo mais paradigmático que conheço é o das aplicações mozilla, como o firefox por exemplo. O firefox tem um interface definido em XML ( em particular XUL ).

Através de um sistema de overlays é possivel fazers o que quiseres com o interface e as funcionalidades podem seguir no teu plugin implementadas em xml. O manifesto de instalação trata de dizer o que é que faz o quê.

Outro exemplo que é mais simples são os hooks. Podes espalhar hooks pelo teu código em locais estratégicos. Hooks são pequenos fragmentos de código cuja finalidade é providenciar pontos de injecção de código para futuras extensões. Tambem neste caso, a extensão tem quer ter um qualquer tipo de manifesto que especifique que código deve ser inserido e em que sitio.

Para desenvolvimento web aconselho-te experimentares uma framework MVC dessas que praí têm dado tanto que falar.

Se estás a aprender ruby, pode ser uma boa ideia experimentares o famoso ruby on rails.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Isso é um paradigma importante e que deve quase sempre ser tomado em conta.

Há várias formas de se conseguir esse efeito, sendo umas mais efectivas que outras dependendo tambem da natureza da extensibilidade da aplicação.

O exemplo mais paradigmático que conheço é o das aplicações mozilla, como o firefox por exemplo. O firefox tem um interface definido em XML ( em particular XUL ).

Através de um sistema de overlays é possivel fazers o que quiseres com o interface e as funcionalidades podem seguir no teu plugin implementadas em xml. O manifesto de instalação trata de dizer o que é que faz o quê.

Outro exemplo que é mais simples são os hooks. Podes espalhar hooks pelo teu código em locais estratégicos. Hooks são pequenos fragmentos de código cuja finalidade é providenciar pontos de injecção de código para futuras extensões. Tambem neste caso, a extensão tem quer ter um qualquer tipo de manifesto que especifique que código deve ser inserido e em que sitio.

Para desenvolvimento web aconselho-te experimentares uma framework MVC dessas que praí têm dado tanto que falar.

Se estás a aprender ruby, pode ser uma boa ideia experimentares o famoso ruby on rails.

O facto de estar a aprender Ruby não quer dizer que esteja para já :P, e mesmo que estivesse para já , não vou deixar de programar maioritariamente em php, pelo menos até à maioria dos servidores oferecer alojamento de php. Outra coisa importante é de que forma vou fazer essa interface em XML e, lembra-te, que o Mozilla Firefox não é web based, ou seja, pode aceder a coisas que eu não posso, acho eu :D.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Nesse caso aconselho-te uma framework php chamada codeigniter

http://codeigniter.com/

Está bem documentada e é bastante facil de usar.

Acho que te confundi um pouco... só dei o exemplo do firefox para expor uma abordagem que permite o máximo de extensibilidade.

Como tinhas falado em aplicações client side...

Acho que o xul dá para usar remotamente se usares um browser com suporte para ele, mas não te aconselho de todo essa solução.

Independentemente de escolhas. Estas tecnicas são implementáveis em qualquer linguagem.

Basicamente precisas de criar pontos de entrada de código para a tua aplicação. Os dois mecanismos que referi acima funcionam, não é só o xul que usa overlays. As aplicações GTK2 que usam a libglade por exemplo tambem o fazem, e concerteza muitas outras tecnologias.

Um conceito importante aqui é o da herança de classes.

Criar uma clase base com a funcionalidade básica e depois permiter a herança dessa classe de forma a poder extender ou fazer override das funcionalidades base.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

O que queres fazer não é fácil. E é algo que tens de perder muito tempo a pensar. Teres uma plataforma modular não é algo que é feito de um dia pro outro, mas sim algo que vais refinando conforme o passar do tempo. Certamente que irão surgir situações em que não contavas e terás que "afinar" o teu sistema.

Existe uma leitura muito porreira, The Art of Separation of Concerns. AVISO: Leitura muito extensa...

Depois como quiseres elaborar o teu sistema, cabe a ti decidir. Mas como o Pedrotuga referiu se calhar era boa ideia usares uma framework já existente em vez de criares a tua. Estas frameworks já têm em prática o tal "Separação de conceitos" e evita teres de fazer tudo do zero. O mesmo se aplica a bibliotecas, como acesso a base de dados por exemplo. A ideia de quando fizeres um módulo teu é ser o mais abstracto possível, tornado-se fácil conjugar ou substituir um outro módulo teu (ou feito por terceiros).

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Nesse caso aconselho-te uma framework php chamada codeigniter

http://codeigniter.com/

Está bem documentada e é bastante facil de usar.

Acho que te confundi um pouco... só dei o exemplo do firefox para expor uma abordagem que permite o máximo de extensibilidade.

Como tinhas falado em aplicações client side...

Acho que o xul dá para usar remotamente se usares um browser com suporte para ele, mas não te aconselho de todo essa solução.

Independentemente de escolhas. Estas tecnicas são implementáveis em qualquer linguagem.

Basicamente precisas de criar pontos de entrada de código para a tua aplicação. Os dois mecanismos que referi acima funcionam, não é só o xul que usa overlays. As aplicações GTK2 que usam a libglade por exemplo tambem o fazem, e concerteza muitas outras tecnologias.

Um conceito importante aqui é o da herança de classes.

Criar uma clase base com a funcionalidade básica e depois permiter a herança dessa classe de forma a poder extender ou fazer override das funcionalidades base.

A minha ideia (inicial), não era usar uma framework web como base, e se fosse, eu já tinha experimentado a cakePHP e pareceu-me bastante boa, mas nunca vi / testei a codeigniter. A minha ideia inicial é abstrair-me o máximo que puder, com um sistema (básico) de templates (já o tenho feito), e depois uma classes criadas por mim que me ajudem à criação da aplicação e possível reutilização de código sem perdas de tempo. É meu objectivo também que as minhas aplicações funcionem um pouco como o joomla! por exemplo, onde uma pessoa qualquer pode adicionar uma extensão, plugin, a partir de um upload, e que suportasse tanto plugins feitos por mim, como 3rd party.Claro que isto é tudo muito bonito de dizer mas de fazer não, como é óbvio :D O que eu quero fazer é tornar as minhas aplicações com mais ou menos funcionalidades dependendo do utilizador e do uso que lhe vai dar. Imagina que um utilizador quer um plugin que lhe vai colorir código de fonte, mas tenho outro utilizador que não precisa disso para nada.

Eu quero entender, qual é a melhor forma de fazer isso, e depois qual o melhor método (XML, o que seja) e dentro desse melhor método ver como é que as coisas funcionam "por dentro", para poder ser eu a programar e não ter que recorrer a algo que me vai dar mais trabalho a entender do que outra coisa. Prefiro ser eu a criar as coisas, documentadas por mim, do que usar coisas alheias, sobretudo quando essas "coisas" são grandes (como um CMS, por exemplo).

O que queres fazer não é fácil. E é algo que tens de perder muito tempo a pensar. Teres uma plataforma modular não é algo que é feito de um dia pro outro, mas sim algo que vais refinando conforme o passar do tempo. Certamente que irão surgir situações em que não contavas e terás que "afinar" o teu sistema.

Existe uma leitura muito porreira, The Art of Separation of Concerns. AVISO: Leitura muito extensa...

Depois como quiseres elaborar o teu sistema, cabe a ti decidir. Mas como o Pedrotuga referiu se calhar era boa ideia usares uma framework já existente em vez de criares a tua. Estas frameworks já têm em prática o tal "Separação de conceitos" e evita teres de fazer tudo do zero. O mesmo se aplica a bibliotecas, como acesso a base de dados por exemplo. A ideia de quando fizeres um módulo teu é ser o mais abstracto possível, tornado-se fácil conjugar ou substituir um outro módulo teu (ou feito por terceiros).

Betovsky, bem, quanto a isso não acho que seja algo indispensável, o uso de uma framework (embora possa considerar), contudo, como eu já disse em cima, prefiro começar a perder mais tempo agora, e ter muito mais trabalho agora, e depois simplificar de vez isto :P Porque já tenho projectos de médio-grande porte bastante avançados e já me vejo "negro" para fazer algumas coisas (e até está bem documentado), mas como na altura em que os comecei a fazer não tinha todos os conhecimentos que agora tenho, torna-se mais difícil, e ou torno isto mais abstracto e modular, o que não vai ser um mar de rosas, ou quando for hora de implementar alguma coisa que depois venha a precisar, pode ser um "bico de obra".

Quanto às implementações destes sistemas, alguém tem documentos bons para se lerem ? o pedrotuga falou e, muito bem, do possivel uso do XML, mas queria estudar bem o caso e ler bastante :)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Hoje em dia o XML é quase sempre usado no manifesto de instalação.

Terás de criar o teu sistema de pacotes. Tipicamente um .zip com um xml que é o manifesto de instalação e que diz que ficheiros copiar para onde.

Depis é implementares o teu sistema de extensões usando tecnicas como a que eu falei acima.

O joomla 1.5 permite-te criar aplicações baseadas em joomla e definires tu póprio os teus hooks, isso seria um componente. Se quiseres usar os hooks já existentes, então aí crias um módulo. Mas isso é porque o joomla é mais do que uma coisa, é uma aplicação ( um CMS ) mas é tambem uma framework MVC.

Mas não te aconselho a analizares o joomla, está mal documentado, tem mau suporte e a clareza do do código não é nada por aí alem.

Começa por perceber como funciona um sistema de hooks. A leitura que te aconselho é mesmo desbravares mato pelo código fonte de aplicações.

Um software que é relativamente simples de perceber e que tem um sistema de extensões via hooks funcional é o punbb.

Mas só a versão 1.3 que ainda é beta.

Se analisares a forma de funcionamento daquilo aprendes muito.

Eu pelo menos aprendi muita coisa e uso muitos conceitos que aprendi da leitura desse código fonte.

Mas quem diz o punbb diz outra aplicação, eu disse este porque conheço...

O worpress por exemplo tambem está bem documentado e é bastante extensivel...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Acho que bons exemplos foram o Firefox e Frameworks MVC.

Agora o ponto chave para simplificares o processo de planeamento e programação da tua aplicação é pensares em APIs.

Como me parece que queres módulos/plugins/extensões que não vão ser apenas criadas por ti, tens de dar aos utilizadores formas de interagirem com as camadas inferiores da aplicação.

Tou a pensar escrever um artigo, mas não é para já. Aconselho-te sim leres a API do Facebook. Agora abstrai-te e pensa que não existe MODULOS nenhums do Facebook. Era possível criar o Facebook apenas com plugins.

Terás de criar o "kernel":

- dispatcher (Redireciona a aplicação para o modulo/plugin correcto)

- sistema de dados (sistema de base-de-dados, de ficheiros, tudo em camadas e bem abstraido)

- comunicação-inter-modular (maneiras de plugins comunicarem - receber/enviar - com outros plugins)

Depois disto, terás de criar a forma dos plugins: instalação, forma dos ficheiros.

Uma das soluções mais simples para dares funcionalidades aos plugins é criares uma factory (padrão de desenho) que devolva instancias que acedem ás funcionalidades básicas.

Vai falando sobre a tua experiencia :) Acho muito interessante

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Terás de criar o "kernel":

- dispatcher (Redireciona a aplicação para o modulo/plugin correcto)

- sistema de dados (sistema de base-de-dados, de ficheiros, tudo em camadas e bem abstraido)

- comunicação-inter-modular (maneiras de plugins comunicarem - receber/enviar - com outros plugins)

Depois disto, terás de criar a forma dos plugins: instalação, forma dos ficheiros.

Uma das soluções mais simples para dares funcionalidades aos plugins é criares uma factory (padrão de desenho) que devolva instancias que acedem ás funcionalidades básicas.

Isto tudo que referiste já vi implementado em bots como referi no post anterior, e, na minha opinião, o Futurism é mesmo a melhor das 3 implementações que indiquei. :)
0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora