Separación de la lógica de negocio de la lógica de la Interfaz de Usuario

¡¡¡ ATENCIÓN QUE ESTE ES UN CONCEPTO MUY IMPORTANTE!!!

Cuando se hace cualquier programa con una Interfaz de Usuario, ya sea gráfica, ya sea una web, ya sea un applet se tiende muy facilmente a mezclar las operaciones de manipulación de la información (Lógica de negocio) con la presentación visual de esa información(Lógica de IU).

Esto es especialmente fácil que ocurra en el entorno web donde se tiende a mezclarlo todo. Y es un gran error. Si no se separan la lógica de negocio (donde tu procesas tus datos) con la lógica de presentación (la ventana, la web, etc donde presentas la información) el código resultante es UNA MIERDA PINCHADA EN UN PALO. Es un error que se suele cometer al empezar a programar y cuando todavía no se tiene mucha experiencia.

  • El código está todo mezclado y es dificil identificar que hace cada cosa
  • Es dificil de comprender por lo que si has hecho un programita pequeñito para jugar no pasa nada. Pero en cuanto hagas algún programa minimamente grande. No sabras por donde cogerlo.
  • Es dificilisimo corregir errores
  • Es facilísimo duplicar código ¿A ti te gusta hacer la misma función dos veces?
  • No te digo nada si intentas leer ese código al cavo de un año. (a mi me da vergüenza enseñar el código que hacía yo mismo al principio)
  • La rehostia es cuando tienes que leer el código de otro. Es como una tortura. No se lo recomiendo a nadie.

Por eso es muy bueno acostumbrarse a:

  • Las cosas hacen UNA sola cosa
  • Aunque parezca evidente de que es lo que hace una clase / función / método. Es muy aconsejable poner comentario.
  • Separar la parte visual de la parte ”mecánica
  • Cuanto más elegante sea el código más fácil será de leer y entender.
  • El código es reutilizable.
  • El código es fácil de entender, modificar y mantener.

Por último:

  • Estos consejos son inútiles porque tu mismo, con tu propia experiencia llegarás exactamente a la misma conclusión. Cuando hayas tenido que coger el código de otro para hacer alguna modificación. O hayas tendido que entender lo que tu mismo escribiste hace un año adoptarás esta misma postura.

Y una vez dado el sermón un ejemplito:

// Separacion.java
// 2 clases para separar la lógica de negocio de la de presentación
import javax.swing.*;
import java.awt.*;
import javax.swing.event.*;
import java.awt.event.*;
import java.applet.*;
import net.juantxu.swing.*;

// clase  de lógica de negocio
class LogicaNegocio{
	private int modificador;
	public LogicaNegocio(int mod){
		modificador = mod;
	}
	public void establecerModificador(int mod){
		modificador = mod;
	}
	public int obtenerModificador(){
		return this.modificador;
	}
	// algunas operaciones (lógica de negocio)
	public int calculo1(int i){
		return i*this.modificador;
	}
	public int calculo2(int i){
		return i+this.modificador;
	}
}

// y ahora la interfaz
public class Separacion extends JApplet{
	JTextField 
		t = new JTextField(15),
		mod = new JTextField(15);
	LogicaNegocio ln = new LogicaNegocio(2);
	JButton 
		calc1 = new JButton("calculo 1"),
		calc2 = new JButton("calculo 2");
	
	static int obtenerValor(JTextField tf){
		try{
			return Integer.parseInt( tf.getText() );
		}catch(NumberFormatException e){
			return 0;
		}
	}
	class Calc1Oyente implements ActionListener{
		public void actionPerformed(ActionEvent e){
			t.setText(Integer.toString(ln.calculo1( obtenerValor(t) ) ) );
		}
	}
	class Calc2Oyente implements ActionListener{
		public void actionPerformed(ActionEvent e){
			t.setText(Integer.toString(ln.calculo2( obtenerValor(t) ) ) );
		}
	}
	class ModL implements DocumentListener{
		public void changedUpdate(DocumentEvent e){}
		public void insertUpdate(DocumentEvent e){
			ln.establecerModificador(obtenerValor(mod));
		}
		public void removeUpdate(DocumentEvent e){
			ln.establecerModificador(obtenerValor(mod) );
		}
	}
	public void init(){
		Container cp = getContentPane();
		cp.setLayout(new FlowLayout() );
		cp.add(t);
		calc1.addActionListener(new Calc1Oyente() );
		calc1.setToolTipText("Texto Explicativo");
		calc2.addActionListener(new Calc2Oyente() );
		calc2.setToolTipText("Esto hará el calculo 2");
		JPanel p1 = new JPanel();
		p1.add(calc1);
		p1.add(calc2);
		cp.add(p1);
		mod.getDocument().addDocumentListener(new ModL() );
		JPanel p2 = new JPanel();
		p2.add(new JLabel("Modificador : ") );
		p2.add(mod);
		cp.add(p2);

	}
	public static void main(String[] args){
		Console.run(new Separacion(), 200, 280);
	}
}

y aqui tienes como queda

 
java/31.txt · Última modificación: 2008/05/13 10:00 (editor externo)
 
Excepto donde se indique lo contrario, el contenido de esta wiki se autoriza bajo la siguiente licencia:CC Attribution-Noncommercial-Share Alike 3.0 Unported
Recent changes RSS feed Donate Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki