Autor Tema: [UNITY] Arquitectura del Software  (Leído 2470 veces)

JaviCepa

  • Socio
  • Mega Jammer
  • ****
  • Mensajes: 433
  • Molas: 45
    • @JaviCepa
[UNITY] Arquitectura del Software
« en: 01 de Julio de 2015, 12:06:54 pm »
Hay un tema que me ocupa y preocupa constantemente:
¿Cual es la manera más adecuada de estructurar el código en Unity?

Abro este hilo para compartir fórmulas o trucos personales. Iré listando los que pongáis en el hilo.

Lista de tips sobre arquitectura en C#/Unity:
  • Evitar estructuras con mucha profundidad de herencia
  • Orientar el diseño y la programación a componentes, no a objetos y clases
  • Evitar exponer propiedades en el inspector
  • Evitar referencias a objetos mediante Drag & Drop
  • Intenta dividir al máximo tus clases si puedes desacoplarlas (by @DavidRico)
  • Divide y ordena tus carpetas de scripts (by @DavidRico)
  • Escribe tu código de forma que sea entendible para cualquiera (by @DavidRico)
  • ...

DavidRico

  • Socio
  • New Jammer
  • *
  • Mensajes: 38
  • Molas: 9
    • Rodaja
Re:Arquitectura del Software en Unity
« Respuesta #1 en: 01 de Julio de 2015, 12:56:58 pm »
Muy relacionado con orientar el diseño y la programación a componentes: Pregúntate constantemente si no podrías separar una clase en dos o más. Cuanto más separes, más reutilizable. Ojo: separar de verdad, no poner parte del código en un archivo y parte en otro, y luego estar continuamente referenciando de uno a otro.

No metas todos los scripts en la carpeta Assets del proyecto, ni en una carpeta Scripts sin más. Crea subcarpetas y organiza los scripts de alguna forma que te resulte lógica: yo por ejemplo últimamente estoy haciendo una carpeta para cada escena y ahí meto los scripts que sean propios de esa escena, y luego los scripts más generales en otra carpeta.

Cuanto más leo y más aprendo sobre programar en Unity, más tengo la sensación de que las buenas prácticas van un poco contracorriente con respecto a donde te dirige Unity. La tendencia es a hacer super managers gordos, montones de behaviours enlazados a cosas por drag&drop, y en definitiva mil cosas que no son nada reutilizables y se convierten en un infierno.

Lo que me lleva a otro tip de programador, aunque no es específico de Unity ni de C#: siempre, y digo SIEMPRE, escribe tu código como si lo tuviera que leer y entender otro que sepa la mitad que tú. Tú mismo, dentro de seis meses, no vas a entender lo que estabas haciendo, así que como mínimo póntelo fácil a ti mismo.

JaviCepa

  • Socio
  • Mega Jammer
  • ****
  • Mensajes: 433
  • Molas: 45
    • @JaviCepa
Re:Arquitectura del Software en Unity
« Respuesta #2 en: 01 de Julio de 2015, 01:12:48 pm »
Cuanto más leo y más aprendo sobre programar en Unity, más tengo la sensación de que las buenas prácticas van un poco contracorriente con respecto a donde te dirige Unity. La tendencia es a hacer super managers gordos, montones de behaviours enlazados a cosas por drag&drop, y en definitiva mil cosas que no son nada reutilizables y se convierten en un infierno.

Creo que ese es el sentimiento universal  ::)

santiandrade

  • Jammer
  • **
  • Mensajes: 89
  • Molas: 12
  • @SantiHisteria | histeriagamedev.com
    • Histeria Gamedev
Re:Arquitectura del Software en Unity
« Respuesta #3 en: 28 de Agosto de 2015, 04:51:21 pm »
Lo que me lleva a otro tip de programador, aunque no es específico de Unity ni de C#: siempre, y digo SIEMPRE, escribe tu código como si lo tuviera que leer y entender otro que sepa la mitad que tú. Tú mismo, dentro de seis meses, no vas a entender lo que estabas haciendo, así que como mínimo póntelo fácil a ti mismo.

Totalmente de acuerdo con @DavidRico... y con este tema tiene mucho que ver la importancia de gastar tiempo en documentar bien todo lo que programamos. Para mí, algo fundamental, sobre todo si trabajamos con más gente, es:

- Comentar todas las cabeceras de nuestros scripts (donde se incluyan las descripciones de uso de cada una de sus variables públicas, las dependencias de dicho script, el objetivo general de dicho script e incluso algunos ejemplos de buen uso de sus variables).

- Comentar la cabecera de cada una de las funciones que creamos dentro del script (con una breve descripción de lo que hace).

- Dentro de cada función, ir haciendo comentarios al principio de cada bloque de funcionalidad importante.

- Y por supuesto, modularizar para poder REUTILIZAR.

Sé que a veces (o siempre) es un coñazo gastar tiempo en la documentación de nuestro trabajo, pero a la larga se agradece, tanto para nosotros mismos cuando toquemos el código dentro de 2 meses como para otra gente que tenga que entenderlo. Y a pesar de que el hecho de comentar el código pueda parecer tan solo una buena práctica de organización, también nos ayuda a identificar partes de código que podemos extraer y hacerlas reutilizables.

En definitiva, un buen refactoring de nuestro código empieza por estructurarlo y documentarlo adecuadamente.

JuDelCo

  • En evolución
  • Socio
  • Super Jammer
  • ***
  • Mensajes: 240
  • Molas: 35
  • The Game
    • Twitter
Re:[UNITY] Arquitectura del Software
« Respuesta #4 en: 28 de Agosto de 2015, 07:40:09 pm »
Yo no sé donde leí (stackoverflow-time?) que para aprender a hacer algo en condiciones hay que reescribir el código de un programa 3 veces:

- La primera para saber qué es lo que querías/necesitabas realmente (ya que muy probablemente no lo tengas claro, más siendo la primera vez)
- La segunda para darte cuenta de como NO hacerlo y de darte cuenta de como podría haber sido una forma de hacerlo en condiciones.
- La tercera ya es la definitiva, sabiendo qué es lo que necesitas y como no hacerlo

Claro que esto es un poco radical, sobre todo para los que ya tengan experiencia. Pero si tu vienes sin haber programado un juego en la vida, seguramente estés en el paso 1 (que eso no significa que no logres hacer el juego ojo!). Yo en parte estoy de acuerdo con ello, aunque ni siquiera estoy seguro de si eran exactamente así los pasos que leí... pero se me quedó así xD

JaviCepa

  • Socio
  • Mega Jammer
  • ****
  • Mensajes: 433
  • Molas: 45
    • @JaviCepa
Re:[UNITY] Arquitectura del Software
« Respuesta #5 en: 29 de Agosto de 2015, 11:17:16 am »
A mi lo de comentar no me gusta hacerlo salvo que sea MUY necesario. En su lugar prefiero que los identificadores sean más largos y autodescriptivos y que las funciones sean muy cortas.
Es una forma de programar que aprendí con el libro "Clean Code" y que me gusta mucho.

MiguelCriado

  • Socio
  • Jammer
  • **
  • Mensajes: 86
  • Molas: 24
    • Twitter
Re:[UNITY] Arquitectura del Software
« Respuesta #6 en: 29 de Agosto de 2015, 01:52:49 pm »
Yo, en general, estoy con @JaviCepa. A mi modo de ver, si tienes la necesidad de plagar el código con comentarios, es que hay algo que no estás haciendo bien. Lo mismo es el momento de pararte un poco y empezar con una buena refactorización.

santiandrade

  • Jammer
  • **
  • Mensajes: 89
  • Molas: 12
  • @SantiHisteria | histeriagamedev.com
    • Histeria Gamedev
Re:[UNITY] Arquitectura del Software
« Respuesta #7 en: 29 de Agosto de 2015, 06:13:52 pm »
Lo bueno de hacer uso de comentarios es que luego puede pillarte programas de generación de documentación tipo Doxygen o similares y automáticamente tienes web o pdf creado con toda la documentación de tu proyecto ordenada. En fin, supongo que al final se trata de la propia costumbre de cada uno ;D

JuDelCo

  • En evolución
  • Socio
  • Super Jammer
  • ***
  • Mensajes: 240
  • Molas: 35
  • The Game
    • Twitter
Re:[UNITY] Arquitectura del Software
« Respuesta #8 en: 29 de Agosto de 2015, 07:02:07 pm »
Estamos hablando de un juego. ¿Para qué la documentación de la "API" ? (A menos que sea un proyecto a muy largo plazo donde trabajen tropecientas mil personas)

santiandrade

  • Jammer
  • **
  • Mensajes: 89
  • Molas: 12
  • @SantiHisteria | histeriagamedev.com
    • Histeria Gamedev
Re:[UNITY] Arquitectura del Software
« Respuesta #9 en: 31 de Agosto de 2015, 10:15:12 am »
Estamos hablando de un juego. ¿Para qué la documentación de la "API" ? (A menos que sea un proyecto a muy largo plazo donde trabajen tropecientas mil personas)

Bueno, no tiene nada que ver con que se trate de un juego o una aplicación, es software. Con que trabajen más de una persona sobre un mismo código, yo creo que ya merece la pena documentar, otra cosa es que normalmente a los programadores nos de pereza hacerlo xD

Cualquier persona que tenga que utilizar nuestro código, por ejemplo cualquier tipo de función que realice una tarea específica, no debería tener que meterse a leer de arriba abajo lo que hay codificado en dicha función, por muy bien codificado y descriptivo que sea el código (porque ese trabajo ya se hizo y se supone que funciona), sino disponer de una documentación que le abstraiga de cómo está hecha técnicamente y que se centre tan sólo en "qué hace" y "cómo se usa" (vamos, exactamente lo que hacen en la documentación de la propia API de Unity y de cualquier software). Y para esto no hace falta siquiera comentar las partes de dentro de la función (aunque eso ya es costumbre de cada uno y no creo que esté de más), sino simplemente una cabecera que explique de manera descriptiva la función.

Entiendo que en el caso de proyectos pequeños "entre amigos" estas prácticas no se hagan, pero en un proyecto en el que haya un mínimo de entrada y salida de gente, se ahorra mucho tiempo. Incluso para un mismo programador que coja su código dentro de 3 años y quiera aprovecharlo para otro proyecto. Y ojo, aquí nadie habla de que sea obligatorio, simplemente son buenas prácticas.

Yo también he leído lo típico de "Si tienes que comentar tu código es que no eres buen programador"... simplemente eso es absurdo, no confundamos la velocidad con el tocino ;D

DavidRico

  • Socio
  • New Jammer
  • *
  • Mensajes: 38
  • Molas: 9
    • Rodaja
Re:[UNITY] Arquitectura del Software
« Respuesta #10 en: 31 de Agosto de 2015, 12:36:27 pm »
Al final todo depende de cuántas veces se vaya a utilizar el código. Si lo escribes una vez y ya no se vuelve a utilizar para otra cosa, no merece la pena documentarlo, ni refactorizarlo, ni nada. Pero si te ves repitiendo ese código en otra parte, o copiando/pegando, o utilizándolo directamente desde otro sitio, o cualquier cosa así: tómalo como una pista de que ese código necesita que lo refactorices, lo extraigas a un método independiente, lo documentes (al menos, como dice @santiandrade la cabecera con una explicación de qué hace y qué parámetros usa) y le facilites la vida al próximo que lo necesite.

En ese sentido, me parece muy interesante el blog de Casey Muratori (un tipo que trabaja con Jonathan Blow en The Witness) donde expone su método de programación, que llama "compression oriented programming". También recuerdo haber leído en algún sitio una frase que se me quedó marcada: siempre que pases por un código, déjalo igual o mejor que como lo encontraste.

santiandrade

  • Jammer
  • **
  • Mensajes: 89
  • Molas: 12
  • @SantiHisteria | histeriagamedev.com
    • Histeria Gamedev
Re:[UNITY] Arquitectura del Software
« Respuesta #11 en: 31 de Agosto de 2015, 01:13:15 pm »
Interesante el blog, gracias!

También recuerdo haber leído en algún sitio una frase que se me quedó marcada: siempre que pases por un código, déjalo igual o mejor que como lo encontraste.

Me gusta esa frase! :)

JuDelCo

  • En evolución
  • Socio
  • Super Jammer
  • ***
  • Mensajes: 240
  • Molas: 35
  • The Game
    • Twitter
Re:[UNITY] Arquitectura del Software
« Respuesta #12 en: 31 de Agosto de 2015, 04:20:46 pm »
A mi lo de comentar no me gusta hacerlo salvo que sea MUY necesario. En su lugar prefiero que los identificadores sean más largos y autodescriptivos y que las funciones sean muy cortas.

Yo también he leído lo típico de "Si tienes que comentar tu código es que no eres buen programador"... simplemente eso es absurdo, no confundamos la velocidad con el tocino ;D

Encuentro opiniones enfrentadas mmm

JaviCepa

  • Socio
  • Mega Jammer
  • ****
  • Mensajes: 433
  • Molas: 45
    • @JaviCepa
Re:[UNITY] Arquitectura del Software
« Respuesta #13 en: 31 de Agosto de 2015, 08:04:06 pm »
Se me ocurre una idea! Voy a abrir otro hilo para hablar del tema con ejemplos.

santiandrade

  • Jammer
  • **
  • Mensajes: 89
  • Molas: 12
  • @SantiHisteria | histeriagamedev.com
    • Histeria Gamedev
Re:[UNITY] Arquitectura del Software
« Respuesta #14 en: 01 de Septiembre de 2015, 09:55:03 am »
Jajajaja @JuDelCo al final nos damos de hostias por el código... ¡pa matarnos! :P
Na, lo cierto es que al final cada uno codifica y se organiza como mejor le convenga (a él y al equipo en el que curre) y todo tipo de regla y buena práctica es respetable.

@JaviCepa me parece guay un hilo para ello, seguro que podemos aprender cosillas entre todos ;)