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

taviroquai

Aplicações web - Interacção de utilizadores

22 mensagens neste tópico

Boas,

Talvez vocês já se tenham deparado com esta questão nos jogos web-based...

Estava a refazer o jogo Rpgtuga de novo... desta vez em PHP orientado a objectos... mas agora parei outra vez por causa desta questão:

O jogo, na realidade, passa-se apenas na base de dados e o jogador cada vez que interage com o jogo tem que ler da BD. Se utilizar php OO, tenho que criar sempre de novo os objectos (?!?).  :hmm:

A dica que o knitter me indicou foi: Se guardar os objectos na sessão, cada vez que o jogador faz uma acção (faz um pedido HTTP) posso criar apenas instâncias...

Mas para esta solução, a página é gerada sempre no server?!? (ou posso gera-la no cliente com javascript (?!?) :hmm:

As frameworks MVC, tipo code igniter, como fazem esta gestão? Geram a página no server? Então criam os objectos a cada HTTP request ou só instancias?!?  :hmm:

Será que na prática, tiro vantagem usando PHP OO? Qual é a melhor solução para os jogos web-based? O que vocês usam?

Obrigado  :D

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Acho que não percebeste bem o que disse. O paradigma de programação orientada a objectos nada tem a ver com ser WEB, ou em nada está limitado com a questão das ligações HTTP não terem estado.

Nem é da responsabilidade das frameworks ter alguma coisa a ver com a gestão de objectos, tal com MVC nada tem a ver com POO.

Não, não podes gerar os objectos no cliente usando Javascript.

As vantagens do paradigma, de forma simples, estão na forma como programas a aplicação, na forma como resolves os problemas. Isso reflecte-se na qualidade/facilidade de criação de código e manutenção da aplicação.

Se não consegues ver as vantagens então não estarás preparado, a nível de conhecimentos, para programação orientada a objectos, pelo que o melhor caminho poderá estar em ignorares esse paradigma e usares um que já conheces melhor ou que entendes melhor. POO tem várias vantagens mas, como em tudo, tiras partido se souberes o que estás a fazer, senão, e tendo em conta que tens experiência com outro paradigma, é muito simples fazer-se erros.

Mas tentando dar um exemplo de como a programação poderia ser diferente:

Supondo que tens uma classe Monstro, que representa um monstro do jogo. Claro que os seus dados estão guardados em tabelas de um BD para que, entre pedidos e entre utilizadores, o mesmo monstro possa existir, mas isso é outra questão, vamos focar-nos apenas na parte OO.

Com essa classe podes criar um monstro, e sobre ele efectuares acções, por exemplo monstro.atacar(), monstro.morrer(), monstro.comer(), monstro.getLoot(), etc. E desta forma teres o código organizado de uma forma que representa melhor o mundo real. Neste caso os monstros existem e têm acções associadas que fazem sentido. Esta classe terás os métodos necessários para aceder à BD e guardar alterações, apagar-se, etc. e encapsula todas as operações do objecto monstro.

Com isto consegues independência no código, se mudares de uma BD para um ficheiro de texto não mudas nada no código, apenas na classe monstro, porque todo o código não faz acessos directos à tabela, apenas trabalha com o objecto, esse sim, o único responsável por saber como é que ele próprio se grava. Existe mais modularidade, maior independência de código, é mais fácil identificar erros de concepção, porque a forma como programas está mais próxima da forma do mundo real, enfim, trás vantagens a nível de desenvolvimento e de manutenção de código que usando uma programação baseada em funções apenas não consegues ter.

É uma questão de paradigma e o paradigma não está dependente da tecnologia, não interessa se é PHP, Java, C#, C++, se é WEB ou desktop, tudo isso é irrelevante a discussão sobre POO.

Pessoalmente, a minha opção é usar POO mas confesso que por vezes é complicado atinar com o paradigma e poderá ser mais simples para o programador não usar POO.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Percebi o que me disseste quanto a OO... e é com métodos desses que estou a incluir na classe monstro... o problema não é esse... não estou a questionar o POO em si mas sim, como aplicar na web para aplicações em que os utilizadores interagem por meio de uma BD.

A questão pertinente é, volto a dizer, se o cliente quando faz um pedido HTTP e tem que ler da BD, se também tem que criar novamente os objectos, ou como disseste, apenas as instâncias porque os objectos podem ser criados e guardados na sessão, usando PHP OO.

Outra coisa... já sei que nada tem a ver mas no gostava de saber...

As frameworks MVC, tipo code igniter, como fazem esta gestão? Geram a página no server? Criam os objectos (se a framework usar OO) a cada HTTP request ou só instancias?!?  :hmm:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Percebi o que me disseste quanto a OO... e é com métodos desses que estou a incluir na classe monstro... o problema não é esse... não estou a questionar o POO em si mas sim, como aplicar na web para aplicações em que os utilizadores interagem por meio de uma BD.

Não me parece que percebas :P, porque se dizes que estás a usar esses métodos, e então a usar POO, não há mais nada a fazer :D

A questão pertinente é, volto a dizer, se o cliente quando faz um pedido HTTP e tem que ler da BD, se também tem que criar novamente os objectos, ou como disseste, apenas as instâncias porque os objectos podem ser criados e guardados na sessão, usando PHP OO.

Novamente está aqui uma confusão, objectos ou instâncias é a mesma coisa, e só guardas na sessão se for necessário, ou pertinente para o jogador. Um objecto que represente a personagem é pertinente manter me sessão, outros nem por isso.

As frameworks MVC, tipo code igniter, como fazem esta gestão? Geram a página no server? Criam os objectos (se a framework usar OO) a cada HTTP request ou só instancias?!?  :hmm:

O que é que gerar a página tem a ver com usar objectos, nada, usar ou não objectos impede ou modifica o facto de que a cada pedido HTTP tenhas de gerar uma página nova.

E as frameworks não fazem qualquer gestão dos objectos, tu é que tens de fazer, senão elas programavam por ti :D

A cada pedido terás de instanciar o que não for persistente, naturalmente terás de instanciar os objectos que precisas tal como terias de ler os dados e guardar em variáveis, isso não muda muito, o que muda é a forma como programas essas acções e como o código fica organizado.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Novamente está aqui uma confusão, objectos ou instâncias é a mesma coisa, e só guardas na sessão se for necessário, ou pertinente para o jogador. Um objecto que represente a personagem é pertinente manter me sessão, outros nem por isso.

Objectos e instâncias não é a mesma coisa... só faz sentido guardar na sessão os objectos. As instâncias devem conter novos dados actualizados da BD... é isto não é? É.

...senão elas programavam por ti :P

Tas a brincar comigo...

A cada pedido terás de instanciar o que não for persistente, naturalmente terás de instanciar os objectos que precisas tal como terias de ler os dados e guardar em variáveis, isso não muda muito, o que muda é a forma como programas essas acções e como o código fica organizado.

Era isto que queria confirmar... podias ter dito logo... obrigado  :D

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Objectos e instâncias não é a mesma coisa... só faz sentido guardar na sessão os objectos. As instâncias devem conter novos dados actualizados da BD... é isto não é? É.

Objectos e instâncias SÃO a mesma coisa.

Um Objecto é uma instância de uma classe, onde instância significa a concretização de uma classe, isto é, instanciar é o mesmo que "criar".

Exemplo, se "Ser Humano" for classe, então "José" é uma instância de "Ser Humano" (Objecto), que apesar de ter todas as características da classe "Ser Humano", é completamente diferente e (independente) das outras instâncias de "Ser Humano", por exemplo "Maria", "Joaquim", etc...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Objectos e instâncias não é a mesma coisa... só faz sentido guardar na sessão os objectos. As instâncias devem conter novos dados actualizados da BD... é isto não é? É.

como o cgoncalves te disse, não, objectos e instâncias são exactamente a mesma coisa. Nomes diferentes para a mesma entidade, onde um objecto resulta de um processo de instanciação. Objecto designa a mesma coisa que uma instância, a concretização de uma classe.

Tas a brincar comigo...

Não, estou apenas a dizer-te que uma framework nunca pode gerir os objectos por ti, como é que poderia? Se me disseres que em C#/Python/Java existe um gestor de memória que permite controlar alguns aspectos dos objectos, então concordo contigo, agora uma framework criar o objecto por ti, aplicar-lhe lógica de programação, isso não. O que estavas a dizer é algo que é da responsabilidade do programador, é programação.

Era isto que queria confirmar... podias ter dito logo... obrigado  ;)

Mas sempre foi isto que disse, POO nada tem a ver com HTTP, e o facto de teres de criar sempre objectos ou ler sempre da BD, quer uses ou não objectos, está relacionado com o protocolo. Tens de fazer isso porque o protocolo HTTP não permite manter o estado entre pedidos, é algo do HTTP e não do POO.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Não foi isso que perguntaste! :(

Só te posso ajudar respondendo ao que perguntas.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Boas,

Li tudo na vertical, mas se o objectivo é preservar instancias de objectos (se não estou em erro, e se estiver é favor corrigir :( ) podes sempre usar os Magic Methods __sleep e __wakeup (mais informações), que te permitem guardar como arrays os objectos na base de dados, adormecidos, e preservando informação neles contida.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

@Knitter

... Se utilizar php OO, tenho que criar sempre de novo os objectos (?!?).  :hmm:

Tal como me indicaste, posso guarda-los na sessão -> http://www.tonymarston.net/php-mysql/databaseobjects.html#a3f

Mas para esta solução, a página é gerada sempre no server?!? (ou posso gera-la no cliente com javascript (?!?) :hmm:

As frameworks MVC, tipo code igniter, como fazem esta gestão? Geram a página no server? Então criam os objectos a cada HTTP request ou só instancias?!?  :hmm:

No seguimento do artigo anterior, segue http://www.tonymarston.net/php-mysql/infrastructure.html#implementation

Será que na prática, tiro vantagem usando PHP OO?

Uma resposta em http://www.tonymarston.net/php-mysql/databaseobjects.html#a4a

Portanto, não sou o unico a relacionar as questões que fiz no 1º post... tudo isto está relacionado pois estou a falar de uma infra-estrutura... já Einstein dizia: "muitos veem as árvores, mas são poucos os que veem a floresta"  :biggrin:

@yoda.pt

Vou ler sobre esses Magic Methods. Obrigado.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Vou colocar aqui o que tenho até agora...

Este é o ficheiro php que é carregado sempre que o jogador faz um pedido Http:

$conta_id['id'] = $_SESSION['conta'];
$conta = new Conta($conta_id);
$pers = new Pers($conta->toArray());
$area = new Area($pers->getRow(0));
$mapa = new Mapa($area, $html);
include('interpretador.php');

$conta = new Conta($conta_id);
$pers = new Pers($conta->toArray());
$area = new Area($pers->getRow(0));
$mapa = new Mapa($area, $html);

$html->mix($conta->toArray(), 'mapa', '');
$html->mix($pers->getRow(0), 'div_pers_stats', '');
$html->mix($pers->getRow(0), 'div_pers_equip', '');
$html->mix($pers->getRow(0), 'div_pers_inv', '');
$html->set('list_equip_obj_html', $pers->objsEquipListHtmlLink($site));
$html->set('list_inv_obj_html', $pers->objsInvListHtmlLink($site));
$html->set('area_objs_list', $area->areaObjsListHtmlLink($site));
$html->mix ($area->getRow(0), 'game', '');
$html->mix ($mapa->getArray($site), 'div_mapa', '');

O interpretador vai fazer alterações na base de dados conforme a acção do jogador... mas podia fazer essas alterações no objectos e depois cada objecto fazia a sua alteração na BD... mas penso que é um passo desnecessário...

Mas como faço isto funcionar sem ter que criar os objectos de novo (ler os dados da BD de novo após a acção do jogador)? O que tenho que alterar?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Se usares o método que te indiquei, consegues poupar umas queries à bd, mas não todas, pois convem guardares os dados na bd na mesma.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Pois a questão é que, como já disse antes, o jogo no fundo passa-se na BD, os objectos que crio são apenas leituras da BD. Tenho sempre que escrever na BD após as acções do jogador; sempre que faço alterações na BD tenho que ler novos dados para os objectos (criar novos objectos)...

A não ser que faça dois métodos para cada objecto .dbread() e .dbwrite() e cada objecto só vai à BD (query) se for alterado... é isto?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Não percebo a 100% o que pretendes, mas parece-me que estás a complicar uma coisa simples .. Se tu inseres os dados na bd, e se essa query tem sucesso, porquê voltar a fazer uma query para os obter? Basta actualizar o objecto com os valores que acabas-te de inserir .. Além disso, acho que te preocupas demasiado com a bd, mysql é rápido o suficiente para dar conta do recado .. Estou neste momento a trabalhar num sistema que cruza tabelas com mais de 200.000 registos cada, e é na boa ..

Se ainda assim te preocupas com a quantidade de queries, usa ajax.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Se tu inseres os dados na bd, e se essa query tem sucesso, porquê voltar a fazer uma query para os obter? Basta actualizar o objecto com os valores que acabas-te de inserir ..

É isso! Ou então actualizo logo o objecto e depois escrevo na BD... mas tenho sempre que actualizar os dados quer nos objectos quer na BD... não há uma forma de fazer isto de uma vez?

Nunca fiz nada em OO e BD... por isso tenho estas dúvidas quanto à melhor forma de manter consistencia de dados sem fazer procedimentos redundantes...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Actualizar o objecto antes de actualizar a bd pode dar mau resultado, caso a actualização da bd falhe. Uma nota importante : PHP tem pseudo-objectos, não é verdadeiramente objectos .. Não sei se não estás a tentar ir além das capacidades do PHP, mas não tentes complicar um procedimento simples :(

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Back  :) Desculpem se acharem que sou  :wallbash: com este assunto... podem-me chamar os "nomes todos"...

Bom... tive a ler algumas coisas sobre programação orientada a objectos e bases de dados, bases de dados de objectos, mapeamento de objectos em bases de dados relacionais... etc... realmente há muita coisa por aí e bastante complexa... precisava de uma formação aprofundada sobre isso  :D

Eu acho que se programar as classes dos objectos já fico com uma estrutura necessária para os dados do jogo. Preciso simplesmente de um "local" centralizado onde todos os utilizadores possam ler/escrever as instâncias.

Assim sendo, não estou a usar uma base de dados mas sim objectos serializados (não sei se esta palavra existe em português :)) guardados em ficheiros e tenho uma classe Manager que serve para ler/escrever as instâncias dos objectos. Fiz um teste e para ficheiros de 5kb, a leitura/escrita com esta classe demora cerca de 0.01 segundos... será muito/pouco?!?! :-[

Mais medições com este sistema para guardar/ler dados:

Estive a medir o tempo de execução das scripts usando a função microtime(): Para a script que faz o movimento da personagem no mapa, em média demora 0.1 segundo (isto no meu pc em casa)... não sei se é muito ou pouco... se tiver 100 jogadores ao mesmo tempo será 100 x 0.1 = 10 segundos?!?! ou existe algum factor exponencial?!  :confused:

Também medi os requerimentos de memória para carregar as páginas e são cerca de 600kb (carregando classes, html, lendo/escrevendo dos ficheiros com a classe Manager). Será muito???  :confused:

Feedback é sempre bem-vindo :)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Boas,

Não sei se tens algum ganho em escreveres os dados em ficheiro em vez de usar bd ..

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Não sei se tens algum ganho em escreveres os dados em ficheiro em vez de usar bd ..

Tem é o problema da concorrência. Basta ter 2 users a acederem ao mesmo tempo que fica entalado. Usar uma BD evita esse problema pois o SGBD está preparado para isso e fá-lo com mais eficácia do que tu de certeza. :)
0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Bem, ler um pouco de POO e um pouco de Bases de Dados não é suficiente :), POO só por si é bastante informação para perceber correctamente e assimilar, bem como para colocar na prática.

