Técnicas de programación sobreutilizadas o maltratadas [cerrado]

38

¿Hay alguna técnica en la programación que consideres que se usa en exceso (IE se usa de manera más excesiva de lo que debería ser) o se abusa de ella, o se usa un poco para todo, sin ser una muy buena solución para muchos de los problemas que las personas intentan resolver? resolver con eso.

Podrían ser expresiones regulares, algún tipo de patrón de diseño o quizás un algoritmo, o algo completamente diferente. Tal vez piense que las personas abusan de la herencia múltiple, etc.

Anto
fuente
33
Estoy de acuerdo en que IE se usa de manera mucho más excesiva de lo que debería ser, pero eso es principalmente por los no programadores. . .
Eric Wilson el
77
@FarmBoy - Creo que se refería a IE: "Ie" significa simplemente "es decir", que escrito completamente en latín es 'id est'.
Raphael
Lo arregló ahora :)
Anto
44
Cualquier técnica puede (y a menudo se abusa de ella), solo tiene que presentarse como la próxima bala de plata y encontrará a alguien que trata cada problema como un clavo (para mezclar metáforas).
ChrisF
8
@Rapheal: estaba bromeando, por supuesto. Gracias por la educacion.
Eric Wilson el

Respuestas:

73

Comentarios en el código

Solo desearía que los profesores universitarios entiendan que no necesitan enseñar a sus estudiantes a escribir 10 líneas de comentarios diciendo que el siguiente código es un bucle for, iterando de 1 a número de x. ¡Puedo ver eso en el código!

Enséñeles a escribir un código de autodocumentación primero y luego comente adecuadamente sobre lo que no puede autodocumentarse adecuadamente en segundo lugar. El mundo del software sería un lugar mejor.

Dan McGrath
fuente
26
El código autodocumentado no lo es. También los profesores hacen esto para enseñar a los estudiantes a conceptualizar el problema y cómo abordarlo. Además, nunca he visto a nadie quejarse de demasiada documentación. La advertencia es que la documentación es correcta.
Woot4Moo
24
@ Woot4Moo: si lee Clean Code, Fowler afirma claramente que la documentación desactualizada es peor que ninguna documentación, y que todos los comentarios tienden a volverse obsoletos y migrar lejos del código que documentan. Todo ese libro trata sobre cómo escribir código autodocumentado.
Scott Whitlock
12
Enseñarles a reemplazar los comentarios con código sería un buen comienzo ...
Shog9
15
+1. De hecho, he visto lo siguiente en el código del mundo real: "loopVar ++; // increment loopVar". AAAAAAAAAAAAARRRRRGH!
Bobby Tables
77
@Bill: mi opinión es que no debería necesitar documentar estructuras genéricas de lógica y control, incluso si son relativamente complejas. Básicamente, cualquier cosa que un buen desarrollador que conozca el idioma debería poder resolver analizando el código no debería necesitar comentarios. p.ej. Un conjunto de bucles anidados con algunas interrupciones dentro de ellos, etc. Pero lo que DEBE comentarse es el razonamiento específico de la aplicación de por qué el código toma esas decisiones: por ejemplo. "Si un nuevo programador comienza mañana en la compañía y mira el código, ¿tendrá sentido lo que hace sin los comentarios?"
Bobby Tables
57

El patrón de diseño singleton.

Claro, es un patrón útil, pero cada vez que un nuevo programador se entera de este patrón, comienza a tratar de aplicarlo en cada clase que crea.

Raphael
fuente
Utilizo esta excusa mal diseñada para un marco todos los días. codeigniter.com/user_guide/libraries/email.html Piensan que OOP está prefijando funciones con $this->. PHP es un lenguaje podrido, así que no puedo esperar que los marcos sean excelentes.
Keyo
77
Creo que cualquier programador que implemente un singleton y no se arrepienta, arderá en un infierno ardiente por los pecados que él (o ella) ha cometido.
2
Implementé un singleton una vez en mi carrera profesional (en un contexto multitarea) y tuve que arrepentirme de mi pecado reescribiéndolo.
Spoike
3
Los singletons pueden ser útiles para algunas cosas, pero casi siempre se usan cuando no deberían serlo. Eso no significa que los singletons nunca deberían usarse, solo porque algo se abusa no significa que no se pueda usar correctamente.
configurador
2
@Rapahel: Eso es exactamente por qué no creo que estudiar patrones de diseño sea algo bueno.
configurador
53

