[Tutorial] Programaзгo modular
#1

Programaзгo Modular


A programaзгo modular, tambйm conhecido por Modularidade й um conceito onde o sistema ou software й divido em partes distintas. O conceito de modularidade passa por criar mуdulos com funзхes diferentes e usar um mуdulo principal, por exemplo:

PHP Code:
Soma(x,y) return printf("%d + %d = %d",x,y,(x+y));
Divisao(x,y) return printf("%d/%d = %d",x,y,(x/y));
Multiplicao(x,y) return printf("%d*%d = %d",x,y(x*y));
Subtracao(x,y) return printf("%d-%d = %d",x,y,(x-y));
main()
{
    
Soma(2,5);
    
Divisao(2,5);
    
Multiplicao(2,5);
    
Subtracao(2,5);

Neste exemplo jб podemos verificar a existкncia da modularidade, ou seja, nуs criamos funзхes responsбveis por tarefas ou algoritmos, em vez de colocarmos tudo em uma sу parte nуs separamos em pequenas partes e depois juntamos tudo.

Com isto deu-se a criaзгo de bibliotecas, as tais famosas #includes, fazendo com que cada biblioteca fosse responsбvel por uma determinada tarefa. Jб quando nуs programa-mos pawn temos tendкncia a escrever um cуdigo em apenas um ficheiro e o que acontece й que ele torna-se grande e nуs acabamos-nos por perder no meio do cуdigo em si.

As pessoas que usam a modularidade pode-se dizer que sгo pessoas mais organizadas, pessoas que se preocupam com a estйtica do cуdigo e preocupam-se em nгo se perder no meio do oceano. Isto porque se separar-mos tudo й mais fбcil encontrar algo e esse algo por vezes pode ser um bug.

Um exemplo da programaзгo modular й o Paradise City RPG, o Lуs desenvolveu o gamemode em mуdulos tornando o mesmo bastante organizado e fбcil de outros entenderem, nos caso de haverem mais developers claro.



A ideia de como dividir o gamemode em mуdulos depende bastante de cada um e nгo existe uma regra global, eu pessoalmente divido por sistemas, ou seja, se for o sistema de carros й uma coisa, casa outra, jogador outra, por ai a diante.

Agora claro existem questхes tйcnicas como por exemplo, tenho de definir as includes em todos os mуdulos? Nгo.

Para que nгo sabe a funзгo #include serve apenas para incluir o cуdigo em determinado cуdigo ou seja
calculos.inc
PHP Code:
Soma(x,y) return printf("%d + %d = %d",x,y,(x+y));
Divisao(x,y) return printf("%d/%d = %d",x,y,(x/y));
Multiplicao(x,y) return printf("%d*%d = %d",x,y(x*y));
Subtracao(x,y) return printf("%d-%d = %d",x,y,(x-y)); 
calcular.pwn
PHP Code:
#include <calculos.inc>
main()
{
    
Soma(2,5);
    
Divisao(2,5);
    
Multiplicao(2,5);
    
Subtracao(2,5);

Realidade:
PHP Code:
Soma(x,y) return printf("%d + %d = %d",x,y,(x+y));
Divisao(x,y) return printf("%d/%d = %d",x,y,(x/y));
Multiplicao(x,y) return printf("%d*%d = %d",x,y(x*y));
Subtracao(x,y) return printf("%d-%d = %d",x,y,(x-y));
main()
{
    
Soma(2,5);
    
Divisao(2,5);
    
Multiplicao(2,5);
    
Subtracao(2,5);

Isso й o que acontece quando se usa o #include, entгo vamos agora а pergunta em si.

Quando criamos mуdulos nгo й necessбrio estar a incluir as mesmas includes, o que devemos fazer й incluir as includes principais no ficheiro principal (main.pwn) e depois incluir os mуdulos
PHP Code:
#include <a_samp>
#include <sscanf>
#include <zcmd>
//etc..
//mуdulos
#include "modulos/player.pwn"
#include "modulos/vehs.pwn"
#include "modulos/props.pwn"
//etc.. 
O que acontecerб й que o cуdigo juntarб tudo e como sabemos os compiladores funcionam de cima para baixo, entгo eles iram definir o que й necessбrio em baixo.

Entгo mas e as callbacks do sa-mp, precisa de fazer hook? Nгo necessariamente.

А um tempo atrбs eu tive uma conversa com o y_less sobre usar o Hook Method 7 e fazer a chamada normal das callbacks, entгo ele disse-me que para fazer a chamada normal das callbacks requere disciplina, ou seja, й necessбrio saber o que se esta a fazer para nгo causar problemas no script e segundo ele o y_hooks e os hook methods foram desenvolvidos para trabalharem em transparкncia, ou seja, eles redefinem as callbacks afim do outro programador nгo se esquecer de fazer a chamada.

Quote:
Originally Posted by Y_Less
I mean if you are explicitly calling callbacks in other files, you have to remember to do so. Hooks were developed as most includes used to state something like:

Quote:

To use this include, add "Inc_OnPlayerConnect(playerid);" to "OnPlayerConnect" and "Inc_OnPlayerDisconnect(playerid, reason);" to "OnPlayerDisconnect".

This was unwieldy, frequently ignored, and the primary source of bugs in most people's use of these includes. Hooks were developed to do it transparently.
Um exemplo de chamada й o seguinte:
main.pwn
PHP Code:
public OnPlayerConnect(playerid)
{
    
player_OnPlayerConnect(playerid); //chama o mуdulo player.pwn
    
return 1;

player.pwn
PHP Code:
public player_OnPlayerConnect(playerid)
{
    
//login / registro
    
return 1;

O que acontece й que nуs chama-mos a nossa funзгo personalizada a partir da funзгo "mгe" й como estivesse-mos a criar uma бrvore onde existem o parent e os childs. Na minha opiniгo nгo existe nenhuma necessidade de usar y_hooks ou qualquer mйtodo hooks ao desenvolver um gamemode em mуdulos isto porque sendo o programador o ъnico desenvolvedor ou a equipa os ъnicos nгo existe necessidade de trabalhar nessa transparкncia pois ambos tкm conhecimento do que estгo a fazer e por sua vez nгo se irгo esquecer de ligar o parente а child.

Isto tambйm й um mйtodo bastante usado no LS-RP, por exemplo, eles quando utilizam funзхes como OnPlayerConnect eles fazem desta forma Damian_OnPlayerConnect , Mmartin_OnPlayerConnect, etc..

Isto й uma boa forma de organizaзгo e para quem deseja trabalhar nesta бrea devem levar em consideraзгo isto pois caso contrбrio pode-se tornar complicado trabalhar em equipa.

Nгo sei se o tutorial estб grande coisa, jб nгo faзo а algum tempo, mas pronto, como fizeram-me um pedido decidi vir aqui esclarecer umas dъvidas e expor a minha opiniгo e conhecimento, obrigado a todos!
Reply
#2

Bom tutorial... Apesar de ser bem simples, tem gente que nгo sabe
Reply
#3

O tutorial estб уtimo, parabйns.
Reply
#4

Й um bom mйtodo de organizaзгo, principalmente para projetos muito grandes.

Parabйns Gonзalo, pelo visto continuas um bom programador

Sucesso
Reply
#5

Um outro exemplo de organizaзгo й do PPC_Trucking. A versгo do PowerPC603 й organizada por diversas includes (Dialogs,Definiзхes,Comandos,Salvamento,Profissхes )... E realmente, fica algo mais organizado e melhor.
Reply
#6

Hб algum modo de criptografar os dados dos mуdulos?
Exemplo: No GameMode ele й criptografado em AMX.
Reply
#7

Sensacional, de fato. Parabйns pelo bom trabalho Gonзalinho.

Quote:
Originally Posted by Luan Argolo
View Post
Hб algum modo de criptografar os dados dos mуdulos?
Exemplo: No GameMode ele й criptografado em AMX.
E qual seria a necessidade disto?
Reply
#8

Desde sempre que utilizo esse tipo de mйtodo em programaзгo ligada a sa-mp nunca me arrependi de o fazer.

Contudo se nгo for bem pensada podem vir a ter problemas.

Usar hooks ou "Damian_OnPlayerConnect" da no mesmo isso ja vai da preferкncia de cada um.

Quote:
Originally Posted by Luan Argolo
View Post
Hб algum modo de criptografar os dados dos mуdulos?
Exemplo: No GameMode ele й criptografado em AMX.
pra que?
Reply
#9

Nгo hб a necessidade de criptografar os arquivos dos mуdulos, visto que quando o arquivo principal й compilado, os mуdulos nгo mergem ao arquivo principal assim como as includes fazem. Sendo assim, se descompilarem o arquivo principal, o arquivo se torna inutilizбvel, visto que sу terб o cуdigo fonte do arquivo principal. Ou seja, um gamemode modularizado й muito seguro, de fato.

Bom tutorial.
Reply
#10

Quote:
Originally Posted by Lуs
View Post
Sendo assim, se descompilarem o arquivo principal, o arquivo se torna inutilizбvel, visto que sу terб o cуdigo fonte do arquivo principal. Ou seja, um gamemode modularizado й muito seguro, de fato.
Na verdade nao tenho a certeza se й bem assim, visto que as includes tbm sao colocadas no .amx principal por isso acho que fica tudo no .amx...

Mas irei confirmar amanha se me lembrar e se tal edito este post aqui.
Reply


Forum Jump:


Users browsing this thread: 2 Guest(s)