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í:
// 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í:
// 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:
"==" == "=="
// Posibles valores del Candidato:
CVal1 = "<";
CVal2 = "<=";
CVal3 = "==";
CVal4 = ">=";
CVal5 = ">";
CVal6 = "!=";
// Candidato que será usada 1ero:
C = 1;
// Mensaje que se mostrará en pantalla:
Respuesta = "Hallar un C tal que C C C. Se recomienda el C... ";
// Usada por ProcesoaRepetir:
function Comparacion(Valor1, Comparador, Valor2) {
if (Comparador == "<") {
return valor1 < valor2;
} else if (Comparador == "<=" ) {
return valor1 <= valor2;
} else if (Comparador == "==" ) {
return valor1 == valor2;
} else if (Comparador == ">=" ) {
return valor1 >= valor2;
} else if (Comparador == ">" ) {
return valor1 > valor2;
} else if (Comparador == "!=" ) {
return valor1 != valor2;
}
}
// Se repite en F2:
function ProcesoaRepetir () {
CVal = eval("CVal"+C);
trace ("CVal: "+CVal);
trace ("Aplicación del candidato.");
// ¿Se logró el objetivo?
if (Comparacion(CVal, CVal, CVal)) {
// Sí, mostrar C que lo causa:
Respuesta = Respuesta+C;
trace ("Solución hallada, ver respuesta.");
gotoAndStop (3);
} else if (Action<6) {
trace ("No se logró el objetivo.");
// ¿Modificar C es posible?
// Sí, modificarlo:
C = C+1;
trace ("El candidato fue modificada, es: "+C);
} else {
// No, mostrar mensaje en pantalla:
trace ("No es posible modificar al candidato ón ni lograr el objetivo.");
Respuesta = Respuesta+"Ninguna, no es posible lograr el objetivo.";
// Finalizar programa:
gotoAndStop (3);
}
}
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.
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.
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.