elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: ¿Eres nuevo? ¿Tienes dudas acerca del funcionamiento de la comunidad? Lee las Reglas Generales


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  Java
| | | |-+  Sobre buenas prácticas de programación
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Sobre buenas prácticas de programación  (Leído 3,528 veces)
zonahurbana

Desconectado Desconectado

Mensajes: 178

RS, JC.


Ver Perfil WWW
Sobre buenas prácticas de programación
« en: 14 Marzo 2014, 19:49 pm »

En C++ no llegué a usar mucho clases y objetos, más que todo usaba funciones que se llamaban entre sí o que eran recursivas.

En Java, digamos que ya he usado la POO como tal. Entonces, en muchas ocasiones pude reutilizar código sin tantas complicaciones, a través de herencia y polimorfismo. Incluso creo que comencé a utilizar mejor los métodos, y a crearlos siempre que fuese conveniente.

Ahora me encuentro con una situación un tanto particular, en la que me he detenido por pensar qué es lo mejor que puede hacerse.

Tengo un método agregarProducto en una clase que gestiona un listado del mismo.
Aquí se tienen las restricciones para los atributos ingresados. Si hubo error, el producto no se agrega al listado y se devuelve una advertencia como String. Si no hubo error, el producto es agregado y se devuelve null.

Ahora he querido agregar un método modificarProducto. A éste se le pasa la posición del producto a modificar (existe un método que devuelve la posición de un producto buscándolo por su código) y los atributos que deben asignarse.

Creo que lo más correcto es copiar el código de agregarProducto pero cambiar las líneas en las que se agrega... es decir, cambiar el add por un set (el listado es un ArrayList). Así, modificar también devuelve una advertencia, y si no la hay, devuelve null.

Pero me pareció extraño copiar el código ya que no lo hacía por un buen tiempo, y pensé en lo siguiente:

1. Podría hacer que agregarProducto llame a modificarProducto y que en vez de pasarle una posición intermedia, le pase la última posición+1. Pero podría darse el caso de que no se haya reservado memoria para tal posición aún.

2. Podría hacer lo anterior pero en el método modificarProducto evaluar si la posición es mayor a la longitud actual del ArrayList. De ser así agregar (usar add), sino, modificar (usar set).

3. Que agregarProducto se mantenga tal cual pero modificarProducto llame a agregarProducto. En caso de que se haya agregado, pasar ese objeto a la posición que se quiere modificar y luego eliminar la última posición. Así modificar ya no tiene el mismo código (no tendría que copiarlo) y se modificaría la posición deseada con datos correctos. Lo malo es que estoy haciendo operaciones adicionales.

A fin de cuentas, es mejor a veces copiar el código que tratar de no hacerlo y complicarse en vano, ¿verdad?
Además, más líneas de código pueden estar más optimizadas que otras muy pocas.

A veces me pasa esto, que me lío en vano, pudiendo simplemente avanzar con el programa y no detenerme a pensarlo tanto.

Edit: Muchas gracias por su interés, espero que puedan ayudarme un poco comentando cómo creen que es conveniente hacerlo.


En línea

Nunca dejar de aprender es importante, más allá del ritmo que se siga ...
1mpuls0


Desconectado Desconectado

Mensajes: 1.186


Ver Perfil
Re: Sobre buenas prácticas de programación
« Respuesta #1 en: 14 Marzo 2014, 20:19 pm »

Hola.

De poder si puedes, pero yo no te lo recomendaría, no sería una buena práctica.

Por ejemplo los siguientes métodos.

existeProducto(String producto) -> retorna verdadero o falso si un producto existe en la lista
obtenerIdProducto(String producto) -> retorna la clave del producto
agregarProducto(String categoria, String producto) -> agrega el producto a la lista.

Es decir las funciones deben estar creadas para su propósito puntual.

Citar
A fin de cuentas, es mejor a veces copiar el código que tratar de no hacerlo y complicarse en vano, ¿verdad?
Además, más líneas de código pueden estar más optimizadas que otras muy pocas.

Tu lo haz dicho!

A veces por querer ahorrarnos algunas líneas de código (simplemente por hacerlo más pequeño) tratando de implementar métodos o funciones dentro de otras resulta más complicado.

No sé que alcance tenga tu proyecto, pero y si en un futuro necesita modificaciones en esos módulos?, posiblemente sea más complicado realizarlo como lo haz pensado que si estuviese separado.

Saludos.


En línea

abc
zonahurbana

Desconectado Desconectado

Mensajes: 178

RS, JC.


Ver Perfil WWW
Re: Sobre buenas prácticas de programación
« Respuesta #2 en: 15 Marzo 2014, 00:27 am »

Gracias por contestar.

En realidad es una aplicación un tanto extensa pero solo la estoy realizando a modo de práctica, es decir, no va a ser usada... pero desde ya quería escribir un código bien estructurado.

Los métodos serían:
Código
  1.    public String agregarEmpleado(String apellidos, String nombres, String DNI, String sueldoCadena, String password, boolean tipoTrabajador) {
  2.  
  3.        // Borramos espacios al inicio y al final con trim()
  4.        apellidos = apellidos.trim();
  5.        nombres = nombres.trim();
  6.        DNI = DNI.trim();
  7.  
  8.        if(apellidos.isEmpty() || nombres.isEmpty() || DNI.isEmpty() || password.isEmpty())
  9.            return "Se han encontrados datos vacíos o que sólo contienen espacios.";
  10.  
  11.        if(password.length()<6)
  12.            return "La contraseña debe tener al menos 6 caracteres.";
  13.  
  14.        if(DNI.length() != 8)
  15.            return "El DNI debe tener 8 dígitos.";
  16.  
  17.        if(buscarPorDNI(DNI) != -1)
  18.            return "Ya existe un empleado registrado con este DNI.";
  19.  
  20.        Double sueldo;
  21.        try{
  22.            sueldo = Double.parseDouble(sueldoCadena);
  23.        }catch(NumberFormatException e){
  24.            return "El saldo ingresado no se corresponde con un valor numérico.";
  25.        }
  26.  
  27.        empleados.add( new Empleado(apellidos, nombres, DNI, sueldo, password, tipoTrabajador) );
  28.        return null; // Si devuelve null es porque no hubo error.
  29.    }
  30.  
  31.    public String modificarEmpleado(int posicion, String apellidos, String nombres, String DNI, String sueldoCadena, String password, boolean tipoTrabajador) {
  32.  
  33.        // Borramos espacios al inicio y al final con trim()
  34.        apellidos = apellidos.trim();
  35.        nombres = nombres.trim();
  36.        DNI = DNI.trim();
  37.  
  38.        if(apellidos.isEmpty() || nombres.isEmpty() || DNI.isEmpty() || password.isEmpty())
  39.            return "Se han encontrados datos vacíos o que sólo contienen espacios.";
  40.  
  41.        if(password.length()<6)
  42.            return "La contraseña debe tener al menos 6 caracteres.";
  43.  
  44.        if(DNI.length() != 8)
  45.            return "El DNI debe tener 8 dígitos.";
  46.  
  47.        if(buscarPorDNI(DNI) != -1)
  48.            return "Ya existe un empleado registrado con este DNI.";
  49.  
  50.        Double sueldo;
  51.        try{
  52.            sueldo = Double.parseDouble(sueldoCadena);
  53.        }catch(NumberFormatException e){
  54.            return "El saldo ingresado no se corresponde con un valor numérico.";
  55.        }
  56.  
  57.        empleados.set( posicion, new Empleado(apellidos, nombres, DNI, sueldo, password, tipoTrabajador) );
  58.        return null; // Si devuelve null es porque no hubo error.
  59.    }

Cuando se agregue, los datos serán enviados desde un formulario.
Cuando se modifique, será desde una tabla y aquí puede haber un ligero problema.

Lo malo es que, si el administrador modifica un empleado en la tabla (y le modifica todos sus atributos) yo no tendría como identificar a ese empleado en todo mi ArrayList, ya que la tabla no muestra todos los empleados, sólo los que son resultados de una búsqueda (haciendo imposible que coincida la posición del empleado en la lista con su posición en el ArrayList). Creo que tendré que poner que el código no sea modificable, así tendría cómo ubicarlo siempre.
En línea

Nunca dejar de aprender es importante, más allá del ritmo que se siga ...
sapito169


Desconectado Desconectado

Mensajes: 629



Ver Perfil
Re: Sobre buenas prácticas de programación
« Respuesta #3 en: 15 Marzo 2014, 02:47 am »

Waoo ese estilo de programación es muy parecido a model driven desing (Evans)

Citar
Tengo un método agregarProducto en una clase que gestiona un listado del mismo.
Aquí se tienen las restricciones para los atributos ingresados. Si hubo error, el producto no se agrega al listado y se devuelve una advertencia como String. Si no hubo error, el producto es agregado y se devuelve null.

Es mejor cadenas vacías sobre nulls. Esto es debido a que algún programador despistado se olvide manejar los nulls y provoque que la aplicación muera de sorpresa miserablemente
Citar
Lo malo es que, si el administrador modifica un empleado en la tabla (y le modifica todos sus atributos) yo no tendría como identificar a ese empleado en todo mi ArrayList, ya que la tabla no muestra todos los empleados, sólo los que son resultados de una búsqueda (haciendo imposible que coincida la posición del empleado en la lista con su posición en el ArrayList). Creo que tendré que poner que el código no sea modificable, así tendría cómo ubicarlo siempre.
Definitivamente La segunda opción es mejor




Código
  1. import java.util.ArrayList;
  2. import java.util.List;
  3.  
  4. public class ServicioEmpleado {
  5. private List<Empleado> empleados = new ArrayList<>();
  6.  
  7. public String agregarEmpleado(String apellidos, String nombres, String DNI,
  8. String sueldoCadena, String password, boolean tipoTrabajador) {
  9.  
  10. // Borramos espacios al inicio y al final con trim()
  11. apellidos = apellidos.trim();
  12. nombres = nombres.trim();
  13. DNI = DNI.trim();
  14.  
  15. if (apellidos.isEmpty() || nombres.isEmpty() || DNI.isEmpty()
  16. || password.isEmpty())
  17. return "Se han encontrados datos vacíos o que sólo contienen espacios.";
  18.  
  19. if (password.length() < 6)
  20. return "La contraseña debe tener al menos 6 caracteres.";
  21.  
  22. if (DNI.length() != 8)
  23. return "El DNI debe tener 8 dígitos.";
  24.  
  25. if (buscarPorDNI(DNI) != -1)
  26. return "Ya existe un empleado registrado con este DNI.";
  27.  
  28. Double sueldo;
  29. try {
  30. sueldo = Double.parseDouble(sueldoCadena);
  31. } catch (NumberFormatException e) {
  32. return "El saldo ingresado no se corresponde con un valor numérico.";
  33. }
  34. long id = empleados.size() + 1;
  35. empleados.add(new Empleado(id, apellidos, nombres, DNI, sueldo,
  36. password, tipoTrabajador));
  37. return ""; // Si devuelve null es porque no hubo error.
  38. }
  39.  
  40. private int buscarPorDNI(String dNI) {
  41. return 0;
  42. }
  43.  
  44. public String modificarEmpleado(int posicion, String apellidos,
  45. String nombres, String DNI, String sueldoCadena, String password,
  46. boolean tipoTrabajador) {
  47.  
  48. apellidos = apellidos.trim();
  49. nombres = nombres.trim();
  50. DNI = DNI.trim();
  51.  
  52. if (apellidos.isEmpty() || nombres.isEmpty() || DNI.isEmpty()
  53. || password.isEmpty())
  54. return "Se han encontrados datos vacíos o que sólo contienen espacios.";
  55.  
  56. if (password.length() < 6)
  57. return "La contraseña debe tener al menos 6 caracteres.";
  58.  
  59. if (DNI.length() != 8)
  60. return "El DNI debe tener 8 dígitos.";
  61.  
  62. if (buscarPorDNI(DNI) != -1)
  63. return "Ya existe un empleado registrado con este DNI.";
  64.  
  65. Double sueldo;
  66. try {
  67. sueldo = Double.parseDouble(sueldoCadena);
  68. } catch (NumberFormatException e) {
  69. return "El saldo ingresado no se corresponde con un valor numérico.";
  70. }
  71.  
  72. empleados.set(posicion, new Empleado(posicion, apellidos, nombres, DNI,
  73. sueldo, password, tipoTrabajador));
  74. return ""; // Si devuelve null es porque no hubo error.
  75. }
  76. }
  77.  
  78.  
  79.  
« Última modificación: 17 Marzo 2014, 02:14 am por sapito169 » En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Buenas practicas para mostrar contenido en web
PHP
Hadess_inf 1 2,475 Último mensaje 23 Abril 2012, 15:59 pm
por danicasasm
Buenas prácticas con C++ « 1 2 »
Programación C/C++
eferion 13 12,344 Último mensaje 19 Febrero 2014, 17:24 pm
por xaps
Buenas prácticas para programar en php (Traducción)
PHP
alex171294 0 1,891 Último mensaje 22 Octubre 2014, 23:45 pm
por alex171294
[APORTE] Buenas prácticas y convenciones en Java - Parte uno - Convenciones
Java
3n31ch 8 24,103 Último mensaje 22 Agosto 2015, 21:56 pm
por BlackZeroX
[Pregunta] Buenas Practicas de Programacion en VB.NET
.NET (C#, VB.NET, ASP)
OscarCadenas_91 5 8,978 Último mensaje 28 Julio 2015, 20:07 pm
por Eleкtro
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines