sábado, 26 de abril de 2014

Aprender Scala ... o no hacerlo

¿Qué tiene Scala que no tenga Java?


1. Clases, setters y getters

En Java:

public class Javesco{
     private String nombre="";

     public Javesco(){}

     public Javesco(String nombre){
           this.nombre=nombre;
     }
 
   //setter y getter
    public void setNombre(){ this.nombre=nombre; }
    public String getNombre(){ return nombre; }


En Scala:

class Simple(){
   var nombre:String=""
}

Obviamente escribimos menos código, sin embargo esto también puede parecernos confuso (al menos al principio),¿donde queda el private, protected o el public?. La razón es que Scala es un lenguaje más flexible, nos permite hacer muchas cosas, cambiar la manera en que planteas las soluciones.



Creando una clase "compleja":

class Compleja(val  _nombrex:String=null){

    private var  _nombre:String=_nombrex

   //setter y getter
   def nombre=_nombre
   def nombre_=(value:String):Unit=_nombre=value

}


Este código es más parecido a la clase hecha en Java.En esta definimos los setters y getters. Aunque la de arriba es más legible y sencilla de entender(Simple).


Ahora creamos un archivo llamado Codemonkey.scala y escribimos: 


object Codemonkey{

    def main(args: Array[String]): Unit = {

          val simple=new Simple
          simple.nombre="Scala Johansson"
         Console.println("Hola "+simple.nombre)
  
        val compleja=new Compleja("Jonh Worth")
        Console.println("Hola "+compleja.nombre)

    simple.nombre="Maria Java"
    compleja.nombre="Tom Groovy"

    Console.println("Hola "+simple.nombre)
    Console.println("Hola "+compleja.nombre)

    }

}

Sigue siendo un código legible, no cambia mucho. Scala nos permite hacer las cosas de diferentes maneras.

2. Los import

En Java es necesario definir las clases y/o librerías externas desde la cabecera del código. 

import javax.swing.JOptionPane;

public class Codemonkey{

       public static void main(String ... args){
           JOptionPane.showMessageDialog(null,"Hola desde codemonkey");
       }

}

Con Scala no es necesario, podemos definir los import desde cualquier parte del código.

object Codemonkey{
       def main(args: Array[String]): Unit = {
           import javax.swing.JOptionPane
           JOptionPane.showMessageDialog(null,"Hola desde codemonkey")
      }
  }

3. Conservar los proyectos ya hechos.

Scala al ser dependiende de la JVM permite interoperabilidad con proyectos Java.


Creamos una clase Java llamada Prueba.java y la compilamos, nos generará un *.class

public class Prueba{

   public void verMensaje(){
      System.out.println("Hola Scala soy un método creado desde una clase Java");
   }

}

Ahora creamos el código en Scala, instanciamos la clase Prueba

object Codemonkey{
  def main(args: Array[String]): Unit = {
    val prueba=new Prueba
    prueba.verMensaje
  }

}
Java sigue siendo un buen lenguaje y bastante usado, aunque la verdad al crecer tanto la complejidad para aprenderlo también lo hizo. 

¿Qué más tiene Scala?

Concurrencia, pattern matching,traits, etc.  Un mundo de posiblidades se presenta, tal vez en próximos post ponga más ejemplos.

Por lo pronto no sé si convenga aprender Scala (algunos les parecerá perdida de tiempo, a otros no tanto), pero vaya que si es interesante.

jueves, 17 de abril de 2014

Programando en C# no. 2 (Visual C#)

1. En esta ocasión vamos a ver como introducir y mostrar datos desde una ventana.

Creamos un proyecto en Microsoft Visual C#. Colocamos dos botones: Activar y Quitar.
Dentro del botón Quitar colocamos:
Environment.Exit(0);

Dentro del botón Activar:
string nombre = Microsoft.VisualBasic.Interaction.InputBox("Introduce tu nombre:");
string edad = Microsoft.VisualBasic.Interaction.InputBox("Introduce tu edad:");
MessageBox.Show("Hola " + nombre.ToUpper() +", tienes "+edad +" de edad");

Resultado:




Nota: Para hacer uso del componente InputBox, se requiere agregar la referencia. Dentro del explorador de soluciones da clic derecho sobre References, busca (en la pestaña de .Net) Microsoft Visual Basic y acepta.

2. En este vamos a pasar datos de un formulario a otro. 
  • Creamos otro formulario.
  • Colocamos 5 labels
  • Creamos una clase 



Colocamos el siguiente código en el primer form:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {

        public Form2 form2 = new Form2();
        public Caja caja = new Caja(0,0);
       
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }

        private void button1_Click(object sender, EventArgs e)
        {
          
            try {
               
                int alto = int.Parse(Microsoft.VisualBasic.Interaction.InputBox("Alto:"));
                int ancho = int.Parse(Microsoft.VisualBasic.Interaction.InputBox("Ancho:"));
                caja.Alto = alto;
                caja.Ancho = ancho;


                form2.mensaje = "Esto lo envio el form1";
                form2.miCaja.Alto = caja.Alto;
                form2.miCaja.Ancho = caja.Ancho;
                form2.Show();
               
            }
            catch (Exception ex) {
                MessageBox.Show("error: "+ex.Message);
            }
        }

        private void button2_Click(object sender, EventArgs e)
        {
            Environment.Exit(0);
        }
    }
}

Y el siguiente en el segundo form:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form2 : Form
    {
        public string mensaje;
        public Caja miCaja = new Caja();


        public Form2()
        {
            InitializeComponent();
        }

        private void Form2_Load(object sender, EventArgs e)
        {
           
            label1.Text = mensaje;
            label4.Text=miCaja.Ancho.ToString();
            label5.Text=miCaja.Alto.ToString();
        }

}
}

Código de la clase Caja.cs:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace WindowsFormsApplication1
{
    public class Caja
    {
        private int ancho;
        private int alto;

        public Caja() { }

        public Caja(int ancho,int alto) {
            this.ancho = ancho;
            this.alto = alto;
        }

        public int Ancho{
            get { return this.ancho; }
            set { this.ancho = value; }
        }

        public int Alto{
            get { return this.alto; }
            set { this.alto = value; }
        }
    }
}

En los setters y getters también puede ser así:

public int Ancho{
            get ;
            set ;
 }
public int Alto{
            get;
            set;
  }

Resultado:

lunes, 14 de abril de 2014

Programando en Ceylon no. 2

¿Por qué aprender Ceylon?
 No hay demanda de programadores que sepan ese lenguaje, nadie lo usa. Lo mismo dijeron de Java , de C#, etc. en su momento, sin embargo, paso el tiempo y las empresas cambiaron de opinión y solicitaban personal que tuviera conocimientos en estos lenguajes.

Los que sabían C aprendieron Java, los que odiaban Java aprendieron C#, etc.

Parece que todo depende de la necesidad,no del gusto del programador, en mi opinión nunca me gustó VB, pero en la escuela se decía que si querías trabajar como programador debías aprenderlo. Otros más decían que C era el único lenguaje a usar (curiosamente Javascript nunca lo tomaban en cuenta ahora es el más usado), para qué aprender otro lenguaje.  

HTML5 supuestamente se usaría a finales de 2016 incluso se decía que no iba funcionar.

Cierto,nadie va dejar sus proyectos por un nuevo lenguaje, pero si existe una alternativa para hacer el trabajo más sencillo (sin dejar el trabajo ya hecho)  seguro la tomaran en cuenta.

Algún día tendremos que voltear a ver otros lenguajes como Scala, Groovy y/o Ceylon aunque sea por pura necesidad.



En este ejemplo vamos hacer un menú, con tres opciones:
  • Ver nombre y versión del sistema operativo
  • Calcular número de pulsaciones de una persona y
  • Salir del programa
//este es el método principal del programa
void run(){
  print("Version de Ceylon[ ``language.version`` ]\n");
  String menu="\t[Menu]\n1. Ver nombre y version del sistema operativo\n2. Calcular no.de pulsaciones de una persona\n3. Salir\nElije opcion:";

  while(true){
   print(menu);
   String opc=process.readLine();

   switch(opc)
   case ("1"){
     print("Nombre y version del SO");
     infoSistema();
   }
   case ("2"){
     print("No. de pulsaciones");
     print("Introduce edad:");
     String edadStr=process.readLine();
     Integer? _edad=parseInteger(edadStr);
     if(exists _edad){
       Integer edad=_edad;
       print("no. pulsaciones: ``pulsaciones(edad)``  ");
     }

   }
   case ("3"){
     print("Salida");
     process.exit(0);
   }
   else {
    print("Opcion no valida");
   }
  }//fin for
}

shared Float pulsaciones(Integer edad){
  return (220-edad)/15.0;
}

shared void infoSistema(){
  print("sistema:  ``operatingSystem.name`` ");
  print("version del sistema:  ``operatingSystem.version`` ");
}


Aquí el resultado: