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

 

 


Tema destacado: Security Series.XSS. [Cross Site Scripting]


  Mostrar Mensajes
Páginas: 1 2 3 4 5 6 7 [8] 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 ... 63
71  Programación / Java / Re: Sobre buenas prácticas de programación 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.  
72  Programación / Java / Re: No se reproduce archivo .wav: javax.sound.sampled.UnsupportedAudioFileException en: 23 Noviembre 2013, 22:20 pm
recuerda que en linux la dirección comienza con barra

/carpetita/subcarpetita/archivo.wab

pon toda la ruta completa desde el inicio sin que sea relativa
73  Programación / Java / Re: No se reproduce archivo .wav: javax.sound.sampled.UnsupportedAudioFileException en: 23 Noviembre 2013, 18:08 pm
de casualidad cometiste el error de usar linux?

trata con la dirección   completa del archivo incluyendo la extension
74  Programación / Java / Re: Trabajar en un proyecto desde dos ordenadores con eclipse en: 23 Noviembre 2013, 03:30 am
xd

para proyectos pequeños funciona de maravilla dropbox

xd xd

75  Programación / Java / Re: [JavaFX] VirusTotal Analyzer en: 11 Noviembre 2013, 19:02 pm
Muchas gracias M1t$u por utilizar nuestra API del VirusTotal,
Soy Mauricio, el desarollador de la API utilizada en su aplicación.
Estoy entrando en el foro para sacar cualquier duda sobre la API.

Muchas gracias.

genial, genial, genial

mi pregunta es muy muy principiante pero estoy seguro que muchos quieren saberla

mira como aprendiste para hacer el api , lo que quiero decir es que libros ,tutoriales ,videotutoriales, revista ,blogs vista para aprender eso
76  Programación / Java / Re: Patrom mvp en: 7 Noviembre 2013, 03:38 am
 ;D

jajajaja

no es tu idea es la idea de todos los que han intentado averiguar de estos temas llegan a la misma conclusión.

Todos los autores escriben ha cerca de lo que es mvp mvc todos lo definen de manera distinta xd todo lo programan de manera distinta y al final nadie sabe cual es la verdadera respuesta

Yo pienso que no hay respuesta correcta que ya se fregó y todos lo definirán de manera diferente xd . Mira yo defino el patrón mvp de esa manera por que es asi como nos ilustra martin fowler en sus papers.
77  Programación / Java / Patrom mvp en: 7 Noviembre 2013, 02:25 am
Patron mvp

Pobre tu que esta buscando en la página 10 de google tratando de buscar algún código ejemplo de como se usar el patrón mvp y solo encuentras las pagina de Martin Fowler que te parece demasiado complicada para que la entiendas (si la llegas a leer por que esta en ingles)
Te dedico estas palabras aburridas y académicas que por compromiso y por presunción innecesaria escribo para malograrte la vida y mostrar que se mucho mas que tu y que puede escribir mucho sin decir nada que valga la pena.
Si ya sé que solo quieres ver código que no te gusta leer así que te recomiendo que te saltes a la parte práctica donde se muestra el código y los diagramas de clases

Limitaciones del proyecto
Este proyecto no es por ningún motivo amplio ni toma en consideración todos los puntos que deben ser tomados en cuenta para desarrollar una aplicación digna de un profesional. Se pasaron por alto varios temas como el manejo de errores e hilos. Tampoco voy a decir que soy un experto en el patrón ni que lo he usado en varios proyectos así que no puedo dar consejos de como funciona el patrón en aplicaciones grandes ni los posibles errores que presente en ellos.

Que es el patrón mvp
El patrón de diseño mvp es un patrón para el desarrollo de interface de usuario que se caracteriza por trabajar con una clase y dos interfaces. La primera clase es llamada presentador que actúa como intermediario entre la vista (como interface) y el modelo (como interface).
Poniendo en palabras que cualquier programador entienda, El presentador es una clase concreta  y por el constructor le pasamos la vista y el modelo en forma de interfaces.
La comunicación entre la vista y el presentador se desarrolla mediante el uso del patrón observador. La comunicación entre el modelo y el presentador es también por el patrón observador pero es poco usual. Tranquilo vamos ha desarrollar un ejemplo practico para que los conceptos queden claro XD somos programadores y nos gusta el código


Deja de trabajar sin pensar lo que haces y toma en cuenta que cualquier patrón que uses tiene sus desventajas y que debes escoger siempre el que mas se amolde a tus necesidades nada es perfecto “no existen las balas de plata”

Que desventajas y limitaciones tiene
•   Requiere una gran cantidad de código que no vale la pena hacer en proyectos fáciles y simples
•   Requiere una inmensa cantidad de código para conectar los presentadores con sus vistas y sus modelos Requiere que crees interfaces para que puedas usar el patrón observador por cada acción (como presionar un botón)
•   Requiere que pienses en la vista en forma abstracta lo cual es difícil para los formularios muy grandes

Cuales son sus ventajas
•   La vista puede ser fácilmente cambiada
•   La vista puede ser trabajada incluso por una persona diferente
•   La vista y el modelo pueden cambiar y ser muy diferentes sin que eso afecte demasiado el sistema.
 La verdad es que todo cambio en el modelo siempre obliga cambios en la vista y lo único que se logra con estar menos “desacoplado” es que sea mas fácil hacer cambio pero siempre va haber cambios. La única forma de cambiar el modelo sin malograr la vista es mediante el uso de frameworks que autogeneren la vista mediante reflexión

Cuando usarlo
Recomiendo que uses el patrón para migrar un sistema de escritorio legacy (prácticamente todos están en estado legacy no se hagan los locos) en el cual la vista allá pasado de moda y los usuario quiera algo mas sexy, mas cool, mas “empresarial”. Me refiero a que se puede hacer poco a poco refactoring y cambiar a pedazos la vista  
Recomiendo también usarlo cuando se quiera hacer aplicaciones de escritorio en las cuales se quiera mantener varias vistas en simultaneo (swing , javafx, awt)

Cuales son sus variantes
•   No usar interface para el modelo
•   Ni tampoco tener un modelo para formularios simples
•   Considerar alas clases Servicio como modelo

Diagrama de clases del patrón
 


Aplicación practica
Vamos a mostrar un simple mantenimiento de personal usando swing y el patrón mvp
Diagrama de clases

En este caso decido no crear una interface para el modelo por que no le vi el sentido
 

Interface grafica


 
Fragmentos de código

Código
  1. public class PresentadorMantenimientoPersonal {
  2.  
  3. private final PanMantenimientoPersonal panMantenimientoPersonal;
  4. private final ServicioPersonal servicioPersonas;
  5.  
  6. public PresentadorMantenimientoPersonal(
  7. PanMantenimientoPersonal panMantenimientoPersonalM,
  8. ServicioPersonal servicioPersonas) {
  9. this.panMantenimientoPersonal = panMantenimientoPersonalM;
  10. this.servicioPersonas = servicioPersonas;
  11. }
  12.  
  13. public void run() {
  14.  
  15. panMantenimientoPersonal.addAgregoListener(new AgregoListener() {
  16. @Override
  17. public void fueAgregado() {
  18. agrego();
  19. }
  20. });
  21. panMantenimientoPersonal.addModificoListener(new ModificoListener() {
  22. @Override
  23. public void fueModificado() {
  24. modificado();
  25. }
  26. });
  27. panMantenimientoPersonal.addEliminadoListener(new EliminadoListener() {
  28. @Override
  29. public void fueEliminado() {
  30. eliminado();
  31. }
  32. });
  33. }
  34.  
  35. private void eliminado() {
  36. Personal leeido = panMantenimientoPersonal.leerPersonal();
  37. servicioPersonas.eliminar(leeido.getCodigo());
  38. panMantenimientoPersonal.mostrar(servicioPersonas.lista());
  39.  
  40. }
  41.  
  42. private void modificado() {
  43. Personal leeido = panMantenimientoPersonal.leerPersonal();
  44. servicioPersonas.modifica(leeido);
  45. panMantenimientoPersonal.mostrar(servicioPersonas.lista());
  46.  
  47. }
  48.  
  49. private void agrego() {
  50. Personal leeido = panMantenimientoPersonal.leerPersonal();
  51. servicioPersonas.agregar(leeido);
  52. panMantenimientoPersonal.mostrar(servicioPersonas.lista());
  53. }
  54.  
  55. }
  56.  

Código
  1. import java.util.List;
  2.  
  3.  
  4. public interface PanMantenimientoPersonal {
  5.  
  6. void addAgregoListener(AgregoListener agregoListener);
  7.  
  8. void addModificoListener(ModificoListener modificoListener);
  9.  
  10. void addEliminadoListener(EliminadoListener eliminadoListener);
  11.  
  12. Personal leerPersonal();
  13.  
  14. void mostrar(List<Personal> lista);
  15.  
  16. }
  17.  

Código
  1. import java.awt.Container;
  2.  
  3. public class PanMantenimientoPersonalSwing extends JPanel implements
  4. PanMantenimientoPersonal {
  5. public PanMantenimientoPersonalSwing() {
  6. setLayout(null);
  7.  
  8. JLabel lblNombre = new JLabel("codigo");
  9. lblNombre.setBounds(10, 11, 56, 14);
  10. add(lblNombre);
  11.  
  12. txtCodigo = new JTextField();
  13. txtCodigo.setBounds(73, 8, 86, 20);
  14. add(txtCodigo);
  15. txtCodigo.setColumns(10);
  16.  
  17. JLabel label = new JLabel("Nombre");
  18. label.setBounds(10, 39, 56, 14);
  19. add(label);
  20.  
  21. txtNombre = new JTextField();
  22. txtNombre.setColumns(10);
  23. txtNombre.setBounds(73, 36, 86, 20);
  24. add(txtNombre);
  25.  
  26. JLabel lblApellido = new JLabel("Apellido");
  27. lblApellido.setBounds(10, 67, 56, 14);
  28. add(lblApellido);
  29.  
  30. txtApellido = new JTextField();
  31. txtApellido.setColumns(10);
  32. txtApellido.setBounds(73, 64, 86, 20);
  33. add(txtApellido);
  34.  
  35. JLabel lblEdad = new JLabel("Edad");
  36. lblEdad.setBounds(10, 95, 56, 14);
  37. add(lblEdad);
  38.  
  39. txtEdad = new JTextField();
  40. txtEdad.setColumns(10);
  41. txtEdad.setBounds(73, 92, 86, 20);
  42. add(txtEdad);
  43.  
  44. JScrollPane scrollPane = new JScrollPane();
  45. scrollPane.setBounds(10, 148, 419, 142);
  46. add(scrollPane);
  47.  
  48. table = new JTable();
  49. table.setModel(new DefaultTableModel(new Object[][] {}, new String[] {
  50. "codigo", "nombre", "apellido", "edad", "sueldo" }));
  51. scrollPane.setViewportView(table);
  52.  
  53. JLabel lblSueldo = new JLabel("sueldo");
  54. lblSueldo.setBounds(10, 123, 56, 14);
  55. add(lblSueldo);
  56.  
  57. txtSueldo = new JTextField();
  58. txtSueldo.setColumns(10);
  59. txtSueldo.setBounds(73, 120, 86, 20);
  60. add(txtSueldo);
  61.  
  62. JButton btnAgrega = new JButton("agrega");
  63. btnAgrega.addActionListener(new ActionListener() {
  64. public void actionPerformed(ActionEvent e) {
  65. for (AgregoListener agregoListener : listaAgregoListener) {
  66. agregoListener.fueAgregado();
  67. }
  68. }
  69. });
  70. btnAgrega.setBounds(175, 7, 89, 23);
  71. add(btnAgrega);
  72.  
  73. JButton btnModifica = new JButton("modifica");
  74. btnModifica.addActionListener(new ActionListener() {
  75. public void actionPerformed(ActionEvent e) {
  76. for (ModificoListener modificoListener : listaModificoListener) {
  77. modificoListener.fueModificado();
  78. }
  79. }
  80. });
  81. btnModifica.setBounds(175, 35, 89, 23);
  82. add(btnModifica);
  83.  
  84. JButton btnElimina = new JButton("elimina");
  85. btnElimina.addActionListener(new ActionListener() {
  86. public void actionPerformed(ActionEvent e) {
  87. for (EliminadoListener eliminadoListener : listaEliminadoListener) {
  88. eliminadoListener.fueEliminado();
  89. }
  90. }
  91. });
  92. btnElimina.setBounds(175, 63, 89, 23);
  93. add(btnElimina);
  94. }
  95.  
  96. private List<AgregoListener> listaAgregoListener = new ArrayList<>();
  97. private List<ModificoListener> listaModificoListener = new ArrayList<>();
  98. private List<EliminadoListener> listaEliminadoListener = new ArrayList<>();
  99. private JTextField txtCodigo;
  100. private JTextField txtNombre;
  101. private JTextField txtApellido;
  102. private JTextField txtEdad;
  103. private JTable table;
  104. private JTextField txtSueldo;
  105.  
  106. @Override
  107. public void addAgregoListener(AgregoListener agregoListener) {
  108. listaAgregoListener.add(agregoListener);
  109. }
  110.  
  111. @Override
  112. public void addModificoListener(ModificoListener modificoListener) {
  113. listaModificoListener.add(modificoListener);
  114. }
  115.  
  116. @Override
  117. public void addEliminadoListener(EliminadoListener eliminadoListener) {
  118. listaEliminadoListener.add(eliminadoListener);
  119. }
  120.  
  121. @Override
  122. public Personal leerPersonal() {
  123. int codigo = Integer.parseInt(txtCodigo.getText());
  124. String nombre = txtNombre.getText();
  125. String apellido = txtApellido.getText();
  126. double sueldo = Double.parseDouble(txtSueldo.getText());
  127. int edad = Integer.parseInt(txtEdad.getText());
  128. return new Personal(codigo, nombre, apellido, sueldo, edad);
  129. }
  130.  
  131. @Override
  132. public void mostrar(List<Personal> lista) {
  133. DefaultTableModel model = (DefaultTableModel) table.getModel();
  134. model.setRowCount(0);
  135. for (Personal personal : lista)
  136. model.addRow(aFila(personal));
  137.  
  138. }
  139.  
  140. private Vector<Object> aFila(Personal personal) {
  141. Vector<Object> result = new Vector<>();
  142. result.add(personal.getCodigo());
  143. result.add(personal.getNombre());
  144. result.add(personal.getApellido());
  145. result.add(personal.getSueldo());
  146. result.add(personal.getEdad());
  147.  
  148. return result;
  149. }
  150. }
  151.  


Código
  1.  
  2. import java.awt.BorderLayout;
  3.  
  4. import javax.swing.JFrame;
  5.  
  6. public class Main {
  7. public static void main(String[] args) {
  8. PanMantenimientoPersonalSwing panMantenimientoPersonal = new PanMantenimientoPersonalSwing();
  9. new PresentadorMantenimientoPersonal(panMantenimientoPersonal//
  10. , new ServicioPersonal())//
  11. .run();
  12.  
  13. JFrame jFrame = new JFrame();
  14. jFrame.setSize(500, 400);
  15. jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  16. jFrame.setLocationRelativeTo(null);
  17. jFrame.setLayout(new BorderLayout());
  18. jFrame.getContentPane().add(panMantenimientoPersonal,
  19. BorderLayout.CENTER);
  20. jFrame.setVisible(true);
  21. }
  22. }
  23.  

Aprendizaje y evolución
En el desarrollo se puede apreciar que el manejo de eventos no puede ser mas simple son solamente varios ArrayList que guardan varios eventos
Supongamos por ejemplo que un día el jefecito se le ocurrió que la vista esta fea y que le gustaría cambiar a javafx bueno pues simplemente cambiaríamos el main de esta manera

Código
  1. PanMantenimientoPersonalJfx panMantenimientoPersonal = new PanMantenimientoPersonalJfx ();
  2. new PresentadorMantenimientoPersonal(panMantenimientoPersonal//
  3. , new ServicioPersonal())//
  4. .run();
  5. mostrarEnVentana(panMantenimientoPersonal) ;

Solo crearíamos la vista imprentaríamos los métodos de la interface PanMantenimientoPersonal pero todo el resto de la aplicación no tendría que cambiar
Para los haraganes como descargar y usar el código

Por favor necesito que me ataquen
Traumas, críticas (destructivas), trolleos, venganzas, asuntos personales, propuestas indecentes, amenazas y tal vez preguntas son bienvenidas
78  Programación / Java / Re: Problema al modificar archivos ".class" de un ".jar" en: 7 Julio 2013, 04:57 am
-con java -version averiguas cual es la versión de java
-muestra todos los errores que tienes
-pon un captura de pantalla con los errores que tienes
79  Programación / Java / Re: Libros pero no sobre programaciòn en: 3 Julio 2013, 02:33 am
porfavor responde aunque sea para insultar no seras el primero ni el ultimo pero no me ignores
80  Programación / Java / Re: Libros pero no sobre programaciòn en: 2 Julio 2013, 21:08 pm
recomiendo "ingenieria de software un enfoque practico" , "the mythical man month"

Es inevitable hacer muchas suposiciones debido al contexto y tu estas preguntando en un foro de programación en java y es lógico que te respondan de esa manera

“En las empresas donde de verdad pagan bien y te piden que sepas programar”

Estoy totalmente de acuerdo es un hecho innegable que te vas a tener más dinero si no te dedicas a programar

“eso lo puede hacer cualquiera”

No definitivamente y categóricamente no. No es que uno sea mejor o peor que otro solo son diferentes habilidades.
Ciertamente lo común es un grupo de incompetentes (detestablemente grande) (no te estoy insultando) que piensan así, pero eso no aplica para todos los casos. Ese grupo de gente (los incompetentes) intentara hacer lo menos posible por su profesión y estar al límite solo tratando de saber lo absolutamente necesario para que no lo despidan o para cumplir lo mínimamente necesario para hacer mediocremente su trabajo.
Siempre va a ver un grupo reducido que le interese hacer lo mejor posible su trabajo y sentirse orgulloso por lo que hace, ellos van a intentar lo más posible mejorar sus habilidades y competencias.  Ese grupo de gente dedicada y juiciosa tiene todo el derecho de rechazar su postura de “eso lo hace cualquiera” y decir sinceramente que eso no aplica para ellos porque jamás pensaron y actuaron de esa manera
Es mas es hasta ofensivo e incorrecto decir eso para todo el grupo de programadores

“como resolverías problemas que las soluciones fáciles son muy costosas, pero las mejores son muy difíciles”

Totalmente de acuerdo

Parece que lo que quieres no tiene nada que ver muy poco con la programación
Parece que lo que quieres es ser un gerente o un líder de proyecto o algo así (lo cual es una opción muy respetable)
Mira hay varios puntos

Los libros que deberías leer son de sicología gerencia liderazgo etc.

Nadie te va a dar es tipo de trabajo sin que antes hayas pasado primero por ensuciarte las manos tal vez si eres un súper genio y lo demuestres lo logres pero es muy improbable

Y aquí el punto más odioso y radical y ofensivo (lo siento soy un troll).

Si no tienes conocimiento técnico no tienes derecho a opinar sobre los detalles no puedes hablar de “los cómos”. Los detalles técnicos son “los cómos”  y solo una persona que sabe y se ha dedicado diligentemente a mejorar sus conocimientos y habilidades debe tomar esas decisiones. Los gerentes deben decidir solo en lo que mejor saben para lo que son buenos para poner políticas y para tratar con la gente (zapatero a su zapato) pero esa habilidad no implica necesariamente saber por qué funcionan las cosas al mínimo detalle de forma técnica.

Me haces recordar un video “How To Design A Good API and Why it Matters” en el comentaba que jamás se debe poner a un grupo detrás a puertas cerradas para luego crear un documento de 1000 hojas para luego ponerlo en práctica; esto se debe a que mucho ego se verá involucrado y vana a construirlo incluso si es mi**da
Páginas: 1 2 3 4 5 6 7 [8] 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 ... 63
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines