No lo hagas; complicará demasiado las cosas y no lo vas a necesitar
... es la respuesta que habría escrito aquí hace 2 años. Ahora, sin embargo, no estoy tan seguro; de hecho, en los últimos meses he comenzado a migrar código antiguo a este formato, no porque no tenga nada mejor que hacer, sino porque realmente lo necesitaba para implementar nuevas funciones o cambiar las existentes. Entiendo las aversiones automáticas que otros aquí tienen al ver ese código, pero creo que esto es algo que merece una reflexión seria.
Beneficios
El principal de los beneficios es la capacidad de modificar y extender el código. Si utiliza
class Point {
int x,y;
// other point operations
}
en lugar de simplemente pasar un par de enteros, que es algo que, desafortunadamente, muchas interfaces hacen, entonces se vuelve mucho más fácil agregar luego otra dimensión. O cambie el tipo a double
. Si usa List<Author> authors
o en su List<Person> authors
lugar List<String> authors
más tarde se vuelve mucho más fácil agregar más información a lo que representa un autor. Al escribirlo de esta manera, siento que estoy diciendo lo obvio, pero en la práctica he sido culpable de usar cuerdas de esta manera muchas veces, especialmente en los casos en que no era obvio al principio, entonces necesitaría más de una cuerda.
Actualmente estoy tratando de refactorizar alguna lista de cadenas que se entrelaza a lo largo de mi código porque necesito más información allí, y siento el dolor: \
Más allá de eso, estoy de acuerdo con el autor del blog en que contiene más información semántica , lo que facilita la comprensión del lector. Si bien los parámetros a menudo reciben nombres significativos y obtienen una línea de documentación dedicada, este no suele ser el caso con los campos o los locales.
El beneficio final es la seguridad de tipo , por razones obvias, pero en mi opinión es algo menor aquí.
Inconvenientes
Se tarda más en escribir . Escribir una clase pequeña es rápido y fácil, pero no es fácil, especialmente si necesita muchas de estas clases. Si te detienes cada 3 minutos para escribir una nueva clase de envoltura, también puede ser un verdadero perjuicio para tu concentración. Sin embargo, me gustaría pensar que este estado de esfuerzo generalmente solo ocurrirá en la primera etapa de la escritura de cualquier código; Por lo general, puedo tener una idea bastante rápida de qué entidades necesitarán participar.
Puede involucrar a muchos setters (o construcciones) redundantes y getters . El autor del blog da el ejemplo realmente feo de en new Point(x(10), y(10))
lugar de new Point(10, 10)
, y me gustaría agregar que un uso también podría involucrar cosas como en Math.max(p.x.get(), p.y.get())
lugar de Math.max(p.x, p.y)
. Y el código largo a menudo se considera más difícil de leer, y con justicia. Pero con toda honestidad, tengo la sensación de que mucho código mueve objetos, y solo los métodos seleccionados lo crean, y aún menos necesitan acceso a sus detalles arenosos (que de todos modos no son OOPy).
Discutible
Diría que si esto ayuda o no con la legibilidad del código es discutible. Sí, más información semántica, pero código más largo. Sí, es más fácil comprender el papel de cada local, pero es más difícil entender qué puede hacer con él a menos que vaya y lea su documentación.
Como con la mayoría de las otras escuelas de pensamiento de programación, creo que no es saludable llevar esto al extremo. No me veo separando las coordenadas x e y para ser de un tipo diferente. No creo que Count
sea necesario cuando int
debería ser suficiente. No me gusta el unsigned int
uso en C, aunque en teoría es bueno, simplemente no le brinda suficiente información y prohíbe extender su código más tarde para admitir ese -1 mágico. A veces necesitas simplicidad.
Creo que la publicación del blog es un poco extrema. Pero, en general, aprendí por experiencia dolorosa que la idea básica detrás de esto está hecha de las cosas correctas.
Tengo una profunda aversión al código sobredimensionado. Realmente lo hago Pero bien usado, no creo que esto sea una ingeniería excesiva.