Cita:
Iniciado por aguml Lo primero es sobre lo de poner muchos condicionales anidados. El caso es que cuando me enseñaron en otros lenguajes me dijeron que una función tiene que tener una entrada y una salida y que no era bueno poner varios return por toda la funcion ya que hacía más complicado dar con un error. Me dijeron que todo lo que se hace con un return se puede hacer con un condicional y eso hago desde entonces.
Es una buena práctica salvo cuando va en detrimento de la legibilidad del código.
Lo primero antes de nada es tener código legible, fácil de mantener y de ampliar y luego viene todo lo demás.
De nada te sirve tener un único return por función si luego tienes que invertir varias horas solo en entender lo que hace.
Por cierto, una forma de evitar tener varios returns es usar excepciones para la gestión de errores.
Cita:
Iniciado por aguml Otra cuestión, la lista es una lista auxiliar. ¿por qué?
En una lista enlazada simple cada nodo únicamente conoce al nodo que le sigue. Reubicar un solo nodo en una lista simple implica realizar modificaciones en al menos 3 nodos diferentes:
- El nodo a cambiar
- El nodo que actualmente apunta al nodo a cambiar
- El nodo anterior a la nueva posición
Al extraer todos los nodos a un vector puedes ignorar toda esa operativa ya que no es necesario que los nodos se apunten de forma conveniente... después se reordena ese vector (como aquí no tienes lista enlazada puedes recolocar los nodos arbitrariamente sin preocupaciones) y finalmente se actualizan todos los "sig" para que la lista enlazada vuelva a ser válida. Solución sencilla, rápida y a mi modo de ver, elegante.
Otra cosa es que la lista se vaya ordenando sobre la marcha al añadir nuevos elementos. En ese caso puedes calcular su posición sobre la marcha y te ahorras esta función. Eso sí, tendrás que tener cuidado a la hora de modificar nodos ya insertados en la lista ya que eso podría requerir recolocar dicho nodo.
Cita:
Iniciado por aguml Por eso no lo hice separando en funciones ya que no voy a sacar mucho beneficio porque solo se usarán ahí ya que en todo el código trabajo con archivos y no con listas.
Que no vayas a reutilizar el código no es excusa para no tener el código bien estructurado.
Tener funciones más o menos pequeñas, legibles y completas tiene varias ventajas:
- separación de responsabilidades: Una función pequeña suele tener un objetivo normalmente bien definido. Separar responsabilidades suele ser vital para el buen desempeño de un programa
- aislamiento: El código que pertenece a una función queda aislado del resto del programa y únicamente se puede acceder a él a través de la propia función. Esto evita que las diferentes operativas se entremezclen entre sí creando una suerte de código espaguetti.
- testing: Una función sencilla y bien definida admite ser tratada por una batería de test que certifique que dicha función cumple su cometido sin errores... testear una megafunción es bastante más complejo.
- legibilidad: El programa es mucho más legible. Aunque no entiendas un algoritmo concreto siempre tendrás más idea sobre el funcionamiento de un programa si tienes "leerDato()" o"vaciarLista()" en vez de "leeDatoImprimeMatrizYHacePiruetasVarias()"
- Reutilización del código: puede que una función únicamente sea llamada desde un sitio... pero eso no tiene que ser siempre así y tener código duplicado es una lacra en la inmensa mayoría de los programas.
Un saludo.