on domingo, 16 de diciembre de 2012

Que tal, buen día,  el día de hoy graficaremos un tablero de ajedrez en WPF.

1.- Crear un proyecto en WPF.


WPFChessProject - Microsoft Visual Studio (Administrador)_2012-12-08_18-24-01


2.- Crear un control de usuario para un tablero de ajedrez.


WPFChessProject - Microsoft Visual Studio (Administrador)_2012-12-08_18-18-59

Aquí les pongo el código en XAML.


<UserControl x:Class="WPFChessProject.ChessBoard"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
             mc:Ignorable="d"
             d:DesignHeight="800" d:DesignWidth="800">
    <Grid x:Name="grdPrincipal">
        <StackPanel x:Name="stkBoard">
           
        </StackPanel>
    </Grid>
</UserControl>


Ahora construiremos nuestro tablero.

Primero que nada, lo que necesitamos es definir el color de las piezas blancas y de las piezas negras, por lo que necesitamos dos propiedades de tipo color.

public Color colorOfWhitePiece { get; set; }

public Color ColorOfBlackPiece { get; set; }

También es necesario tener el conjunto de casillas agrupadas.
public List<StackPanel> Boxs { get; set; }

Aquí las agrupamos en una lista de StackPanels que nos permitirán mostrar cualquier objeto derivado de la clase UIElement, esto con el fin de que si el proyecto crece se podrán crear controles como piezas de ajedrez para simular una partida de ajedrez.
El control StackPanel es un contenedor que nos permite tener una serie de controles derivados con el fin de hacer uso de los mismos.

En los controles de WPF, en los contenedores se cuenta con la propiedad Childrens, que es una lista de UIElement que son los objetos que se graficaran en nuestra pantalla.

Una vez que tenemos declaradas nuestras propiedades, es necesario crear e implementar un método que nos permita renderear nuestro tablero de ajedrez.


        public void RenderBoard()
        {
            StackPanel box;
            bool isWhite = true;

            for (int i = 0; i < 8; i++)
            {
                StackPanel rowBoxes = new StackPanel();
                rowBoxes.Orientation = Orientation.Horizontal;

                for (int j = 0; j < 8; j++)
                {
                    box = new StackPanel();
                    box.Width = this.Width / 8;
                    box.Height = this.Height / 8;

                    if (isWhite)
                    {
                        box.Background = new SolidColorBrush(ColorOfWhitePiece);
                        isWhite = false;
                    }
                    else
                    {
                        box.Background = new SolidColorBrush(ColorOfBlackPiece);
                        isWhite = true;
                    }

                    rowBoxes.Children.Add(box);

                    Boxs.Add(box);
                }

                if (isWhite)
                    isWhite = false;
                else
                    isWhite = true;

                this.stkBoard.Children.Add(rowBoxes);
            }
        }

En el método RenderBoard creamos dos variables locales, una variable representa una casilla de nuestro tablero de ajedrez y otra variable booleana   que nos permite saber si la casilla es color blanco o negro según el ajedrez.

StackPanel box;

bool isWhite = true;

También tenemos dos ciclos for que nos permiten recorrer el tablero de ajedrez
            for (int i = 0; i < 8; i++)
            {
                StackPanel rowBoxes = new StackPanel();
                rowBoxes.Orientation = Orientation.Horizontal;

                for (int j = 0; j < 8; j++)
                {
                    box = new StackPanel();
                    box.Width = this.Width / 8;
                    box.Height = this.Height / 8;


Las dos primeras lineas representan una fila de un tablero de ajedrez con ocho columnas

StackPanel rowBoxes = new StackPanel();
rowBoxes.Orientation = Orientation.Horizontal;


en las primeras líneas del segundo for tenemos la instancia de una casilla de ajedrez y la asignación de ancho y alto.


                    box = new StackPanel();
                    box.Width = this.Width / 8;
                    box.Height = this.Height / 8;

la condicional nos indica cuando tenemos que graficar una casilla blanca o negra


                                   if (isWhite)
                    {
                        box.Background = new SolidColorBrush(ColorOfWhitePiece);
                        isWhite = false;
                    }
                    else
                    {
                        box.Background = new SolidColorBrush(ColorOfBlackPiece);
                        isWhite = true;
                    }


        


Terminando el for de las columnas, lo que necesitamos es cambiar el color de nuestra bandera booleana que nos indica de qué color es la casilla.

Después de esto, solo basta agregar la fila de casillas a nuestra stack panel stkBoard


  if (isWhite)
                    isWhite = false;
                else
                    isWhite = true;

                this.stkBoard.Children.Add(rowBoxes);

aquí les dejo todo el codigo fuente del user control.







 using System;  
 using System.Collections.Generic;  
 using System.Linq;  
 using System.Text;  
 using System.Windows;  
 using System.Windows.Controls;  
 using System.Windows.Data;  
 using System.Windows.Documents;  
 using System.Windows.Input;  
 using System.Windows.Media;  
 using System.Windows.Media.Imaging;  
 using System.Windows.Navigation;  
 using System.Windows.Shapes;  
 namespace WPFChessProject  
 {  
   /// <summary>  
   /// Lógica de interacción para ChessBoard.xaml  
   /// </summary>  
   public partial class ChessBoard : UserControl  
   {  
     public List<StackPanel> Boxs { get; set; }  
     public Color ColorOfWhitePiece { get; set; }  
     public Color ColorOfBlackPiece { get; set; }  
     public ChessBoard(Color pieceWhiteColor,Color pieceBlackColor,double width, double height)  
     {  
       InitializeComponent();  
       Boxs = new List<StackPanel>();  
       this.Width = width;  
       this.Height = height;  
       stkBoard.Orientation = Orientation.Vertical;  
       this.ColorOfWhitePiece = pieceWhiteColor;  
       this.ColorOfBlackPiece = pieceBlackColor;  
       RenderBoard();  
     }  
     public void RenderBoard()  
     {  
       StackPanel box;  
       bool isWhite = true;  
       for (int i = 0; i < 8; i++)  
       {  
         StackPanel rowBoxes = new StackPanel();  
         rowBoxes.Orientation = Orientation.Horizontal;  
         for (int j = 0; j < 8; j++)  
         {  
           box = new StackPanel();  
           box.Width = this.Width / 8;  
           box.Height = this.Height / 8;  
           if (isWhite)  
           {  
             box.Background = new SolidColorBrush(ColorOfWhitePiece);  
             isWhite = false;  
           }  
           else  
           {  
             box.Background = new SolidColorBrush(ColorOfBlackPiece);  
             isWhite = true;  
           }  
           rowBoxes.Children.Add(box);  
           Boxs.Add(box);  
         }  
         if (isWhite)  
           isWhite = false;  
         else  
           isWhite = true;  
         this.stkBoard.Children.Add(rowBoxes);  
       }  
     }  
   }  
 }  



3.- Consumir el Control de usuario.

ahora en nuestra aplicación principal del proyecto tendremos que instanciar nuestro tablero, les muestro el XAML de la aplicación principal.


 <Window x:Class="WPFChessProject.MainWindow"  
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"  
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"  
     Title="MainWindow" Height="350" Width="525">  
   <Grid x:Name="grdPrincipal">  
   </Grid>  
 </Window>  


Ahora veamos el codebehind:

 using System;  
 using System.Collections.Generic;  
 using System.Linq;  
 using System.Text;  
 using System.Windows;  
 using System.Windows.Controls;  
 using System.Windows.Data;  
 using System.Windows.Documents;  
 using System.Windows.Input;  
 using System.Windows.Media;  
 using System.Windows.Media.Imaging;  
 using System.Windows.Navigation;  
 using System.Windows.Shapes;  
 namespace WPFChessProject  
 {  
   /// <summary>  
   /// Lógica de interacción para MainWindow.xaml  
   /// </summary>  
   public partial class MainWindow : Window  
   {  
     public MainWindow()  
     {  
       InitializeComponent();  
       ChessBoard chessBoard = new ChessBoard(Colors.Green, Colors.Black,400,400);  
       grdPrincipal.Children.Add(chessBoard);  
     }  
   }  
 }  


Básicamente consiste en crear una instancia de ChessBoard y agregarlo al gridPrincipal y listo.



4.- Ejecutar la aplicación.:


MainWindow_2012-12-08_19-57-32


Y así lucirá nuestro tablero de ajedrez ;)

Que pasen buen día, buena vibra 
on domingo, 9 de diciembre de 2012

Buen día, ahora les traigo la programación para el front en esta serie de entradas de programación en capas, como ya les había comentado, para el ejemplo práctico usaremos las pantallas prehistóricas de Windows forms, lo primero que tenemos que hacer, es diseñar nuestra pantalla, a la cual les pondré el código del designer y les pegare una foto de cómo debe lucir nuestra pantalla.


LoginPrueba - Microsoft Visual Studio (Administrador)_2012-12-09_11-18-19

básicamente solo necesitamos ingresar el nombre de usuario y la contraseña a la cual tenemos que presionar el botón para poder autenticarnos.

para poder recrear dicho código  lo que necesitamos es copiar tal cual el código del designer. se los pongo a  continuación.


 namespace LoginPrueba  
 {  
   partial class Form1  
   {  
     /// <summary>  
     /// Variable del diseñador requerida.  
     /// </summary>  
     private System.ComponentModel.IContainer components = null;  
     /// <summary>  
     /// Limpiar los recursos que se estén utilizando.  
     /// </summary>  
     /// <param name="disposing">true si los recursos administrados se deben eliminar; false en caso contrario, false.</param>  
     protected override void Dispose(bool disposing)  
     {  
       if (disposing && (components != null))  
       {  
         components.Dispose();  
       }  
       base.Dispose(disposing);  
     }  
     #region Código generado por el Diseñador de Windows Forms  
     /// <summary>  
     /// Método necesario para admitir el Diseñador. No se puede modificar  
     /// el contenido del método con el editor de código.  
     /// </summary>  
     private void InitializeComponent()  
     {  
       this.btnAcceder = new System.Windows.Forms.Button();  
       this.txtPassword = new System.Windows.Forms.TextBox();  
       this.txtUser = new System.Windows.Forms.TextBox();  
       this.label1 = new System.Windows.Forms.Label();  
       this.label2 = new System.Windows.Forms.Label();  
       this.panel1 = new System.Windows.Forms.Panel();  
       this.panel1.SuspendLayout();  
       this.SuspendLayout();  
       //   
       // btnAcceder  
       //   
       this.btnAcceder.Location = new System.Drawing.Point(49, 136);  
       this.btnAcceder.Name = "btnAcceder";  
       this.btnAcceder.Size = new System.Drawing.Size(75, 23);  
       this.btnAcceder.TabIndex = 0;  
       this.btnAcceder.Text = "Acceder";  
       this.btnAcceder.UseVisualStyleBackColor = true;  
       this.btnAcceder.Click += new System.EventHandler(this.btnAcceder_Click);  
       //   
       // txtPassword  
       //   
       this.txtPassword.Location = new System.Drawing.Point(13, 95);  
       this.txtPassword.Name = "txtPassword";  
       this.txtPassword.Size = new System.Drawing.Size(149, 20);  
       this.txtPassword.TabIndex = 1;  
       //   
       // txtUser  
       //   
       this.txtUser.Location = new System.Drawing.Point(13, 37);  
       this.txtUser.Name = "txtUser";  
       this.txtUser.Size = new System.Drawing.Size(149, 20);  
       this.txtUser.TabIndex = 2;  
       //   
       // label1  
       //   
       this.label1.AutoSize = true;  
       this.label1.Location = new System.Drawing.Point(10, 11);  
       this.label1.Name = "label1";  
       this.label1.Size = new System.Drawing.Size(96, 13);  
       this.label1.TabIndex = 3;  
       this.label1.Text = "Nombre de usuario";  
       //   
       // label2  
       //   
       this.label2.AutoSize = true;  
       this.label2.Location = new System.Drawing.Point(10, 69);  
       this.label2.Name = "label2";  
       this.label2.Size = new System.Drawing.Size(61, 13);  
       this.label2.TabIndex = 4;  
       this.label2.Text = "Contraseña";  
       //   
       // panel1  
       //   
       this.panel1.Controls.Add(this.label1);  
       this.panel1.Controls.Add(this.btnAcceder);  
       this.panel1.Controls.Add(this.txtPassword);  
       this.panel1.Controls.Add(this.label2);  
       this.panel1.Controls.Add(this.txtUser);  
       this.panel1.Location = new System.Drawing.Point(12, 12);  
       this.panel1.Name = "panel1";  
       this.panel1.Size = new System.Drawing.Size(187, 173);  
       this.panel1.TabIndex = 5;  
       //   
       // Form1  
       //   
       this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);  
       this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;  
       this.ClientSize = new System.Drawing.Size(215, 197);  
       this.Controls.Add(this.panel1);  
       this.Name = "Form1";  
       this.Text = "Form1";  
       this.panel1.ResumeLayout(false);  
       this.panel1.PerformLayout();  
       this.ResumeLayout(false);  
     }  
     #endregion  
     private System.Windows.Forms.Button btnAcceder;  
     private System.Windows.Forms.TextBox txtPassword;  
     private System.Windows.Forms.TextBox txtUser;  
     private System.Windows.Forms.Label label1;  
     private System.Windows.Forms.Label label2;  
     private System.Windows.Forms.Panel panel1;  
   }  
 }  


ahora tenemos que darle funcionalidad a nuestra pantalla, que en teoría, el código debiera ser más compacto, más limpio, y sin la funcionalidad de la lógica de negocios, que como el post lo indica, estamos programando en capas y esa lógica debe de estar encapsulada en el controller de nuestra aplicación.


 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;  
 using BusinessLogicLayer;  
 namespace LoginPrueba  
 {  
   public partial class Form1 : Form  
   {  
     public Form1()  
     {  
       InitializeComponent();  
     }  
     private void btnAcceder_Click(object sender, EventArgs e)  
     {  
       //posible mejora aplicando un singleton al controller... proximamente  
       SecurityController controller = new SecurityController();  
       if (!string.IsNullOrEmpty(txtPassword.Text) && !string.IsNullOrEmpty(txtUser.Text))  
       {  
         if (controller.Autenticate(txtUser.Text, txtPassword.Text))  
           MessageBox.Show("welcome to the system");  
         else  
           MessageBox.Show("username or password is incorrect");  
       }  
     }  
   }  
 }  


Y ahora analicemos un poco el código, el botón que autentica  no es más que una condicional, que nos indica si el usuario esta autenticado o no, para esto tenemos que hacer una instancia de nuestro controller para poder acceder a la gama de métodos disponibles en el, en este caso obviamente solo hay un método, que es el de ejemplo.


Espero que les haya sido de utilidad esta serie de post que ejemplifican el trabajo en capas, obviamente esta forma de trabajar no es ley ya que se esta trabajando con una tecnología ORM de LinqToSql y ademas el diseño arquitectónico de este ejemplo puede ser mejorado y optimizado.

el objetivo de estos post fue brindar una idea clara y sobre todo dar una introducción al desarrollo en capas.

de antemano gracias por su atención.

su humilde servidor


Fernando Hoyos.
on jueves, 6 de diciembre de 2012
Ahora si por fin se vera algo de código  tanta asignación de referencias como que era aburrida pero vaya que es necesario comprenderla para conocer el manejo de dll's

primero vamos a comenzar a codificar nuestra clase SecurityController, esta clase nos permitirá autenticarnos con nuestra tabla de usuarios de la base de datos de ejemplo.

  using System;  
   using System.Collections.Generic;  
   using System.Linq;  
   using System.Text;  
   using DataLayer;  
   using System.Configuration;  
   namespace BusinessLogicLayer  
   {  
     public class SecurityController  
     {  
       public bool Autenticate(string userName, string password)  
       {  
         using (DataAccesLoginDataContext dataContext = new DataAccesLoginDataContext())  
         {  
           Users userAutenticated = (from u in dataContext.Users  
                                        where u.userName == userName && u.password == password  
                                            select u).FirstOrDefault();  
           if (userAutenticated != null)  
             return true;  
           else  
             return false;  
         }  
       }  
     }  
   }  

ahora describiremos lo que hace el metodo Autenticate


en primera instancia recibe dos parámetros, userName y password, dichos parámetros nos servirán para autenticarnos ante la base de datos.

Hecho esto tenemos que hacer una instancia de un contexto de LinqToSql

Después lo que hacemos es una consulta lambda con la entidad Users dentro del contexto creado.

preguntamos si realmente ese usuario y password trajo algún objeto autenticado.

on martes, 27 de noviembre de 2012
Ahora ya tenemos referenciada lo que es la capada de datos y la capa de negocios, lo que sigue ahora es cargar la capa de negocios con la vista y así es como se interactuara con la capa de negocios.

En esta primera ocasión utilizaremos las prehistóricas pantallas de WindowsForm.



LoginPrueba - Microsoft Visual Studio (Administrador)_2012-11-27_22-14-17


después tenemos que ocuparnos en nuestra cadena de conexión  para lo cual, en nuestra capa de datos tenemos un archivo de configuración llamado app.config


LoginPrueba - Microsoft Visual Studio (Administrador)_2012-11-27_22-00-16


dentro de este archivo, tenemos un documento xml, en lo cual, en el tag de connectionString, tenemos que poner nuestra configuración de nuestra base de datos.


Source=127.0.0.1 <- indicando que nuestra base de datos esta en localhost.
Catalog=PruebaProgramacionEnCapas <- el nombre de nustra base de datos
ID=sa <- usuario de base de datos
Password=******"  <- password de usuario de base de datos


 <?xml version="1.0" encoding="utf-8" ?>  
 <configuration>  
   <configSections>  
   </configSections>  
   <connectionStrings>  
     <add name="LogicaDeDatos.Properties.Settings.PruebaProgramacionEnCapasConnectionString"  
       connectionString="Data Source=127.0.0.1;Initial Catalog=PruebaProgramacionEnCapas;User ID=sa;Password=******"  
       providerName="System.Data.SqlClient" />  
   </connectionStrings>  
 </configuration>  

hecho esto tenemos listo nuestro archivo de configuración inicial de base de datos.


on lunes, 26 de noviembre de 2012
Que tal, este es la continuación de una serie de entradas, con el fin de mostrar un ejemplo de como separar en capas una aplicación en c#,  ahora toca turno de definir los controladores en la capa de la lógica de negocios.

Lo primero que tenemos que hacer, es agregar la referencia de nuestra capa de datos llamada DataLayer, a nuestra capa de negocio.

solo basta con seleccionar el proyecto:


LoginPrueba - Microsoft Visual Studio (Administrador)_2012-06-20_13-45-46


Ahora solo agregamos la referencia:

LoginPrueba - Microsoft Visual Studio (Administrador)_2012-06-20_13-58-28

La seleccionamos y aceptamos.

LoginPrueba - Microsoft Visual Studio (Administrador)_2012-06-20_13-59-34

Ahora tenemos que agregar una nueva referencia, no se si recuerdan que agregamos los dbml de linq to sql, peus bien, al agregar este item, por default se agrega una libreria, que es System.Data.Linq


LoginPrueba - Microsoft Visual Studio (Administrador)_2012-06-20_14-21-34



Ahora tenemos que agregar una nueva referencia, no sé si recuerdan que agregamos los dbml de linq to sql, pues bien, al agregar este item, por default se agrega una librería, que es System.Data.Linq.

¿Pero se estarán preguntando por que agregarla a la capa de lógica de negocios?
Esto es muy sencillo de responder, y es que dicha capa se encarga de crear los contextos entre la capa de datos y la capa de negocios, permitiendo que el tiempo de conexión entre las capas dure únicamente entre algún proceso de la lógica de negocios.

Si no les quedo muy claro lo último, se comprenderá un poco mas adelante.





ya para finalizar con las referencias de nuestro proyecto, tenemos que agregar la referencia de nuestra capa de negocios llamada BusinessLogicLayer.

LoginPrueba - Microsoft Visual Studio (Administrador)_2012-06-22_00-28-55

LoginPrueba - Microsoft Visual Studio (Administrador)_2012-06-20_13-58-28

Agregar referencia_2012-06-22_00-33-29

y ya con esto terminamos de agregar las referencias a nuestro proyecto
on sábado, 24 de noviembre de 2012
En esta ocasión se creara el mapeo de datos con linqToSql, se que para el framework 4.0 ya tenemos una tecnología tipo ORM mucho más flexible que es el Entity Framework, en esta ocasión utilizaremos LinqToSql porque queremos obtener algo sencillo ya que es para algo pequeño, si deseamos construir algo más grande y robusto y si se busca una mayor flexibilidad, se recomienda usar el Entity Framework.

recuerdan el proyecto que creamos para la capa de datos, el que se llamo DataLayer, pues bien, agregaremos un nuevo elemento llamado clases de linq to sql.


LoginPrueba - Microsoft Visual Studio (Administrador)_2012-06-19_14-44d-15


y asi es como se ve cuando lo vamos a agregar.

Agregar nuevo elemento - DataLayer_2012-06-19_15-12-27

Los archivos .dbml están compuestos por dos tipos de archivos, un .dbml.layout y un designer.cs, al monento de hacer el mapeo, se sobrescriben estos archivos generando la capa de datos.

Se recomienda no modifcarla.

LoginPrueba - Microsoft Visual Studio (Administrador)_2012-06-19_15-17-07



Para agregar nuevas tablas, tenemos qeu darle click en el archivo .dbml y nos saldra este recuadro, solo damos click al explorador de servidores.

LoginPrueba - Microsoft Visual Studio (Administrador)_2012-06-19_15-17-50
Esta imagen que tenemos abajo, es el explorador de servidores, lo que tenemos que hacer aquí es conectarnos a una base de datos.

LoginPrueba - Microsoft Visual Studio (Administrador)_2012-06-19_15-18-22

Para agregar una conexión, tenemos que poner el nombre del servidor, si lo tienen localhost, solo bastara con poner la dirección ip 127.0.0.1 que es precisamente la del localhost, tambien pueden poner el nombre de su maquina, tambien tienen que autenticarse a la base de datos, se recomienda el tipo de autenticación de
SQL Server para no batallar con los connectionStrings.

No olvidemos seleccionar la base de datos a la cual vamos a seleccionar nustras tablas para el mapeo automatico. 
LoginPrueba - Microsoft Visual Studio (Administrador)_2012-06-19_15-20-03

Una vez configurada nuestra conexión, damos click en aceptar y nos aparecerán todas las tablas que contiene la base de datos.
LoginPrueba - Microsoft Visual Studio (Administrador)_2012-06-19_15-20-50

ahora solo basta con agregar la tabla al archivo .dbml y listo, nos aparecerá el siguiente dialogo avisándonos que nuestra cadena de conexión no esta encriptada, solo damos click en aceptar.
LoginPrueba - Microsoft Visual Studio (Administrador)_2012-06-19_15-22-24

y ya con esto debemos tener el mapeo listo =)


LoginPrueba - Microsoft Visual Studio (Administrador)_2012-06-19_15-23-03

si no  has visto la parte no. 1 de este post, te invito a que lo hagas: Programacion en capas No. 1

Que tal, en este primer apartado del ejemplo de programación en capas crearemos la base de datos y la tabla usuarios, dicha tabla de momento nos servirá para la demostracion.

Primero que nada creamos nuestra base de datos de prueba. Nuestra base de datos sera en Sql server 2008, para esto necesitamos el sql managment studio express o profesional, cualquiera de los dos servirá
.

                              create database PruebaProgramacionEnCapas


ahora vamos a crear la tabla de usuarios.

create table Users
(
    userId int primary key identity,
    userName varchar(255) not null,
    password varchar(255) not null,
    unique(userName)
)


Como podemos observar, el nombre de usuarios tiene un constraint de tipo Unique, que nos permite que exista solo un nombre de usuario a la vez, esto con el fin de no duplicar dichos nombres de usuario ya que puede causar inconsistencias en la base de datos.

Lo que sigue a continuación es crear nuestro proyecto de visual studio, en este caso abrimos el visual studio 2010 y creamos un nuevo proyecto windows form, al que llamaremos LoginPrueba.


Una vez creado nuestro proyecto windows form, agregamos un nuevo proyecto de librería de clases llamado DataLayer y otro BusinessLogicLayer.


Agregar nuevo proyecto_2012-06-23_11-18-50

nuestro proyecto deberia de lucir asi:


LoginPrueba - Microsoft Visual Studio (Administrador)_2012-06-19_14-44-15


leer la introducción de programacion en capas con c#


Que tal, ya tenía muchas ganas de escribir algo sobre la programación en capas, ya que es un tema polémico que se habla mucho en Internet, pero que sin duda es dificil encontrar material fácil de digerir cuando uno es novato.

Cuando comencé a desarrollar mis primeros programas, llegue a escuchar en más de una ocasión, el tema de separar en varias capas un sistema, ya que te garantizaba una serie de ventajas que sonaban prometedoras y que sin duda era una solución a problemas comunes.

De entrada suena bien, se escucha interesante, pero me preguntaba cómo se hacía, la gente decía que era sencillo pero sinceramente no podía aplicar separar el código en diferentes capas de abstracción tal como lo pintaban. Y buscaba en Internet y encontraba muchos posts con información pero no encontraba un tema digerible para un novato como yo.

Hoy en día hay más material que antes, eso es totalmente cierto, pero sin duda quiero compartir una forma sencilla de cómo hacerlo.



Escenario.

Front.
Login Web, escritorio (wpf y windowsForm) y consola.

Backend.
linq to SQL y SQL Server 2008.

El objetivo de la separación en capas debe ser capaz para aislar la lógica de negocios, la vista y los datos.
Interesante video sobre Fibonacci y su secuencia y su explicación de como es considerado un fractal.

on martes, 20 de noviembre de 2012


Que tal, los que han usado c++, pascal, c o cualquier lenguaje de programación con acceso a la memoria RAM, es muy probable que estén familiarizados con los punteros o apuntadores, y para todos aquellos programadores de la nueva escuela que comenzaron usando c#, no tienen ni la mas remota idea de que son los punteros, ya que este lenguaje los oculta y hace transparenté el uso de estos.

Sin embargo, es necesario conocer en que momento son usados estos punteros en c#, ya que son totalmente transparentes para el programador.


Analicemos el siguiente bloque de código:


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

namespace aplicacionPunteros
{
    class Program
    {
        static void Main(string[] args)
        {
            Punto punto = new Punto(2, 4);
            Punto punto2 = punto;

            punto2.X = 888;

            Console.WriteLine(punto.X);
            Console.WriteLine(punto.Y);


            Console.WriteLine(punto2.X);
            Console.WriteLine(punto2.Y);

            Console.ReadKey();
        }
    }

    class Punto
    {
        public int X { get; set; }

        public int Y { get; set; }

        public Punto()
        {

        }

        public Punto(int x, int y)
        {
            this.X = x;

            this.Y = y;
        }
    }
}



Tenemos declarados dos objetos:


 Punto punto = new Punto(2, 4);
 Punto punto2 = punto;

al primero objeto  llamado punto se le están declarando un valor en X = 2, Y = 4, ahora bien, con el fin de establecer claro el ejemplo, declaramos un segundo objeto llamado punto2, y a continuación se le hace la asignación de punto. y se modifica la propiedad X a punto2

cuanso se asigna un objeto de la misma clase, algunas personas piensan que se realiza una clonacion del objeto, pero no es asi, lo que se esta haciendo es pasarle la referencia de su direccion de memoria en la cual esta almacenado el objeto, veamos graficamente:

tenemos la memoria RAM y al momento de hacer esta instruccion:

Punto punto = new Punto(2, 4);

estamos reservando ya sea en la memoria RAM o en el Heap.


memoria ram
y al momento de asignar al objeto punto2 el objeto punto, se aplica la misma teoría que en c++, y es donde se aplican los punteros.

es por eso que no piensen que un objeto es clonado a la hora de la asignacion, si no que es el mismo objeto.

ahora veamos el resultado de la corrida del programa anterior.








consola 

pero los dos valores fueron iguales, esto se debe a que cuando  se realizo el siguiente codigo:

Punto punto2 = punto;

punto2.X = 888;


punto fue asignado a punto2, y luego punto2.X se le asigno un nuevo valor, por lo tanto, punto2, esta haciendo referencia a la direccion de memoria donde fue instanciado el objeto punto.