En este post se concreta el concepto de Encapsulamiento, pues hasta el momento se habría usado mucho en el recorrido de cada uno de los POST, pero no se había definido un espacio para aclarar este concepro, ¿Por qué asta estas instancias hablar un tema tan importante? Cuando al principio se aborda el tema de encapsulamiento sin haber tenido contacto con términos y conceptos de POO es más tortuoso entender su significado. Luego de estudiar, qué es Clase, Objeto, Propiedades, Comportamientos, Métodos, Estados, Interfaces, Clases Abstractas etc, se puede tener una visión más general sobre el tema.

DEFINAMOS

Encapsulamiento o encapsulación es todo comportamiento, operación o estado interno de un objeto, que para otros objetos o su exterior no es ni relevante ni necesario conocer.

Por ejemplo para aplicaciones silverlight existe el Toolkit de Silverlight que a la hora de crear aplicaciones, permite usar componetes tales como cajas de texto, selectores y otros muchos más controles que permiten crear interfaces de usuario eficientes, compactas e interactivas.

Para ver ejemplos a cerca del uso de estos controles puedes dirigirte al siguiente link.

Ahora es posible afirmar que: El Toolkit de Silverlight encapsula componentes orientados a objetos, los cuales permiten crear y mejorar la experiencia del usuario.

PRACTIQUEMOS

A través de un ejemplo con Silverlight vamos a poner a prueba el poder del encapsulamiento.

1- En una solución de Silverlight en el archivo MainPage.xaml, se va a crear un objeto Ellipse tal cómo se ve en el siguiente código:

<Ellipse x:Name="Balon" Width="50" Height="50" Fill="Black"/>

La idea inicial es poder lograr un efecto de balón con este objeto tipo Shape de Silverlight.

2 – Crearemos 2 botones en la ventana, de forma tal me permitan interactuar con los eventos Click para iniciar y parar la animación.

 <Button Canvas.Left="179" Canvas.Top="265" Content="Empezar"
         Height="23" Name="BtEmpezar" Width="75" Click="BtEmpezar_Click" />
<Button Canvas.Left="270" Canvas.Top="265" Content="Parar"
        Height="23" Name="BtParar" Width="75" Click="BtParar_Click" />

Cada uno de los anteriores objetos con un controlador de evento asociado.

3 – El contenedor principal para este ejemplo sea un Panel tipo canvas, en el cual se va a definir de forma especial un recurso el cual se usaría para lograr el efecto de la animación:

<Canvas x:Name="LayoutRoot" Background="White">
        <Canvas.Resources>
            <Storyboard x:Name="SBAnimacion">
                <DoubleAnimation Storyboard.TargetName="Balon" RepeatBehavior="Forever"
                                 Storyboard.TargetProperty="(Canvas.Top)"
                                 From="0" To="250" Duration="00:00:05">
                    <DoubleAnimation.EasingFunction>
                        <BounceEase Bounces="2" EasingMode="EaseOut" Bounciness="3"/>
                    </DoubleAnimation.EasingFunction>
                </DoubleAnimation>
            </Storyboard>
        </Canvas.Resources>
</canvas>

Como se ve en el anterior código se ha creado un objeto StoryBoard como recurso del objeto Canvas, este objeto el cual llamaremos SBAnimacion va a contener un objeto de tipo animación que permite definir una interacción o comportamiento del Objeto Balon y Propiedad Top de este, en este caso el tipo de animación será DoubleAnimation, en la cual se configuran los parámetros de dicha animación. Incluido en el código y dentro del objeto DoubleAnimation existe una Propiedad especial, llamada EasingFunction, en el cual se definen unos atributos más, respecto a la animación que se está haciendo, y con el objetivo de obtener el efecto de rebote para el balón(funciones matemáticas de comportamiento para los objetos de la UI en Silverlight).

Cómo se ve hasta este punto no se le ha hecho nada más si no mediante código XAML parametrizar cada objeto respecto a lo que se quiere hacer al momento de ejecutar la animación.

Si vemos el código completo XAML quedará así:

<UserControl x:Class="Silverlight_CPOO_03_Encapsulamiento.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d"
    d:DesignHeight="300" d:DesignWidth="400">

    <Canvas x:Name="LayoutRoot" Background="White">
        <Canvas.Resources>
            <Storyboard x:Name="SBAnimation">
                <DoubleAnimation Storyboard.TargetName="Balon" RepeatBehavior="Forever"
                                 Storyboard.TargetProperty="(Canvas.Top)"
                                 From="0" To="250" Duration="00:00:05">
                    <DoubleAnimation.EasingFunction>
                        <BounceEase Bounces="2" EasingMode="EaseOut" Bounciness="3"/>
                    </DoubleAnimation.EasingFunction>
                </DoubleAnimation>
            </Storyboard>
        </Canvas.Resources>
        <Ellipse x:Name="Balon" Width="50" Height="50" Fill="Black"/>
        <Button Canvas.Left="179" Canvas.Top="265" Content="Empezar" Height="23" Name="BtEmpezar" Width="75" Click="BtEmpezar_Click" />
        <Button Canvas.Left="270" Canvas.Top="265" Content="aParar" Height="23" Name="BtParar" Width="75" Click="BtParar_Click" />
    </Canvas>
</UserControl>

Ahora veamos el código de C#:


using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;

namespace Silverlight_CPOO_03_Encapsulamiento
{
    public partial class MainPage : UserControl
    {
        public MainPage()
        {
            InitializeComponent();
        }

        private void BtEmpezar_Click(object sender, RoutedEventArgs e)
        {
            SBAnimation.Begin();
        }

        private void BtParar_Click(object sender, RoutedEventArgs e)
        {
            SBAnimation.Stop();
        }
    }
}

Si repasamos el código de C#, en ninguna parte estamos creando algún tipo de funcionalidad para mover el objeto Balón de tipo Ellipse en pantalla, pero si se observa el código de cada evento generado por cada botón, allí se hace el llamado a funciones del objeto StoryBoard siendo estas Begin() y Stop(), cada una para iniciar y parar la animación respectivamente. Hasta este punto solo se ha estado configurando y estableciendo los llamados a los métodos que internamente ejecutan y controlan la animación, lo interesante acá es que para nosotros no es ni relevante, ni necesario conocer cómo se haya implementado el código que este por debajo de esos métodos, y es aquí donde vale destacar el poder de “encapsular”, pues se esta usando un objeto el cual determina cómo utilizar X configuración en pro de ejecutar una animación y después de eso la gestión será interna sin tener nosotros que preocuparnos por mucho más.

Veamos un pequeño video en el que se ve la ejecución de la aplicación:

Anuncios