elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Rompecabezas de Bitcoin, Medio millón USD en premios


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  ¿Es posible hacer una función que incluya parte de un if?
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: ¿Es posible hacer una función que incluya parte de un if?  (Leído 743 veces)
Tachikomaia


Desconectado Desconectado

Mensajes: 1.217


Superhacker (es broma xD )


Ver Perfil
¿Es posible hacer una función que incluya parte de un if?
« en: 26 Febrero 2024, 14:30 pm »

A continuación 2 funciones iguales hasta la marca roja y que son usadas en un mismo programa:

Obviamente no se ve todo, pero no creo que importe, lo importante es que quiero convertir lo repetido (verde y amarillo) en una misma función, pero así como está termina (rojo) en medio de un if (que empezó en la zona amarilla, donde todo aún es igual). ¿Es posible hacer una función que incluya lo amarillo o debo conformarme con incluir sólo lo verde?

Por si a alguien le interesa, las diferencias entre los códigos son:
1- El izquierdo crea variables en ciertos casos, hasta llegar a 15, y el otro nunca.
2- El izquierdo en cierto punto deja de ejecutarse y ejecuta al otro. Ese cuando deja de ejecutarse da un mensaje y termina el programa.
Básicamente eso.


En línea

Parado_larga_duracion_ESP

Desconectado Desconectado

Mensajes: 49


Ver Perfil
Re: ¿Es posible hacer una función que incluya parte de un if?
« Respuesta #1 en: 26 Febrero 2024, 15:13 pm »

En eso yo siempre intento acordarme y seguir al máximo posible una característica de la programación funcional (https://es.m.wikipedia.org/wiki/Programaci%C3%B3n_funcional), que parece que se llama transparencia referencial.

Explicado rápido, es que una función no use ni cambie nada de fuera de sí, y llevado al máximo, dados unos parámetros iguales la función siempre devolverá lo mismo.

Con este principio en mente es como he podido escalar horizontalmente más mis proyectos.

¿Y qué tiene que ver?

Pues que en verdad se puede hacer otra función, pero tendrías que aislar la lógica y pasarle algunos datos desde la primera función. Yo cuando tengo que refactorizar así, procuro seguir ese principio, porque te da tranquilidad saber que una función no va a dejar de funcionar por cualquier cosa, y localizas rápido de donde vienen los datos en cada algoritmo.

https://es.m.wikipedia.org/wiki/Transparencia_referencial

Nota. Se me olvidó decir que puedes hacer una función escopeada, dentro del ámbito de la función principal. Pero si lo haces, tienes que pensar que esa función se replicará en instancias diferentes en cada llamada a la función principal. Las variables internas te serán accesibles directamente, pero es un mal patrón porque no escalas horizontalmente la aplicación. Sino en profundidad, que se traduce en consumo de memoria excedente.


« Última modificación: 26 Febrero 2024, 15:27 pm por Parado_larga_duracion_ESP » En línea

Tachikomaia


Desconectado Desconectado

Mensajes: 1.217


Superhacker (es broma xD )


Ver Perfil
Re: ¿Es posible hacer una función que incluya parte de un if?
« Respuesta #2 en: 28 Febrero 2024, 01:08 am »

Tu respuesta es como muy conceptual o abstracta, leí algunas cosas pero no entiendo bien del tema ^^u quiero un código no un método de programar que evita hacer ciertas cosas...

Lo simplifico, tengo un programa que tiene 4 estados.
1: Las definiciones iniciales.
2: Estado 2.
3: Estado 3.
4: Estado final.
En los estados 2 y 3 se usa un código así:
Código:
// Hacer cosas A.
Si (condición B):
  // Hacer cosas C.
sino:
  // Hacer cosas D.
  // Empieza la zona amarilla.
  Si (condición E):
    // Hacer cosas F:
  sino si (condición G):
    // Hacer cosas H.
y a partir de ahí es diferente en cada estado. Ya que los códigos son iguales hasta cierto punto, los quiero convertir en 1 función para evitar que se repita código, para que así ocupe menos espacio en disco, se cargue más rápido, etc, o al menos se supone que así ocurriría. Yo uso funciones para eso y por otro motivo que no viene al caso. Pero en este caso se complica convertir todo eso en 1 función porque el if no terminó, y no sé explicar mejor. Si el código a convertir en función fuese algo así:
Código:
// Hacer cosas.
Si algo A:
  // Hacer B.
sino:
  // Hacer C.
  Si algo D:
    // Hacer E.
  sino si algo F:
    // Hacer G.
  sino:
    // Hacer H.
No tendría problema, pero en el caso de arriba que presento no sé. En un estado lo que sigue es un else if y en el otro un if. Quizá se podría cambiar eso, no sé.

Ahora se me ocurre que la función podría, desde la zona roja, tener un if que, dependiendo de en qué estado se esté ejecutando, siga de un modo u otro, lo cual no me gusta porque me gusta que se cargue (o llame a) lo mínimo necesario. Tampoco es muy legible, quizá es parte de a lo que se refería el link que pusiste.

es que una función no use ni cambie nada de fuera de sí
¿Cual sería el problema si lo hiciera? Casi siempre lo hice así. Ayer hablando con GPT de un caso muy atípico me dió una función en la que se introducen parámetros, yo nunca o casi nunca hice una así. La usé porque parece totalmente necesaria para poner un operador variable en un if y así evitar cídigo, ya que esto no me funciona:
Si CVal CVal CVal
ni esto Si CVal eval(CVal) CVal
GPT me dijo que use una función así:
if (Comparacion(CVal, CVal, CVal)) {

Debe hallarse un valor de C tal que C C C, algo como:
"==" == "=="

Código
  1. // Posibles valores del Candidato:
  2. CVal1 = "<";
  3. CVal2 = "<=";
  4. CVal3 = "==";
  5. CVal4 = ">=";
  6. CVal5 = ">";
  7. CVal6 = "!=";
  8. // Candidato que será usada 1ero:
  9. C = 1;
  10. // Mensaje que se mostrará en pantalla:
  11. Respuesta = "Hallar un C tal que C C C. Se recomienda el C... ";
  12. // Usada por ProcesoaRepetir:
  13. function Comparacion(Valor1, Comparador, Valor2) {
  14. if (Comparador == "<") {
  15. return valor1 < valor2;
  16. } else if (Comparador == "<=" ) {
  17. return valor1 <= valor2;
  18. } else if (Comparador == "==" ) {
  19. return valor1 == valor2;
  20. } else if (Comparador == ">=" ) {
  21. return valor1 >= valor2;
  22. } else if (Comparador == ">" ) {
  23. return valor1 > valor2;
  24. } else if (Comparador == "!=" ) {
  25. return valor1 != valor2;
  26. }
  27. }
  28. // Se repite en F2:
  29. function ProcesoaRepetir () {
  30. CVal = eval("CVal"+C);
  31. trace ("CVal: "+CVal);
  32. trace ("Aplicación del candidato.");
  33. // ¿Se logró el objetivo?
  34. if (Comparacion(CVal, CVal, CVal)) {
  35.        // Sí, mostrar C que lo causa:
  36. Respuesta = Respuesta+C;
  37. trace ("Solución hallada, ver respuesta.");
  38. gotoAndStop (3);
  39. } else if (Action<6) {
  40. trace ("No se logró el objetivo.");
  41. // ¿Modificar C es posible?
  42. // Sí, modificarlo:
  43. C = C+1;
  44. trace ("El candidato fue modificada, es: "+C);
  45. } else {
  46.        // No, mostrar mensaje en pantalla:
  47. trace ("No es posible modificar al candidato ón ni lograr el objetivo.");
  48. Respuesta = Respuesta+"Ninguna, no es posible lograr el objetivo.";
  49.        // Finalizar programa:
  50. gotoAndStop (3);
  51. }
  52. }

Citar
llevado al máximo, dados unos parámetros iguales la función siempre devolverá lo mismo.
Tiene sentido, a menos que tenga random. ¿Cómo sería de otro modo? No imagino.

Citar
Pues que en verdad se puede hacer otra función, pero tendrías que aislar la lógica y pasarle algunos datos desde la primera función
Todos los datos que uso están fuera de la función.

Citar
Nota. Se me olvidó decir que puedes hacer una función escopeada, dentro del ámbito de la función principal. Pero si lo haces, tienes que pensar que esa función se replicará en instancias diferentes en cada llamada a la función principal. Las variables internas te serán accesibles directamente, pero es un mal patrón porque no escalas horizontalmente la aplicación. Sino en profundidad, que se traduce en consumo de memoria excedente.
Si puedes dame un ejemplo porque no sé si lo entiendo.
« Última modificación: 28 Febrero 2024, 02:44 am por Tachikomaia » En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines