Programación Modular.

Aprende lo que no sabes de este lenguaje y encuentra herramientas y códigos útiles.

Moderador: Ayudantes

Reglas del Foro
  • Si tu código es corto, no crees un tema nuevo para liberarlo, publica un mensaje en el tema [Funciones] ¡Publica tu código aquí!.
  • Si creas una guía, debes explicar el código claramente. Evita poner la explicación en forma de comentarios dentro del mismo y no olvides utilizar el BBCode correspondiente: [Pawn]Código aquí[/Pawn].
  • No postear códigos sin probar. Publicar códigos con errores (que impidan compilar el script para el cual está destinado) en este apartado es motivo de sanción.
  • Si tu código necesita plugins, includes u otros códigos adicionales para funcionar, debes mencionarlo en el mensaje.
  • Si has utilizado códigos de otros autores, recuerda colocar los créditos correspondientes. (El plagio es motivo de sanción).
  • Si tu aporte es para un GameMode en específico, debes publicar el tema en el apartado "Guías y Aportes para GameModes específicos".
Responder
Avatar de Usuario
Dr.Zoidberg
Junior
Junior
Mensajes: 210
Registrado: 27 May 2018 11:55
Ubicación: Un bocata de hipercalamar.
Reputación: 17

19 Sep 2018 20:41

¿Qué es programación Modular?

La programación modular es el desglose o la división del código en módulos según su categoría para que el código sea mas Ordenado, reutilizable y para hacer que el código sea más fácil de leer y rastrear errores con facilidad. Programar modularmente es útil si tu código es muy extenso y si tu proyecto es de gran calado.

Imagen



Ventajas

-Código Ordenado: Hace que tu código, este dividido por módulos los cual cada modulo tendrá su función y se mas fácil y rápido encontrarlo y corregir los errores.

-Lectura de códigos: la programación modular puede hacer que su código sea mucho más fácil de leer con pocas líneas en cada módulo.

-Facilidad de depuración y modificación: un código modularizado generalmente es más fácil de depurar que un código que se ha realizado en un archivo. ¿Por qué es más fácil de depurar? - Los códigos están aislados en un módulo y una vez que se ha identificado un código defectuoso, la reparación puede ser muy fácil. La modificación puede ser útil si un módulo tiene que ser usado una vez más, se puede hacer una modificación simple y el módulo puede reutilizarse nuevamente.

-Múltiples programadores: si trabaja en equipo, cada programador puede trabajar en un módulo diferente y esto lleva a un desarrollo más rápido.

Desventajas

- Nombres de variables: cada nombre de variable debe tener un nombre único o puede causar una advertencia 219: la variable local "variable_name" sombrea una variable en un nivel anterior.

-Una solución para esto es utilizar static para declarar la variable como una variable local, sin embargo, aún necesita usar un nombre de variable no genérico para evitar conflictos con otros módulos y releases incluidos.

-Otra solución si una variable se declara localmente, puede crear una función si necesita ser utilizada en todo el código.

-Enlazando una función que se requiere para ser reutilizada - Esto puede ser repetitivo y hook debe tener un prefijo único . Escribir las directivas puede ser repetitivo, pero esta es la razón por la que Copiar y pegar existen. Otra solución es usar y_hooks e incluirlo en cada módulo . Para el ejemplo de y_hooks, vea los primeros 2 ejemplos.


Diseño

En el caso que le estoy poniendo como ejemplo seria asi, todo dependerá de como desglosen su modo de juego.
 Codigo Pawno:
1
2
3
4
5
6
7
8
9
10

   -FuturamasRP.pwn
                  -cargar.inc
                        -jugadores.inc
                           -UID.inc
                             -cmdUsuario.inc
                                -naves.inc
                                    -cmdNaves.inc
                                        -toynaves.inc

  Cantidad de llaves: Abiertas(0)-Cerradas(0) | Lineas Totales: 10
Dentro del GM
 Codigo Pawno:
1
2
3
4
5
6
7
8
9
10
11
12
13

#include <a_samp>


// Módulos //

#include "../Configuraciones/ConfigDatos/Datos/carga.inc"
#include "../Configuraciones/ConfigDatos/Datos/Jugadores.inc"
#include "../Configuraciones/ConfigDatos/UID/UID.inc"
#include "../Configuraciones/ConfigDatos/CMD/cmdUsuario.inc"
#include "../Configuraciones/ConfigDatos/CMD/naves.inc"
#include "../Configuraciones/ConfigDatos/CMD/cmdNaves.inc"
#include "../Configuraciones/ConfigDatos/CMD/toynaves.inc"

  Cantidad de llaves: Abiertas(0)-Cerradas(0) | Lineas Totales: 13

¿Como Funciona?

Lo que hace es vincular el contenido que tiene los módulos y lo inserta en el archivo original.



Aquí pondré un Ejemplo, de como funcionaria supongamos que los enum lo tengamos en un modulo separado y en una carpeta separada.

enum.inc
 Codigo Pawno:
1
2
3
4
5
6
7
8
9
10

enum uInfo {
	f_nombre[MAX_PLAYER_NAME],
	f_Contra[24],
	f_Muertes,
	f_Muerto
}

new f_info[MAX_PLAYERS][uInfo];

  Cantidad de llaves: Abiertas(1)-Cerradas(1) | Lineas Totales: 10
luego tengamos uno que adonde se anexara los enum, lo llamaremos general.inc .

General.inc
 Codigo Pawno:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21


#include <a_samp>

#include "../Modulos/Ejemplos/enum.inc"

new reseteodatos[uinfo];

public OnPlayerConnect(playerid) {
	f_info[playerid] = reseteodatos; // Setea todo los datos a 0


	return 1;
}

public OnPlayerDisconnect(playerid, reason) {


	f_info[playerid] =  reseteodatos; 
	return 1;
}
  Cantidad de llaves: Abiertas(2)-Cerradas(2) | Lineas Totales: 21

Lo que realmente pasa
 Codigo Pawno:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29

#include <a_samp>

//Esto seria si tuvieras dentro  enum.inc en tu modo de juego
enum uInfo {
	f_nombre[MAX_PLAYER_NAME],
	f_Contra[24],
	f_Muertes,
	f_Muerto
}

new f_info[MAX_PLAYERS][uInfo];

new reseteodatos[uinfo];

public OnPlayerConnect(playerid) {
	f_info[playerid] = reseteodatos; // Setea todo los datos a 0



	return 1;
}

public OnPlayerDisconnect(playerid, reason) {
	

	f_info[playerid] =  reseteodatos; 
	return 1;
}

  Cantidad de llaves: Abiertas(3)-Cerradas(3) | Lineas Totales: 29
¿Cómo funciona la integración?


En los modulos se deben hacer en una secuencia que funcione en armonía (Funcionen Correctamente, si no entienden mi vocabulario xde.). Por ejemplo, estas intentando abrir una base de datos general.inc y deseas crear un tabla de cuentas supongamos Usuario.inc para poder hacer esto, tienes que conectar OnGamemodeInit antes de cada modulo, en este caso usaremos y_hooks ya que es "lo mas usado" ahorita. Le dejare un ejemplo


y_hook
 Codigo Pawno:
1
2
3
4
5
6
7
8
9
10
11
12

#include <a_samp>
#include     <YSI\y_hooks>


hook OnPlayerSpaw(playerid) 
{ 
    printf("test"); 
    return Y_HOOKS_CONTINUE_RETURN_1; 
} 



  Cantidad de llaves: Abiertas(1)-Cerradas(1) | Lineas Totales: 12
ALS
 Codigo Pawno:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

public function(playerid)
{
	#if defined something_function
	    return something_function(playerid);
	#else
   	 	return true;
	#endif
}

#if defined _ALS_function
    #undef function
#else
    #define _ALS_function
#endif
#define function something_function
#if defined something_function
	forward something_function(playerid);
#endif

  Cantidad de llaves: Abiertas(1)-Cerradas(1) | Lineas Totales: 19
Última edición por Dr.Zoidberg el 21 Sep 2018 14:28, editado 2 veces en total.
Amante de los memes en el dia y programador por las noches :,D

Imagen


Proyecto Actuales

»STRATFORD - TU ROL VAQUERO»

Sad :,c

Código: Seleccionar todo


 #include <iostream>
  #include <cstdlib>
  #include <ctime>
  using namespace std;

  int flip (void);
  int main()

 {

  int value, si = 0, no = 0;

  srand (time (NULL));
  cout <<endl<<endl<<"Probabilidad que ella te quiera." << endl;
  for (int n =1; n<=100; ++n)
  {
    value = flip();
    if (0 == value)
     {
      cout <<"Si\n";
      ++si;
     }

     else
     {
      cout <<"No"<<endl;
      no++;
     }
    }

  cout << endl<<"Numero de Si: " << si << endl;
  cout << "Numero de No: "<<no<<endl;
 
  return 0;

  }


 int flip (void)

 {
 return rand() % 2;
 }


Aportes

Avatar de Usuario
MrDave
Ayudante
Ayudante
Mensajes: 998
Registrado: 05 Oct 2017 12:13
Reputación: 109

21 Sep 2018 10:21


Muy buena guía la verdad. Te mereces un +1.
Hay algo que no entiendo, en un ejemplo dijiste que ibas a usar y_hooks y me quedé esperando el y_hooks.
¿No sería así?
 Codigo Pawno:
1
2
3
4
5
6
7
8

#include <a_samp>
#include <YSI\y_hooks>

hook OnGameModeInit()
{

	return 1;
}
  Cantidad de llaves: Abiertas(1)-Cerradas(1) | Lineas Totales: 8

