edición general
428 meneos
20740 clics
La excepcional belleza del código fuente de Doom 3 [ENG]

La excepcional belleza del código fuente de Doom 3 [ENG]  

Esta es una historia sobre el código fuente de Doom 3 y de lo hermoso que es. Sí, hermoso. Permitidme que me explique: después de lanzar mi videojuego —Dyad— me tomé un pequeño descanso. Al mes o así de holgazanear, pensé en extraer las partes del motor gráfico de mi juego para un nuevo proyecto pero, como el código fuente era un lío espantoso, me puse a buscar proyectos donde orientarme en la organización de dicho código. Fue cuando encontré un artículo sobre el código fuente de Doom 3, así que me puse a revisarlo.

| etiquetas: belleza , código fuente , doom 3 , john carmack
221 207 3 K 545 mnm
221 207 3 K 545 mnm
Comentarios destacados:                                  
#25 Aquí un programador que aprendió por costumbre a escribir condicionales así:

if ( x ) {
} else {
}

y no así
if ( x )
{

}
else
{


}


JODEROS! LO SABÍA, ME DECIAIS QUE PROGRAMABA COMO UN RETRASADO MENTAL, JODEROS TODOS!!! ya tengo el aval de idSoftware.

Si, lo siento si me he excedido pero llevo alrededor de 6 años programando y no dejan de decirme que el estilo de mis condicionales es estúpido. Lo he pasado muy mal en mi vida como programador...
«12
  1. El propio John Carmack respondió a este artículo: kotaku.com/5975610/the-exceptional-beauty-of-doom-3s-source-code?post=
  2. Joer como se flipan algunos :-D
  3. ¿y donde pones que está en inglés?
  4. #3 Ya :-D
  5. #4 Gracias majo ;)
  6. #2 Se tiene o no se tiene.
  7. Se lo ha currado un huevo y tiene razón, esta bonito y bien hecho.
  8. Si nombras adecuadamente a tus funciones y variables y tu código es claro, la necesidad de comentar el código es practicamente mínima.
  9. #8 Tú dale ideas a los que hacen código ofuscado, que son una gran parte de la gente que programa.
  10. #8 Un buen código se lee solo, lo que tu comentas no es que sea necesario comentarlo puesto que seria repetir lo mismo 2 veces.

    He estado revisando y hasta la estructura de la solución es buena.
  11. ¿Por que la gente leer Kotaku? Tienen los peores columnistas. Con diferencia.

    Y no me refiero a que tengan gustos diferentes a mi. Me refiero que hacen artículos que no tienen ni pies ni cabeza.
  12. #1 Justo ayer o antes de ayer :-P Lo puso en su twitter. Lo tengo guardado para echarle un vistazo cuando tenga tiempo :-P
  13. En su día ese título hizo pasar bastante miedo (suspense y sobresaltos) a bastantes gamers, incluso a quienes por entonces ya estaban de vuelta de muchos otros shooters.
    La terrorífica y oscura atmósfera que lo rodeaba todo causó sensación en su época. Y su I.A. también causó sensación.
  14. #11 ¿Eres indio?
  15. John Carmack es mi ídolo de la infancia y también de la actualidad. Hacen falta más matarmarcianos como este señor sabe hacer y menos emos chuloputas xD

    Saben de algún juego que utilice el motor del doom 3 (IDtech4 ) que este para jugar en linux ??
  16. Fap Fap Fap Fap ...
  17. #15 Lo bueno es que libera su código. Lo malo es que hace mucho tiempo que no hace nada arrasador en el ámbito tecnológico.
  18. S.O.L.I.D. (Single responsibility, Open-closed, Liskov substitution, Interface segregation and Dependency inversion)
  19. Pues hay fallos por la mezcla de diferentes estilos. Incluso dentro de un mismo fuente. Por ejemplo en ui/BindWindow.cpp:

    68 if (waitingOnKey) { // Sin espacios tras los paréntesis

    108 if ( waitingOnKey ) { // Hay espacios tras los paréntesis

    Y ese error se repite bastante. Además he visto sitios donde utilizan tabulaciones y sitios donde utilizan espacios, con lo que descuadra.

    En definitiva: todo es mejorable :-P
  20. #20 Yo paso todo mi código por AStye antes de subirlo al repositorio.

    ¿Soy un hereje sin educación en formateo de código? ¿O alguien practico?

    astyle.sourceforge.net/
  21. ¿Excepcional belleza? ¿Y uno de los primeros ejemplos que veo es una secuencia if-else if-else, algo que casi siempre (por no decir siempre) es un ejemplo de mal diseño?

    Seguiré echando un vistazo al artículo, pero parece que para él, un código "bello" es un código bien formateado. El formato del código es importante, está claro, pero la belleza de un código fuente está en el diseño.

    Y me ha parecido ver lo que es básicamente un "getter". Si pones un getter estás exponiendo los datos de tu clase, y cargándote la encapsulación, que es uno de los fundamentos de la programación orientada a objetos. Algunos (la mayoría) piensan que por poner un campo privado y un getter público están cumpliendo con la encapsulación...
  22. #21 ¡¡¡¡HEREJÍA!!! ¡¡¡A LA HOGUERA!!! :-P

    Yo prefiero hacerlo a mano. Pero sea a mano o sea con una herramienta, creo que es importante la coherencia de formato. Facilita bastante la legibilidad.
  23. #18 hombre 'Rage' usa un motor del que ha sido padre y como juego no esta nada mal :-)
  24. Aquí un programador que aprendió por costumbre a escribir condicionales así:

    if ( x ) {
    } else {
    }

    y no así
    if ( x )
    {

    }
    else
    {


    }


    JODEROS! LO SABÍA, ME DECIAIS QUE PROGRAMABA COMO UN RETRASADO MENTAL, JODEROS TODOS!!! ya tengo el aval de idSoftware.

    Si, lo siento si me he excedido pero llevo alrededor de 6 años programando y no dejan de decirme que el estilo de mis condicionales es estúpido. Lo he pasado muy mal en mi vida como programador...
  25. #20 Dos espacios, una tabulación, todo lo demás: golpe de remo.

    #25 Eso lo tengo visto por costumbres del lenguaje más que por otra cosa, yo también soy partidario de las llaves en la misma linea, eso sí, para los sibaritas eres un hereje xD
  26. #25

    Normalmente cada lenguaje de programación tiene unos estándares explícitos o por convención.

    Y siento decirte que un if-else es casi siempre un síntoma de mal diseño y casi siempre hay una solución mejor.
  27. #26 cuatro espacios, una tabulación. Hereje.
    #27 Es muy dificil que crees un portal web o proyecto entero y no metas un else. Búscame un proyecto de más de 100,000 lineas donde no veas un else para condicionales muy triviales. I DARE YOU!
  28. #25 yo lo hago como tu... la verdad es que nadie me ha dicho nada... la otra forma me parece de retrasados...
  29. #26 #28 3 espacios. Estáis matando gatitos cada vez que abrís la boca.
  30. #24 Sus texturas dan pena, de las peores que he visto en PC (otros jugos como mínimo en el salto a PC ponen unas buenas texturas, que en PC hacen falta al estar tan cerca de la pantalla). Es demasiado consolero. No digo que sea malo (aunque tampoco es que haya reventado la crítica) pero no es la revolución técnica a la que nos tenía acostumbrados antes.

    #26 No se pueden mezclar tabulaciones con espacios, es horrible. Además, yo uso tabulaciones de 4 espacios. Y en Python si metes menos o más de 4 ni siquiera funciona xD
  31. #30 A las 2:00 en la puerta del colegio me lo cuentas.
  32. Fuck is necessary
  33. ¿Hay que decir 'melofo'? :troll:
  34. #28 Tu no seras del Frente Popular de Judea?? Cuatro espacios me parece una aberración, sobre todo en bloques de código largos, 2 más fácil de seguir.

    #30 Tres????... secundo a #32

    #31 Evidentemente, uso de tabulador: Golpe de Remo, los hombres de verdad usan espacios para tabular.
  35. #28 Si pudiera, te daría el código de la aplicación web que estamos construyendo. No es código abierto, por desgracia, aunque esto no depende de mí.

    Por otra parte, el 90% de los proyectos de 100.000 líneas o más se podrían escribir en una cuarta parte de líneas. El diseño del 90% de proyectos es malo, que otros lo hagan mal no es excusa.
  36. #35 Soy del frente popular judáico, y aquí usamos 4 espacios, queda simple el código y muy bien legible para los que están acostumbrados al código como a los que no. Por cierto, siempre decirle a tu editor que trate los tabs como espacios. SIEMPRE.

    #36 digo yo que dependerá de la complejidad de un proyecto, ¿no?. Obviamente todo código puede reducirse de tamaño. Pero eso es irte al comodín facil de la programación, y es que rara vez hay personas que gastan un 40% de su tiempo en optimizar su código
  37. #25 tu ni caso, que les den :-)
  38. #18 Doom 3 me parece muy bueno y el rage es un juego de la vieja escuela que cuando pueda va a caer. Recuerda también que los call of duty utilizan un motor basado en el IDtech3 ( quake 3 arena ). Y para ver que esta en la cresta de todo este mundillo. AMD puede que utilicen en las nuevas consolas y gráficas una tecnología creada por carmack para su IDtech6 ...
  39. Algunos de los puntos que se comentan en el artículo son realmente buenos. Otros, en cambio, son meros detalles estéticos con los que se puede o no estar de acuerdo pero que no son en ningún caso verdades absolutas.

    #25 Yo también pongo los condicionales como dices. Ahora bien, sí que suelo separar cosas o dejar líneas en blanco para mejorar la legibilidad. Por ejemplo, entre dos bloques if consecutivos dejo una línea en blanco. No creo que eso sea un problema ni que haga el código más "feo".
  40. #35 Viva el código lasaña! xD Con 4 para mí se sigue más fácil, y es más típico. Ya te digo que en Python son 4 quieras o no.

    #25 A mí me gusta el condicional terciario de c++, por lo menos para una línea :-P
  41. ¡Bueno si será bonito!

    No he podido dejar de leerlo hasta llegar a la última página....¡y no os podéis imaginar qué final tan sorprendente!!

    Nadie nunca averiguará que el asesino es Jack el forastero (L.Luthiers dixit)

    :-)
  42. #25 Pues yo siempre lo hago así, me parece más legible.
  43. Disidentes!!
  44. #37 Yo no hablo de optimización. Por optimización entiendo mejoras de rendimiento, y eso no tiene que ver con el tamaño del código y se hace al final del todo. Premature optimization is the root of all evil, Donald Knuth dixit.

    Yo hablo de diseño. Una aplicación bien diseñada y que siga a rajatabla los fundamentos de la POO (si hablamos de POO) tendrá menos líneas que una hecha "a lo loco".
  45. #22 La encapsulación no va de esconder, sino de controlar el acceso.

    #45 C++ es multiparadigma, puedes mezclar. Hacer un juego basado 100% en objetos es un error (por el rendimiento).
  46. int Comida;
    Espero que os duelan los ojos. Pero ESE fallo lo he visto muchas veces, y me da vomitera.
  47. #41 Con 2 es más que suficiente para poder seguir el código, hereje.

    #37 Evidentemente, se da por hecho que se modifica el editor para cambiar las tabulaciones por espacios, que piensas que soy como esos del Frente Popular Judáico a los que hay que explicarle algo tan básico?? ¬¬
  48. El manual del buen estilo de google choca en muchos puntos con el manual de ID. google-styleguide.googlecode.com/svn/trunk/cppguide.xml
    Fight!

    #8 Dependerá de la dificultad del algoritmo que estés haciendo.
  49. #22 Y siento decirte que un if-else es casi siempre un síntoma de mal diseño

    ¿Y eso por qué? No conozco ningún lenguaje de programación que no tenga condicionales (¡incluso Haskell tiene!).
    Si fueran malos ya los habrían quitado (como se ha hecho con los GOTOs o los bucles for estilo C/C++).
  50. #46 Nos ponía un ejemplo hace poco nuestro arquitecto software de una aplicación bancaria en la que había una clase Préstamo, en la que había un campo de coma flotante con la cantidad, y un hermoso getter. Cuando hubo que refactorizar, resulta que ese getter se invocaba desde docenas de sitios. ¿Es eso para ti encapsular? Docenas de clases tenían acceso a un dato cuando sólo la clase Préstamo debería tratar con él.

    Si tienes una clase Préstamo, el campo con la cantidad no le interesa a ninguna otra clase. Si quieres hacer una operación con un Préstamo, todo lo que tenga que ver con la cantidad se debe realizar en la propia clase, porque es la clase que entiende de préstamos y la responsable de los mismos.

    ¿Que quieres aumentar un préstamo? Creas otra instancia de Préstamo con la cantidad a aumentar (que se la pasas en el constructor) y tienes en tu clase Préstamo un método aumentar_préstamo, que toma otro Préstamo, los suma y devuelve una nueva instancia de Préstamo.

    Préstamo incial = Préstamo.new(10000)
    Préstamo aumento = Préstamo.new(2000)
    Préstamo final = inicial.aumentar_préstamo(aumento)

    Voilà. En la variable final tendrás tu Préstamo de 12.000, valor al que nadie que no sea un Préstamo tiene acceso.
  51. #45 En cualquier caso, que mas da da si tu proyecto se puede reducir 10k lineas? Que va a suponer eso? Y el coste en tiempo?
  52. #50 ¿De dónde se han quitado los goto y los bucles for? Por que de c/c++ no, siguen ahí, y siguen siendo útiles, y por más que te hayan comido la cabeza, goto es una sentencia más y es perfectamente válida, además de ser conveniente a veces. Los puedes encontrar en el código de Linux mismamente.
  53. Yo hace muchos años pensé que quería ser programador... Hasta que me dí cuenta de que el diseño de los lenguajes de programación era absurdo.
  54. #53 goto sólo tiene sentido en código que tiene que estar muy, muy optimizado. Cosas como el kernel de Linux. El 99% de código que se escribe a diario en el mundo debe huír como de la peste.
  55. #51 Si sólo la clase Préstamo debe conocer ese dato no debería ser accesible, pero yo puedo querer encapsular algo para tratarlo de una determinada forma, no para que no se pueda modificar. Por cierto, con tu ejemplo me has matado, madre de dios qué chapuza...

    #55 Yo no lo uso. Pero no tiene por qué ser malo. Por ejemplo un goto end en una función puede simplificar las cosas.
  56. #52 Tú, como el otro, piensas: "hago un proyecto, e intento reducir el número de líneas". NO. DISEÑAS un proyecto BIEN, y tu programa tendrá un número reducido de líneas. No es algo a posteriori.
  57. Hola???

    Podría haberse traducido parte de esa belleza en el juego... porque vaya decepción después del DOOM 2, este es el peor de todos sin duda, una chusta que no aguanté jugando ni 3 días.
  58. #56 Vaya, ahora es una chapuza un ejemplo que se usa en el MIT, ilústranos con tus conceptos de orientación a objetos, anda.

    No me lo digas.

    class Préstamo {

    private double cantidad;

    public Préstamo(double cantidad) {this.cantidad = cantidad;}

    public double getCantidad(return this.cantidad);

    public void setCantidad(double cantidad) {this.cantidad = cantidad;}

    }

    Préstamo préstamo = new Préstamo(10000);
    préstamo.setCantidad(préstamo.getCantidad() + 2000);

    ¿Me equivoco?

    Con respecto a esto:

    "Si sólo la clase Préstamo debe conocer ese dato no debería ser accesible, pero yo puedo querer encapsular algo para tratarlo de una determinada forma, no para que no se pueda modificar."

    No he entendido nada.
  59. #57 Eso está muy bien cuando el diseño inicial es el final, pero en mi experiencia, rara vez es así.
  60. #51 Y si ahora tienes otro objeto del tipo CuentaBancaria y quieres actualizar el campo saldo para reflejar el aumento del mismo a causa del prestamo, ¿como lo haces si le clase Prestamo no tiene método alguno para devolver la cantidad?
  61. #25 En C de Kernighan y Ritchie se escribe como tú lo haces. Yo también lo hago así. Si se usa bien la identación esta manera creo que es la major. La otra solo contribuye a hacer código alargado y complicado de leer, en mi opinión.

    Me cabreaba mucho lo de las llaves abajo. En Coritel me obligaban a ponerlo así como norma de estilo interna... Una estupidez, vamos.
  62. #59 En el sector bancario no lo sé, pero como solución genérica para cambiar datos (que es como lo planteas) es una chapuza. A hacer copias de objetos por un tubo!
  63. La peña se hace pajas con cada cosa...
  64. #53 ¿De dónde se han quitado los goto y los bucles for?

    Pues los GOTO y los bucles for estilo for(inicialización, condición, incremento) no suelen existir en los lenguajes que no tienen a C como influencia directa.

    por más que te hayan comido la cabeza, goto es una sentencia más y es perfectamente válida

    Muchas gracias por enseñarme que hay mundo más allá del académico. Lo que tú deberías saber es que hay mundo más allá de C/C++.
  65. #64 eres programador o eres de los que dicen "a mi no me ralles que TU haces tu trabajo y yo el mio?"
  66. #57 Nadie ha dicho que revises tu código para optimizarlo sino que cada vez que hagas una función te pares a pensar que puedes reducir eso que has hecho en 20 lineas en solo 5. Admitamoslo, hay un montón de trucos de la programación que te dejan boqueabierto cuando los ves, y que sólo la práctica hace que los acabes usando. A menos claro que seas superdotado, en ese caso menéame no es para tí.
  67. #66 creo que no soy ninguna de las dos cosas. Me gustan las tortugas, eso sí.
  68. Eso es como si un arquitecto dice:"Que bonitos son los ladrillos de ese edificio". Una chorrada porque que no se van a ver.
  69. #25 Yo también lo hago así. No me gusta el código de una función si hay que mover mucho el scroll.
  70. Mucho código limpio y aseado y no incluyeron una linterna pegada a las armas...XD O más acción y menos sustitos.
  71. #70 No es lo mismo. Un arquitecto nunca volver a por los ladrillos de una obra para hacer otra nueva. Un ingeniero software si, y cuando mas bonitos sean, mas faciles serán de reutilizar.
  72. #36 No entiendo, ¿por qué un if-else es síntoma de mal diseño? Si por ejemplo en mi aplicación tengo que antes de generar un presupuesto tengo una función que comprueba si está dentro de plazo de modo que si no lo está se muestra un mensaje de usuario en lugar de generarlo, cómo hago esto si no es con un if-else o similar?
  73. #73 Si pero por muy bonitos que sean, no se ponen solos. Más importante es que el resultado sea bonito, creo yo.
  74. #26 Menos de 3 espacios no es tabulación, es error tipográfico. 2 espacios, golpe de remo. 1 espacio, pelotón de fusilamiento.
  75. Tienes que salir mas
  76. #25 Estoy completamente de acuerdo contigo, odio ver una maldita línea de código malgastada para poner un maldito "abrir llave"... Y ya si encima hay gente que trabaja con una resolución vertical de 768px es desastroso.

    Yo siempre escribo:
    if (condition) {
    code1;
    } else {
    code2;
    }
  77. #45 Parece que estás haciendo una equivalencia entre buen diseño y POO.

    ¿Acaso es el único paradigma que permite diseñar bien?
  78. Para código bonito bonito, el del quake1.

    #22 Es "posible" que lo hagan así para generar un código mas rápido, aun programando en C siempre tengo el ASM en mente.
  79. #70 Si que se ve, el doom y el quake están portados a casi cualquier trasto electrónico porque su código está muy bien hecho y no han tenido que modificar casi nada.
  80. Que me hagáis leer los comentarios de esta noticia me preocupa, más por mí que por vosotros, panda de zumbaos.
  81. #70 y #73 Por alusiones ;) :
    El arquitecto no va a coger los ladrillos de la obra hecha (del mismo modo que los ladrillos que forman el Doom, forman el Doom y no otro juego) pero lo que si va a hacer, si ha realizado un detalle constructivo de la fachada donde están esos ladrillos y ha resultado ser eficiente, fácil de ejecutar, resuelve bien los encuentros, etc. es reutilizar esa solución, ese detalle constructivo (ese código fuente) o el modo que le llevó a hacer ese diseño, a otra obra.
  82. #84 Yo creo que la comparación arquitecto <-> ingeniero de software siempre está un poco cogida por los pelos. Entiendo que yo no he sido suficientemente especifico por que no conozco la arquitectura, pero creo que es mejor no meterse a establecer comparaciones.

    Eso de que lso ladrillos forma el Doom y no otro juego es una verdad a medias. No son ladrillos, son mas bien herramientas, y con ellas, si juntas arte y gameplay tienes un juego.
  83. #51

    Dios, no puedo creer que digas eso en público.
  84. #27 ¿que un if-else es casi siempre un síntoma de mal diseño? Ilumíname, porque en 10 años de programación, no he dejado de verlos.

    Por ejemplo, un tratamiento básico de un mensaje de respuesta:

    if (messageResponse.hasError()) {
    hazLoQueSeaConElError(messageResponse.getError());
    else {
    sigueLaEjecucion;
    }
  85. #87
    Para ese caso muchos lenguajes emplean try/catch
  86. Al que le interese el tema, tirando de enlaces se llega a esta web:
    fabiensanglard.net/

    Donde se analiza el código de los Quake I, II y III y los Doom I, II, III; así como otros juegos, como el código del Another World.
  87. #20 Soy igual de maniático compulsivo, yo también he visto ....){ , masticaba las visceras de los que hacen eso, primero empezando por los deditos para que no pudieran seguir programando.
  88. #88 No estoy hablando de una excepción, sino de un error ya tratado y encapsulado por el servicio que estoy llamando.
  89. #88 mmm, pero en videojuegos no puedes usar Try and Catch, son muy lentos y algunas consolas no lo soportan...
  90. #79 #25 Esto sólo lo entendemos los que hemos aprendido a programar en monitores de 14 pulgadas a 800x600 o 1024x768
  91. No he jugado en mi vida al Doom 3, habría que ver como funciona el juego, si no tiene bugs y tal.

    Creo que mi código es bastante limpio, mi secreto:

    ** Definir o seguir los/tus patrones de diseño que sean.
    ** Seguir estándares.
    ** Código autocomentado siempre que se pueda.
    ** Comentar siempre las funcionalidades correctamente, sin vaguerias o errores funcionales, ni siquiera con faltas de ortografía. Muy propias cuando se comenta código.
    ** Reducir métodos al mínimo.
    ** Correcto nombramiento de los métodos y variables.
    ** Repasar y rehacer tu código, creando nuevas clases, eliminando o reduciendo si es mejorable o colisiona con los patrones de diseño.
    ** Clases y métodos con visibilidad correcta.
    ** Siempre es posible(no dependencias de terceros etc) acabar tus funcionalidades del todo, jamás parcialmente, tratar de cerrarlas, eso ocurre cuando se pasan todos los test necesarios cubriendo toda casuistica y funcionalidades, se cumple con lo que dice el DT, si lo hubiere, se cumple con los estándares, patrones de diseño y las auditarías de código ya sean externas o definidas por tu equipo. Si no se corre el peligro del síndrome del 90% lo que ocurre cuando esta todo casi acabado pero no acaba nunca.
    ** Dedicar tiempo suficiente a los que menos saben, o los mas nuevos, enseñando y tratando de que corrijan sus errores, dejando que se peguen con el código pero sin dejarles solos. Repasar su código y mostrar errores. Solo así harán un código correcto.
    ** Asignar a cada miembro del equipo tareas que entren dentro de los margenes de sus capacidades, contratos o cualificaciones.
    ** Exigencias dentro de los margenes de lo humanamente posible y del horario laboral. Las prisas, al final casi siempre son contraproducentes. Bien porque se haga mal el trabajo o bien quemar al personal, lo que desemboca en discusiones, estreses y malos rollos. Obviamente, esto repercute en la calidad del código y esto ultimo al final desemboca en errores funcionales y problemas en mantenimientos o evolutivos.
    ** Coherencia en los tiempos de desarrollo, si como jefe tienes que decir que no puede estar a los de arriba, hay que decirlo, se explica, te comes el marron y ya está. Bajo mi experiencia mentir o comprometerse a cosas imposibles es también peor a la larga, obviamente repercute completamente en la calidad del código. También aplica a los programadores; esos que dicen "eso en día y medio lo tengo" y luego tardan 8 y la siguiente vez estiman lo mismo. Hay que entender que en los equipos siempre hay gente excesivamente positiva y gente excesivamente pesimista que se llevan las manos a la cabeza por cualquier cosa. Ni una cosa ni otra. Hay que tratar de hacer entender que el positivo tiene una responsabilidad con sus compromisos y que el pesimista no puede estar cargando al mundo con frases apocalípticas en plan "esto no va a salir nunca". En programación, realismo con margen para intangibles, siempre.
    ** Ser bastante exigente con todo lo anterior, contigo mismo y si mandas, con los demás.

    Si reduces los libros de Clean Code 'solo' a esto, ya ganas muchísimo. Pero los que programamos ya sabemos que 'solo' esto, no se cumple casi nunca.
  92. #25 depende si te pagan por linea o te pagan por trabajo o si es para ti :troll:

    aun recuerdo lo de DiscountForCoupon y CouponForDiscount dos clases que median iguales con el mismo numero de métodos y los de mi equipo confundiéndose casi todo el rato :troll:
  93. #27 Te equivocas. Un if-else es lo normal y lógico dentro de cualquier aplicación. Lo que suele ser un síntoma de mal diseño (digo suele porque no siempre es verdad) es varios if-else-if-else anidados.
  94. #70 Tu comparación es incorrecta. Un arquitecto diría “qué bonitos son los planos de este edificio” igual que un informático dice “qué bonito es el código fuente de esta aplicación”. Si el arquitecto dice lo de los ladrillos, el informático tendría que decir “qué bonito es el código binario de este programa”.
  95. #51 esa lógica se cae en cuanto otra clase dependa de la cantidad de ese préstamo.

    Por ejemplo, si hay que evaluar el riesgo del cliente, ¿cómo sumas la cantidad de dinero que tiene asignado en préstamos?

    De hecho, ¿qué información expone esa clase Prestamo al exterior, es una clase autista de la que nadie depende para nada?
  96. #51 Eso está muy bien en la teoría. Cuando llegas a la realidad, ves que no todo son objetos (la POO es de las mejores cosas que se han inventado para programar pero no es la panacea) y que para incrementar un préstamo (por usar tu ejemplo) lo mejor es usar un número real.
«12
comentarios cerrados

menéame