Mas guardar dados em ficheiros, serializando, não será uma boa opção. Bases de dados para objectos que tenham performance suficiente só conheço para Java, não quer dizer que não existam para outras tecnologias, mas não precisas de deixar de usar a BD, aliás, até tem as suas vantagens continuares a usar a BD.

Tentando explicar, passará por criares as classes que representem as tuas entidade, classe Monstro, classe Pessoa, classe XPTO, essas classes poderão saber guardar-se nas BD, sabendo em que tabelas ficam, que campos têm, etc, ou pode deixar esse controlo para um gestor. Depois, quer sejam as classes a saber "guardar-se" ou seja tarefa do gestor, existirá uma classe de controlo que aplica as diversas regras do jogo, carrega os objectos, mantém registo deles, etc.

A forma de implementação poderá ser feita de várias maneiras, mas guardas os objectos serializados é algo que não terá a performance que pretendes.... sinceramente não sei como ir explicando sem despejar uma carrada de conceitos de rajada. Mas o que quero transmitir é que podes e deves manter a BD, e podes e deves trabalhar com POO.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Vi neste site http://phpbench.com/ benchmarks de php e lembrei-me de perguntar por email ao autor:

I wonder which method is faster: reading 1000 bytes from a file OR getting that same amount of data from a mysql table using a simple query.

Ele respondeu-me:

"To make your last question short and sweet, gaining information from files is much much faster than getting something from a database... in every case."

Talvez eu seja preguiçoso (ou falta de tempo) e não queira (ou não saiba) criar mais uma estrutura para os dados na BD... estou bastante satisfeito com as classes de objectos... é o que preciso. Vejo que a grande vantagem de tambem ter uma BD é para o caso que querer mudar de linguagem, de PHP para outra qualquer e não mexia na BD e tinha os dados todos na mesma...  :)

@dj

tou a usar a função flock de php para assegurar os acessos um de cada vez... espero que resulte...

@knitter

Eu sei que ler um pouco não é suficiente e por isso mesmo disse que precisava de uma formação aprofundada sobre essas matérias.

Isso era o ideal

Tentando explicar, passará por criares as classes que representem as tuas entidade, classe Monstro, classe Pessoa, classe XPTO, essas classes poderão saber guardar-se nas BD, sabendo em que tabelas ficam, que campos têm, etc, ou pode deixar esse controlo para um gestor. Depois, quer sejam as classes a saber "guardar-se" ou seja tarefa do gestor, existirá uma classe de controlo que aplica as diversas regras do jogo, carrega os objectos, mantém registo deles, etc.

Isso era perfeito... :)

Por agora deixa-me ver o rendimento do acesso aos ficheiros... de a coisa não resultar em termos de eficiencia, essa é a solução :)

Obrigado pessoal pelas vossas dicas...

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