Otra cosa que no entendí fue este hook
 Codigo Pawno:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

public OnGameModeInit()
{
	OnGameModeInitEx();

	#if defined main_OnGameModeInit
		return main_OnGameModeInit();
	#else
		return 1;
	#endif
}
#if defined _ALS_OnGameModeInit
	#undef OnGameModeInit
#else
	#define _ALS_OnGameModeInit
#endif

#define OnGameModeInit fc_OnGameModeInit
#if defined fc_OnGameModeInit
	forward fc_OnGameModeInit();
#endif
  Cantidad de llaves: Abiertas(1)-Cerradas(1) | Lineas Totales: 20

Se supone que "fc_OnGameModeInit" es la función sobrecargada de "OnGameModeInit", entonces no debería llamarse esta subrutina dentro de "OnGameModeInit"?
Algo así:
 Codigo Pawno:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

public OnGameModeInit()
{
	OnGameModeInitEx();

	#if defined fc_OnGameModeInit
		return fc_OnGameModeInit();
	#else
		return 1;
	#endif
}
#if defined _ALS_OnGameModeInit
	#undef OnGameModeInit
#else
	#define _ALS_OnGameModeInit
#endif

#define OnGameModeInit fc_OnGameModeInit
#if defined fc_OnGameModeInit
	forward fc_OnGameModeInit();
#endif
  Cantidad de llaves: Abiertas(1)-Cerradas(1) | Lineas Totales: 20

- Temporalmente estoy retirado de SA-MP; por lo tanto no me envíen propuestas de proyectos.
- No respondo dudas por privado, usa la sección de preguntas.
Avatar de Usuario
MattHudson
Moderador Global
Moderador Global
Mensajes: 1668
Registrado: 31 Oct 2015 18:16
Ubicación: Argentina, Buenos Aires, San Miguel.
Contactar:
Reputación: 89

21 Sep 2018 10:49

Dr.Zoidberg escribió:
19 Sep 2018 20:41
en este caso usaremos y_hooks ya que es "lo mas usado" ahorita. Le dejare un ejemplo
Creo que este emoji: -shock , representa mi cara cuando no vi el uso de y_hooks en el ejemplo -laughing

Muy buena guía!
Esta bueno que la gente vea las distintas formas de hacer un código, cada quien tiene su gusto por una forma en especifico y que con esto ayas enseñado este tipo de desarrollo de código, es un paso mas hacia la gloria -yes2

Yo soy mas de ordenar el código en un solo archivo y ya, mucha pereza tener todo separado... se me hace mas fácil y rápido poner un comentario que diga "RP_Comandos_Casas", buscarlo en el archivo en común y ya jeje.

Saludos, -bye
Avatar de Usuario
#Fede
Moderador Global
Moderador Global
Mensajes: 3125
Registrado: 12 Ene 2015 06:32
Ubicación: Montevideo, Uruguay.
Reputación: 75

21 Sep 2018 12:25

Excelente aporte para los nuevos.
Estoy fuera de SA-MP, no me envíen mensajes privados invitándome a proyectos.


scriptnoob escribió:Cada día se va mejorando el foro, nuestro objetivo es como el de una empresa:

Misión: Brindar ayuda y aportes a los usuarios.
Visión: Ser la página de mayor calidad de servicio de soporte referidos a lenguajes de programación.
Lee las reglas del foro para evitar ser sancionado




Avatar de Usuario
Dr.Zoidberg
Junior
Junior
Mensajes: 210
Registrado: 27 May 2018 11:55
Ubicación: Un bocata de hipercalamar.
Reputación: 17

21 Sep 2018 12:55

MattHudson escribió:
21 Sep 2018 10:49
Creo que este emoji: -shock , representa mi cara cuando no vi el uso de y_hooks en el ejemplo -laughing
[/quote]

Aguante mi Lógica xddddddddddd y gracias.(Ahora lo acomodo xd)
Amante de los memes en el dia y programador por las noches :,D

Imagen


Proyecto Actuales

»STRATFORD - TU ROL VAQUERO»

Sad :,c

Código: Seleccionar todo


 #include <iostream>
  #include <cstdlib>
  #include <ctime>
  using namespace std;

  int flip (void);
  int main()

 {

  int value, si = 0, no = 0;

  srand (time (NULL));
  cout <<endl<<endl<<"Probabilidad que ella te quiera." << endl;
  for (int n =1; n<=100; ++n)
  {
    value = flip();
    if (0 == value)
     {
      cout <<"Si\n";
      ++si;
     }

     else
     {
      cout <<"No"<<endl;
      no++;
     }
    }

  cout << endl<<"Numero de Si: " << si << endl;
  cout << "Numero de No: "<<no<<endl;
 
  return 0;

  }


 int flip (void)

 {
 return rand() % 2;
 }


Aportes

Responder