Lo más malvado para proteger la programación tonta. poner todo en un intento de captura y no hacer nada con la captura

        try
        {
            int total = 1;
            int avg = 0;
            var answer = total/avg;
        }
        catch (Exception)
        {

        }

Me estremezco cuando veo un intento de captura que no hace nada y está diseñado para manejar la lógica tonta. En general, las capturas de prueba se usan en exceso, sin embargo, en algunos casos son muy útiles.

Nickz
fuente
44
Cosa curiosa: acabo de editar un archivo que lo hace cientos de veces, y con razón. Es un archivo de prueba unitaria, que prueba que varios métodos arrojan una excepción cuando se espera. El bloque de prueba contiene una llamada y un informe de "no se produjo el lanzamiento esperado". La excepción es esperada y correcta, por lo que no hay acción correctiva. Obviamente, las pruebas unitarias son un caso especial, pero he tenido casos similares en código real. Bandera roja, sí, pero no es una regla absoluta.
Steve314
55
@Steve el caso que describiste es una condición de borde rara. Otro que se me ocurre es el código de registro: si el registro falla, no tiene sentido intentar registrar la excepción o interrumpir la aplicación.
dbkk
1
@dbkk: acepté la condición de borde, y agregaría eso cuando realmente necesite atrapar una excepción pero no necesite una acción correctiva, agregando un comentario en el bloque de captura para explicar que es esencial aunque solo sea para calmar mantenedores. No es tan raro en las pruebas unitarias, por lo que dejaría el comentario en ese caso.
Steve314
55
en error reanudar siguiente
jk.
2
@ jk01: una excepción no es (necesariamente) un error. Si alguna condición es un error o no depende del contexto. Por ejemplo, "archivo no encontrado" no es un error si no necesita el archivo. Tal vez es solo un archivo de configuración opcional que puede o no estar presente, y puede dejar sus valores predeterminados en su lugar si el archivo no está allí (por lo que no se necesitan acciones correctivas después de la captura).
Steve314
47

Confíe en StackOverflow para resolver sus problemas en lugar de resolverlo de la manera difícil.

Los nuevos programadores que encuentran la riqueza del conocimiento sobre SO (con demasiada frecuencia) publican antes de pensar y probar cosas.

En mi día tuvimos que codificar de libros, sin internet, sin SO. Ahora sal de mi césped.

Byron Whitlock
fuente
28
Debo admitir que me estremezco ante la audacia de algunas preguntas sobre SO. Ya sea porque se les pregunta muchas veces al día y obviamente no han buscado nada; o peor aún, tratan a la comunidad como un servicio gratuito de outsourcing.
Orbling
2
@dbkk: stackoverflow.com/questions/4665778/… -> primer comentario "¿alguna vez has intentado esto?"
Matthieu M.
55
Empecé a aprender de los libros, pero una vez que tuve una base aprendí casi todo lo demás en las discusiones de foros en línea. No preguntando, sino principalmente (y al principio, exclusivamente) leyendo. Este método me ha enseñado varios lenguajes de programación en una profundidad insoportable (con muchos rincones y grietas), y creo que no es un mal método en absoluto.
Konrad Rudolph
1
@Konrad Rudolph: Ese método es bueno y sabio, leer preguntas, buscar bien. La mejor forma de preguntar es cuando el autor de la pregunta tiene un marco con el cual entender las respuestas. Con demasiada frecuencia, las personas hacen preguntas que no tienen (todavía) la capacidad de entender.
Orbling
3
El problema es que ASÍ fomente esto dando una gran cantidad de representantes para hacer / responder preguntas muy fáciles que pueden responderse con una simple búsqueda en Google. preguntas muy difíciles que las personas responden solo porque realmente quieren hacerlo.
IAdapter
36

OOP evidentemente. Es muy valioso, pero cuando se usa incorrectamente puede oscurecer el código claro de otra manera con bastante facilidad (me vienen a la mente algunos ejemplos de programación S4 en R) y puede proporcionar una sobrecarga tremenda que es innecesaria y puede costarle mucho en rendimiento.

Otra cosa es que (por ejemplo, Perl) la OOP a menudo se reduce a escribir lo mismo al revés: en result = $object ->function(pars)lugar de result = function(object, pars)esto, a veces tiene sentido, pero cuando se mezcla con la programación de procedimientos, puede hacer que leer el código sea bastante confuso. Y aparte de eso, simplemente introduce más gastos generales donde no mejora el diseño. También se reduce a lo que se dice sobre el patrón singleton: debe usarse, pero no en todo.

Yo mismo uso OOP, pero en mi campo (computación científica) el rendimiento es un gran problema, y ​​a menudo se abusa de OOP allí, ya que todos los estudiantes obtienen Java hoy en día. Es ideal para tratar problemas más grandes, para conceptualizar, etc. Pero si trabaja con, por ejemplo, secuencias de ADN en BioPerl, usar los objetos cada vez y trabajar de manera consistente con captadores y establecedores puede aumentar diez veces el tiempo de cálculo. Cuando su código se ejecuta unos días en lugar de unas pocas horas, esa diferencia realmente importa.

Joris Meys
fuente
66
@Craige: Yo mismo uso OOP, pero en mi campo (computación científica) el rendimiento es un gran problema, y ​​a menudo se abusa de OOP ya que todos los estudiantes obtienen Java en la actualidad. Es ideal para tratar problemas más grandes, para conceptualizar, etc. Pero si trabaja con, por ejemplo, secuencias de ADN en BioPerl, usar los objetos cada vez y trabajar de manera consistente con captadores y establecedores puede aumentar diez veces el tiempo de cálculo. Cuando su código se ejecuta unos días en lugar de unas pocas horas, esa diferencia realmente importa.
Joris Meys
1
@Craige: El encadenamiento de métodos (como Foo.DoX().DoY().DoZ()) es bueno, pero definitivamente no es la única forma de hacer algo. Composición de la función (como doZ . doY . doX $ fooes una alternativa perfectamente válida.
Anon.
1
@Joris: algo que me he preguntado durante mucho tiempo (yo mismo soy un bioinformático): si el rendimiento es tan importante, ¿por qué usar Perl en primer lugar en lugar de C ++? Si le preocupa reducir un factor 10 del tiempo de ejecución (¡preocupación válida!), Entonces cambiar a C ++ le brinda una satisfacción instantánea. Por supuesto, el lenguaje apesta ... pero entonces, también lo hace Perl ... y hay buenas bibliotecas de bioinformática para C ++.
Konrad Rudolph
1
@ Konrad: Depende. Se puede decir que BioPerl tiene la mayor cantidad de paquetes para bioinformáticos de todos los idiomas (aunque creo que Python se está poniendo al día). Además, se ha realizado mucho trabajo en Perl y adaptar un script es más fácil que reescribir todo en C ++. Por último, no sirve para escribir una aplicación completa cuando lo hará un script. Supongo que es por eso que Perl sigue existiendo tanto. Y sinceramente, no me importa, me gusta el idioma. Todavía es lo mejor que sé para el trabajo de cadenas y archivos. Obviamente, los cálculos se realizan en otros idiomas y se vinculan de nuevo (lo cual es bastante fácil).
Joris Meys
1
@ Konrad: depende de cómo se haga. Es posible hacer todo en Perl, pero Perl se puede vincular fácilmente a otras herramientas, especialmente en Linux. Utilizo Perl a menudo como un script de bash avanzado con una fuerte manipulación de cadenas y una fácil construcción de conjuntos de datos para colocarlos en otras aplicaciones.
Joris Meys
27

Después de haber pasado varios años en ASP.NET Webforms, tendría que decir inequívocamente:

La interfaz de usuario inteligente

Si bien es completamente posible crear aplicaciones en capas y comprobables en formularios web, Visual Studio hace que sea muy fácil para los desarrolladores hacer clic con un clic en formularios estrechamente vinculados a su fuente de datos, con la lógica de la aplicación en todo el código de la interfaz de usuario.

Steve Sanderson explica este antipatrón mucho mejor que yo en su libro Pro ASP.NET MVC:

Para crear una aplicación de interfaz de usuario inteligente, un desarrollador primero construye una interfaz de usuario, generalmente arrastrando una serie de widgets de interfaz de usuario a un lienzo, y luego completa el código del controlador de eventos para cada posible clic de botón u otro evento de interfaz de usuario. Toda la lógica de la aplicación reside en estos controladores de eventos: lógica para aceptar y validar la entrada del usuario, para realizar el acceso y almacenamiento de datos, y para proporcionar comentarios mediante la actualización de la IU. Toda la aplicación consta de estos controladores de eventos. Esencialmente, esto es lo que tiende a salir por defecto cuando pones a un novato frente a Visual Studio. En este diseño, no hay separación de preocupaciones en absoluto. Todo está fusionado, organizado solo en términos de los diferentes eventos de IU que pueden ocurrir. Cuando la lógica o las reglas comerciales deben aplicarse en más de un controlador, el código generalmente se copia y pega, o ciertos segmentos elegidos al azar se descomponen en clases de utilidad estática. Por tantas razones obvias, este tipo de patrón de diseño a menudo se llama antipatrón.

richeym
fuente
1
Una GUI es al menos algún tipo de código de especificación al que debe adherirse. No creo que a los programadores que describe les vaya mejor si se les presenta un archivo de texto en blanco.
44
@qpr, no sé sobre eso. Si tuvieran un archivo de texto en blanco, es posible que no puedan hacer nada (lo que podría ser una ventaja).
Ken Henderson el
Uno de los muchos beneficios de usar WPF es que la implementación de MVVM rompe este anti-patrón en pedazos.
Robert Rossney el
2
Mil veces esto. Incluso veo desarrolladores experimentados de .NET que confían en este "patrón" porque es más fácil que comprender o preocuparse por la separación de preocupaciones. Incluso si no utilizan los asistentes de arrastrar y soltar, el "patrón" más común en el desarrollo de .NET WebForms es hacer todo en eventos de código subyacente y copiar / pegar código según sea necesario.
Wayne Molina
23

Veo esto ocasionalmente y generalmente resulta de no comprender completamente las expresiones booleanas.

if (someCondition == true)
Corey
fuente
16
Tiene la ventaja de hacer el código más explícito
Pemdas
77
Creo que un vistazo a esta pregunta está en orden: programmers.stackexchange.com/questions/12807/…
gablin
55
No hago eso, pero, en serio, supéralo. Hay muchísimo peor por ahí. :)
MetalMikester
44
Si nombró sus variables correctamente, por ejemplo bool, si comienza con iso has, no necesita hacer que su código sea más explícito con = true.
Nadie
3
@DisgruntledGoat porque no debería estar en uso en absoluto
Corey
19

Reimplementando la funcionalidad central (o proporcionada de otro modo), ya sea por ignorancia de su existencia o por una necesidad percibida de personalizaciones.

l0b0
fuente
2
El aprendizaje es una excepción. Al estudiar cualquier cosa, a menudo es beneficioso "reinventar la rueda".
Maxpm
Seguro: debería haber especificado que es relevante solo al crear software de producción.
l0b0
1
Esto es particularmente malo cuando se implementa algo relacionado con la seguridad. Un buen software de seguridad evita ataques en los que la mayoría de las personas nunca piensan.
David Thornley
Esto lo veo muy común. ¡Necesitamos X, escribamos el nuestro! Pero, ¿qué pasa con el paquete de código abierto Y? No, necesitamos un software personalizado para nuestros secretos comerciales súper secretos que son los mismos que todos los demás en nuestra industria, ¡no podemos usar un software de basura común!
Wayne Molina
18

Herencia.

No impongas is-a donde no tiene sentido.

Equipo
fuente
66
El problema es que intuitivamente "is-a" parece tener mucho sentido (en particular, ya que cada relación de implementación / contrato puede expresarse coloquialmente como "is-a"). Se requiere una sólida comprensión de OOP para darse cuenta de que esto es de hecho un error, y que la herencia y la implementación de la interfaz son fundamentalmente diferentes.
Konrad Rudolph
@ Konrad: estoy totalmente de acuerdo. Trato de alentar a las personas a comenzar con la composición , pasar a las interfaces y considerar la herencia al final. (Como regla general, por supuesto). Pero tal vez ese es mi fondo de VB hablando ... ;-)
Mike Woodhouse
1
Sin embargo, esta es en gran medida una pregunta de diseño de lenguaje. La razón por la que debería "preferir la composición sobre la herencia (implementación)" en lenguajes como Java o C #, es porque la herencia de implementación apesta en esos lenguajes. Algunas personas critican la construcción de software orientado a objetos de Bertrand Meyer por el uso excesivo de la herencia, pero cuando observas a Eiffel (el lenguaje utilizado en el libro), te das cuenta de que fue diseñado para la herencia de implementación , y por lo tanto está bien usar la herencia sobre composición. En ese caso, al menos.
Jörg W Mittag
14

