En la programación orientada a objetos , "grupo de datos" es un nombre que se le da a cualquier grupo de variables que se pasan juntas (en un grupo) a lo largo de varias partes del programa. Un grupo de datos, como otros olores de código , puede indicar problemas más profundos con el diseño o la implementación del programa. El grupo de variables que típicamente componen un grupo de datos a menudo están estrechamente relacionados o son interdependientes y, como resultado, a menudo se usan juntos en un grupo. Un grupo de datos también se conoce como un tipo específico de olor a código a nivel de clase que puede ser un síntoma de un código fuente mal escrito.
Refactorización de grupos de datos
En general, los grupos de datos deben refactorizarse . La presencia de grupos de datos generalmente indica un diseño de software deficiente porque sería más apropiado agrupar formalmente las diferentes variables en un solo objeto y pasar solo este objeto en lugar de las numerosas primitivas. El uso de un objeto para reemplazar un grupo de datos puede reducir el tamaño general del código y ayudar a que el código del programa permanezca mejor organizado, más fácil de leer y más fácil de depurar.
El proceso de eliminación de grupos de datos corre el riesgo de crear un tipo diferente de olor a código (una clase de datos, que es una clase que solo almacena datos y no tiene ningún método para operar realmente con los datos); sin embargo, la creación de la clase alentará al programador a ver la funcionalidad que también podría incluirse aquí. [1] [2]
En la programación orientada a objetos, el propósito de los objetos es encapsular tanto los datos relevantes (campos) como las operaciones ( métodos ) que se pueden realizar con estos datos. [3] El hecho de no agrupar campos en un objeto verdadero puede desalentar la asociación de acciones relevantes.
Una lista larga de parámetros / variables no necesariamente indica un grupo de datos; es sólo cuando los diversos valores aquí están íntima y lógicamente relacionados que su presencia se considera un grupo de datos. Aunque estos casos son raros, es posible que un método tome legítimamente media docena o más de parámetros completamente no relacionados que no podrían convertirse limpiamente en un solo objeto. Sin embargo, esto sugiere que el método está tratando de hacer demasiado y sería mejor dividirlo en varios métodos, cada uno de los cuales es responsable de una parte menor de la responsabilidad general. Esto es una nueva oportunidad para utilizar la refactorización con el fin de mejorar la calidad del código.
La refactorización para eliminar grupos de datos no necesita hacerse a mano. Muchos IDE modernos con todas las funciones tienen una funcionalidad (a menudo etiquetada como "Clase de extracción") que es capaz de realizar esta refactorización de forma automática o casi. Esto puede disminuir el costo y mejorar la confiabilidad de la refactorización, lo que permite a los desarrolladores que de otra manera serían reacios a hacerlo de manera conveniente.
Ejemplo
Naturalmente, los grupos de datos pueden existir en cualquier lenguaje de programación orientado a objetos. El siguiente ejemplo se eligió simplemente por su simplicidad en el alcance y la sintaxis.
C ª#
Antes de la refactorización
public void AddCoords ( int x , int y , int z ) { / *… * / }
Publicar refactorización
public void AddCoords ( Coords coords ) { / *… * / }público de clase Coords { públicas Coords ( int x , int Y , int z ) { X = x ; Y = y ; Z = z ; } public int X { obtener ; } public int Y { get ; } public int Z { obtener ; } }
En Java
public static void main ( String args [] ) { String firstName = args [ 0 ] ; String lastName = args [ 1 ] ; Integer age = new Integer ( args [ 2 ] ); String género = args [ 3 ] ; Ocupación de la cadena = args [ 4 ] ; Cadena ciudad = args [ 5 ] ; welcomeNew ( primerNombre , lastName , edad , sexo , ocupación , de la ciudad ); } public static void welcomeNew ( String firstName , String lastName , Integer age , String género , String ocupación , String ciudad ) { System . fuera . printf ( "Bienvenido% s% s,% d un años de edad, desde% s% s que trabaja como% s \ n" , primerNombre , lastName , la edad , el género , la ciudad , la ocupación ); }
En el ejemplo anterior, todas las variables podrían encapsularse en un solo objeto "Persona", que podría pasarse por sí mismo. Además, el programador puede reconocer que el welcomeNew
método se asociaría mejor con la Person
clase y, a continuación, podría proponer otras acciones relevantes asociadas con la Persona. Por ejemplo, el código podría refactorizarse y expandirse de la siguiente manera:
public static void main ( String args [] ) { String firstName = args [ 0 ] ; String lastName = args [ 1 ] ; Integer age = new Integer ( args [ 2 ] ); String género = args [ 3 ] ; Ocupación de la cadena = args [ 4 ] ; Cadena ciudad = args [ 5 ] ; Persona Joe = nueva persona ( primerNombre , lastName , edad , sexo , ocupación , de la ciudad ); Joe . welcomeNew (); Joe . trabajo (); } Persona de clase estática privada { / * Todos los parámetros se han movido a la nueva clase de Persona donde están agrupados y encapsulados correctamente * / Nombre de cadena ; String lastName ; Edad entera ; Género de cadena ; Ocupación de cuerdas ; Ciudad de cuerdas ; pública persona ( Cadena primerNombre , Cadena lastName , Entero edad , Cadena de género , Cadena ocupación , cadena de la ciudad ) { esto . firstName = firstName ; esto . lastName = lastName ; esto . edad = edad ; esto . género = género ; esto . ocupación = ocupación ; esto . ciudad = ciudad ; } / * La funcionalidad existente relacionada con los datos también se puede incorporar a la nueva clase, reduciendo el riesgo de colisión del alcance * / public void welcomeNew () { System . fuera . printf ( "Bienvenido% s% s,% d un años de edad, desde% s% s que trabaja como% s \ n" , primerNombre , lastName , la edad , el género , la ciudad , la ocupación ); } / * Además, la nueva clase puede ser una oportunidad para agregar nuevas funciones * / public void work () { System . fuera . printf ( "Esta es% s trabajando duro en% s en% s" , primerNombre , la ocupación , la ciudad ); } }
Aunque esto ha aumentado la longitud del código, ahora la Persona individual puede pasarse fácilmente como un objeto, en lugar de como una variedad de campos (aparentemente no relacionados). Además, esto brinda la oportunidad de mover métodos asociados a la clase para que puedan operar fácilmente en instancias individuales de los mismos. Estos métodos ya no requieren pasar una tediosa lista de parámetros, sino que se almacenan como variables de instancia en las propias instancias del objeto. [4]
Referencias
- ^ Fowler, Martin. "DataClump" . Consultado el 10 de febrero de 2017 .
- ^ "Grupos de datos" . SourceMaking . Consultado el 10 de febrero de 2017 .
- ^ Kindler, E .; Krivy, I. (2011). "Simulación orientada a objetos de sistemas con control sofisticado". Revista internacional de sistemas generales: 313–343. Cite journal requiere
|journal=
( ayuda ) - ^ "¿Cuál es la diferencia entre una variable de clase y una variable de instancia? - Preguntas y respuestas de la entrevista del programador y software" . Preguntas y respuestas para programadores y entrevistas de software . Consultado el 20 de febrero de 2017 .