Personalización de software estándar.

Si bien puedo reconocer que esto puede ser útil, me pregunto cuánto dinero se gasta en hacer pequeñas cosas para obtener ganancias cuestionables. Aquí es donde una empresa puede gastar cientos de miles, si no millones de dólares, en licencias para algún software que luego se personaliza porque es tan configurable, editable y flexible que realmente no hace mucho por defecto. Al final, es una aplicación personalizada debido a que todo el nuevo código agregó lo que inicialmente se compró.

JB King
fuente
¿No es más probable que sea el caso con una aplicación personalizada?
JeffO
13

Usando el cumplidor como depurador.

Ignorando las advertencias del cumplidor o apagándolas por completo.

Variables globales.

Pemdas
fuente
18
¿Qué tiene de malo "usar el compilador como depurador"? Tener un compilador capaz de señalar errores en su código antes de que se conviertan en un problema en tiempo de ejecución es una gran ventaja.
Mason Wheeler
3
Confío en que el compilador detecta mis errores de sintaxis y errores incorrectos de coincidencia de tipos. Para los errores de comportamiento, confío en los casos de prueba.
gablin
55
El problema es cuando comienzas a depender del compilador para garantizar la corrección del programa. ¿Esto compiló? No, déjame analizar esta pequeña sección y ver si eso la solucionó. ¿Se compiló? No, déjame agregar un * aquí y allá y ver si se compila. ... ect. Obviamente, es útil para corregir errores tipográficos
Pemdas
2
Dices eso como si el codificador estuviera hurgando ciegamente en la oscuridad tratando de hacer algo, cualquier cosa, para que el código se compile de alguna manera. Así no es como funciona IME; el compilador le da un mensaje de error útil y le señala la ubicación del error, y generalmente si algo no se está compilando, es un código nuevo que usted mismo escribió, por lo que tiene una idea bastante clara de lo que está mal y cómo solucionarlo una vez que se ha señalado fuera. (Aunque si está lanzando * s aleatorios, es posible que esté trabajando en C ++, donde se sabe que los errores del compilador son sumamente inútiles, por lo que lo que dije puede no aplicarse).
Mason Wheeler
3
Confiar en el compilador funciona muy bien, dado un sistema de tipos lo suficientemente fuerte y una base de código bien tipada. A menudo, el sistema de tipos puede modelar restricciones importantes para las que de lo contrario tendría que escribir pruebas (por ejemplo, en sistemas con tipos débiles). De manera juiciosa, el compilador (y particularmente su verificador de tipos) es un gran activo para probar y depurar, y no hay nada de malo en confiar en él. En particular, está mal decir que un compilador solo puede mostrar errores de sintaxis.
Konrad Rudolph
11

Todos los patrones de diseño.

Son como sal o azúcar. Algunos de ellos en su comida lo hacen genial, muchos de ellos hacen que su comida sea una mierda.

No me malinterpretes. Los patrones de diseño son técnicas maravillosas. Los usé mucho. Pero a veces, encuentro programadores, (algunos de ellos mis ex jefes), que tenían estos "¡tienes que usar un patrón de diseño", incluso si no coincide con el problema!

Un ejemplo es el "Patrón de visitante" que está más dirigido a "Colecciones lineales / secuenciales". Tuve que trabajar con una estructura de datos de árbol, una vez. Para "visitar" cada elemento, codifico un método de patrón no diseñado, y un ex jefe insiste en usar o adaptar el "Patrón de visitante". Luego, busco en la red, para una segunda opinión. Bueno, otros programadores tuvieron la misma situación y la misma solución. Y llámelo el "Patrón de visitante jerárquico / árbol"., Como un NUEVO patrón de diseño

Espero que se agregue como un nuevo patrón a los existentes, en una nueva versión del libro "Patrones de diseño".

revs umlcat
fuente
3
Nunca uso patrones de diseño, aunque a veces surgen naturalmente en mi código.
Configurador
¿Cómo va el dicho? ¿Comienzas a usar patrones sin saber que los estás usando, luego aprendes sobre ellos y los usas en todas partes, luego se convierten en una segunda naturaleza, entonces comienzas a usarlos sin saber que los estás usando?
Wayne Molina
2
@configurator Cuando leo sobre los patrones de diseño; También descubrí que yo y otros desarrolladores ya
estábamos
9

Uso de excepciones como control de flujo. Algo similar a esta respuesta , pero diferente.

Tragar excepciones es una mala forma porque introduce errores misteriosos y difíciles de encontrar en el código. Usar excepciones como control de flujo, por otro lado, es malo porque hace que el código sea mucho más ineficiente de lo que podría ser, y es conceptualmente descuidado.

El manejo de excepciones solo debe usarse para manejar escenarios realmente excepcionales (duh), imprevistos, no cosas como un usuario que escribe un carácter alfabético donde se espera un número. Este tipo de abuso de excepción es extremadamente común entre los programadores malos en el mundo de Java.

3 revoluciones
fuente
Las excepciones que generan códigos ineficientes dependen de su idioma: crear un marco de pila, etc. En Squeak, su pila está completamente reificada, por lo que no hay diferencia entre usar excepciones o no. (En otras palabras, las excepciones son parte de la biblioteca, no del lenguaje). Sin embargo, es confuso trabajar con un flujo de control controlado por excepción: lshift.net/blog/2011/01/04/try-again-with-exceptions muestra Un bucle de uso de excepciones que encontré recientemente.
Frank Shearar
Con respecto al último párrafo, nuevamente, depende de su idioma. Las excepciones ("condiciones") en Common Lisp son un superconjunto estricto de las ideas de excepciones de la mayoría de los idiomas. Vea ejemplos aquí: gigamonkeys.com/book/… ¡ Como con todo, puede ir demasiado lejos!
Frank Shearar
La legibilidad y la facilidad de mantenimiento superan el rendimiento. Los casos en los que usaré excepciones para el éxito (lo que supongo que quiere decir con "control de flujo") son muy raros, pero pueden dar un código más limpio, por ejemplo, en una búsqueda recursiva compleja. En general, estoy de acuerdo sin embargo. Por ejemplo, tengo contenedores con métodos de iterador que devuelven falso por estar fuera de rango (común al final de una iteración), pero arrojan una excepción si el iterador es "nulo" (un signo probable de algún tipo de inconsistencia interna)
Steve314
7

Voy a ir con inflexibilidad a través del ocultamiento excesivo de datos.

Todos sabemos que la abstracción y el ocultamiento de la implementación son buenos, pero más no siempre es mejor. Exagerado, puede obtener un resultado inflexible que no puede hacer frente a los cambios en los requisitos. Para manejar el cambio, no solo tiene que modificar la clase que necesita manejar ese cambio, sino que también debe crear una forma para que la información que nunca antes necesitó fuera accesible a pesar de las capas de ocultación de datos.

El problema es que, como con todos los problemas de encontrar el equilibrio adecuado para cada contexto, requiere experiencia.

Steve314
fuente
6

Estado mutable y bucles. Casi nunca los necesita, y casi siempre obtiene un mejor código sin ellos.

Por ejemplo, esto se toma directamente de un hilo de StackOverflow:

// ECMAScript
var thing, things_by_type = {};
for (var i = 0; i < things.length; i++) {
    thing = things[i];
    if(things_by_type[thing.type]) {
        things_by_type[thing.type].push(thing);
    } else {
        things_by_type[thing.type] = [thing];
    }
}

# Ruby
things_by_type = {}
things.each do |thing|
  (things_by_type[thing.type] ||= []) << thing
end

Ambos están haciendo lo mismo. Pero no tengo idea de lo que están haciendo. Afortunadamente, la pregunta realmente explica lo que están haciendo, así que pude reescribirlos de la siguiente manera:

// ECMAScript
things.reduce(function (acc, thing) {
    (acc[thing.type] || (acc[thing.type] = [])).push(thing);
    return acc;
}, {});

# Ruby
things.group_by(&:type)

// Scala
things groupBy(_.type)

// C#
from thing in things group thing by thing.Type // or
things.GroupBy(thing => thing.Type);

No hay bucles ni estado mutable. Bueno, está bien, no hay bucles explícitos ni contadores de bucles.

El código se ha vuelto mucho más corto, mucho más simple, mucho más parecido a una descripción de lo que se supone que debe hacer el código (especialmente en el caso de Ruby dice casi directamente "agrupe las cosas por tipo"), y mucho menos propenso a errores. No hay peligro de que se salga del final de la matriz, los errores de poste de cerca o los errores de uno por uno con los índices de bucle y las condiciones de terminación, porque no hay índices de bucle ni condiciones de terminación.

Jörg W Mittag
fuente
Creo que en la segunda línea de su ECMAScript "fijo" debería leer (acc[thing.type] || (acc[thing.type] = [])), en lugar de `= [cosa] , unless you want to add cosa` a la lista dos veces ... ¿O me estoy perdiendo algo?
Austin Hyde
@Austin Hyde: Tienes razón.
Jörg W Mittag
1
Ese ejemplo de ecmascript es incomprensible para muchos programadores. Se basa en demasiados trucos sintácticos. El ciclo tiene la ventaja de ser obvio para los desarrolladores junior.
Joeri Sebrechts
6

Burlón. Introduce demasiados requisitos artificiales para un desacoplamiento excesivo en su código, conduce a un código de raviolis de ingeniería excesiva y fuerza el diseño de estilo OO por su garganta cuando un diseño más procesal o funcional podría ser una solución más simple para su problema.

dsimcha
fuente
De acuerdo en teoría; simulacros son útiles pero no tienen que tener ellos.
Wayne Molina
La invasividad de la burla depende del lenguaje que uses. En C #, puede ser muy invasivo y agrega balsas de interfaces innecesarias.
Frank Hileman
3

Los programadores de Delphi en todo el mundo han descubierto en los últimos dos años lo malo que es usar matrices de caracteres para almacenar bytes debido a la conversión de Unicode a gran escala

Y, "pronto" aprenderemos lo malo que es almacenar enteros en listas cuando queramos hacer el cambio a 64 bits.

Peter Turner
fuente
2
Creo que una gran fracción de los problemas de Unicode nunca habría surgido si Borland hubiera declarado un tipo DataString que era básicamente el mismo que AnsiString pero específicamente para usar con blobs, y luego se aseguró de que la gente lo supiera.
Mason Wheeler
2

Propiedades. Sé que esto es controvertido, pero creo que las propiedades se usan en exceso en .net.

¿Cuál es la diferencia entre estas dos líneas?

public string Property { get; set; }

public string Field;

Para el desarrollador, la diferencia es: absolutamente nada. El formulario compilado es un poco diferente, por lo que si está escribiendo una biblioteca, y esa biblioteca se actualizará en programas, y no puede volver a compilar los programas en sí (por ejemplo, si está escribiendo una interfaz para complementos que debería funcionar en todas las versiones de su software), entonces no debería usar campos públicos porque no puede reemplazarlos con propiedades. En cualquier otro caso, no hay absolutamente ninguna diferencia entre usar un campo o una propiedad automática sin modificadores.

configurador
fuente
1
Convenido; si conoce el 100%, nunca necesitará hacer nada para obtener / establecer una "propiedad", entonces no hay ninguna razón para tener una propiedad. Sin embargo, si existe la posibilidad de que deba hacer algo (por ejemplo, registrar que se modificó un valor), debe usar una propiedad. Personalmente no veo una diferencia lo suficientemente grande como para no utilizar la propiedad, en caso de que haces necesidad de modificar más tarde (lo sé, lo sé YAGNI, pero me siento desviarse en este caso, no cuesta nada)
Wayne Molina
2
@Wayne: ¿Cómo es cambiar ;a { get { ... } set { ... } }más trabajo que cambiar { get; set; }a { get { ... } set { ... } }?
configurador
Ahora que lo pienso, ese es un punto justo.
Wayne Molina