Pop

Chatbot con inteligencia artifical en tensorflow (3/4)

3. Chatbot con inteligencia artifical  en tensorflow 

  • Hola a todos.En esta ocasión continuamos con nuestro tutorial para crear y entrenar  nuestro propio chatbot  que se comportará con inteligencia artificial. Para crear un chatbot, o para hacer cualquier tipo de tarea de aprendizaje automático, el primer trabajo que tenemos que hacer es adquirir datos para el entrenamiento.Después  necesitamos  estructurarlos y prepararlos para que se formateen para "la entrada" y "la salida"para que un algoritmo de aprendizaje automático puede digerir. 
  • Una vez que tenemos la base datos preparada,según vimos en la entrada anterior. Podemos generar los ficheros necesarios para el entrenamiento de nuestro modelo. Crearemos dos archivos que tengan preguntas y respuestas. Para ello tomaremos los datos  de la base de datos y adjuntarlos en los archivos de entrenamiento respectivos.
  • En el siguiente vídeo explico el código necesario para hacer esto:
  • Os dejo el código visto en el vídeo:

import sqlite3
import pandas as pd

#En mi caso trabajo con un solo més.En este caso el marzo de 2015
timeframes = ['2015-03']


for timeframe in timeframes:
    connection = sqlite3.connect('{}.db'.format(timeframe))# conectamos a la base de datos
    c = connection.cursor()
    limit = 5000 #numero de registros que obtenemo de la base de datos en la consulta
    last_unix = 0
    cur_length = limit
    counter = 0 # contador para 
    test_done = False # boleano que nos indica cuando hemos  terminado

    while cur_length == limit:

        df = pd.read_sql("SELECT * FROM parent_reply WHERE unix > {} and parent NOT NULL and score > 0 ORDER BY unix ASC LIMIT {}".format(last_unix,limit),connection)
        last_unix = df.tail(1)['unix'].values[0]
        cur_length = len(df)

        if not test_done:
            with open('test.from','a', encoding='utf8') as f:
                for content in df['parent'].values:
                    f.write(content+'\n')

            with open('test.to','a', encoding='utf8') as f:
                for content in df['comment'].values:
                    f.write(str(content)+'\n')

            test_done = True

        else:
            with open('train.from','a', encoding='utf8') as f:
                for content in df['parent'].values:
                    f.write(content+'\n')

            with open('train.to','a', encoding='utf8') as f:
                for content in df['comment'].values:
                    f.write(str(content)+'\n')

        counter += 1
        if counter % 20 == 0:
            print(counter*limit,'rows completed so far')

Curso .NET Core en C# - 4.Analizamos los ficheros de configuración

4.Analizamos nuestra primera aplicación

  • Hola a todos. En este nuevo curso, analizaremos todos los conceptos básicos, intermedios y avanzados de ASP.NET Core que nos ayudan a crear aplicaciones web basadas en datos.Al final de este curso, podremos realizar todas las operaciones de un CRUD, es decir, crear, leer, actualizar y eliminar datos  utilizando SQL Server como nuestra base de datos.
  • En este nuevo capítulo analizamos los ficheros de configuración launchsettings.json y el fichero appsettings.json. El fichero launchsettings está en la carpeta propiedades.Este archivo solo se utiliza en la máquina de desarrollo local. En el fichero appsettings guardaremos la configuración de la aplicación. En versiones anteriores de ASP.NET, almacenábamos los ajustes de configuración de la aplicación, como cadenas de conexión de base de datos en el archivo web.config. 
  • En el vídeo os explico con más detalles estos archivos de configuración:

  • Los ficheros de configuración de vuestras aplicaciones tendrán una apariencia similar a esto:
{
  "iisSettings": {
    "windowsAuthentication": false, 
    "anonymousAuthentication": true, 
    "iisExpress": {
      "applicationUrl": "http://localhost:51775",
      "sslPort": 0
    }
  },
  "profiles": {
    "IIS Express": {
      "commandName": "IISExpress",
      "launchBrowser": true,
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      }
    },
    "Ejemplo1": {
      "commandName": "Project",
      "launchBrowser": true,
      "applicationUrl": "http://localhost:5000",
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      }
    }
  }
}

Curso .NET Core en C# - 3.Analizamos nuestra primera aplicación

3.Analizamos nuestra primera aplicación

  • Hola a todos. En este nuevo curso, analizaremos todos los conceptos básicos, intermedios y avanzados de ASP.NET Core que nos ayudan a crear aplicaciones web basadas en datos.Al final de este curso, podremos realizar todas las operaciones de un CRUD, es decir, crear, leer, actualizar y eliminar datos  utilizando SQL Server como nuestra base de datos.
  • Terminamos el anterior vídeo creando una aplicación web vacía. En este vamos a analizar el significado del método Main() en una aplicación Core de ASP.NET. Si tienes experiencia con versiones anteriores de .NET, una aplicación de consola tiene un método Main() y es el punto de entrada de esa aplicación de consola.El punto importante a tener en cuenta es que, inicialmente, una aplicación Core de  asp.net se inicia como una aplicación de consola.
  • En el siguiente vídeo explicamos el funcionamiento básico de las aplicaciones CORE de ASP.NET: 
  • Os dejo el código de un par de clases vistas en el vídeo:
    • Clase Program:
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Logging;

namespace Ejemplo1
{
    public class Program
    {
        public static void Main(string[] args)
        {
            CreateWebHostBuilder(args).Build().Run();
        }

        public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>WebHost.CreateDefaultBuilder(args).UseStartup<Startup>();
    }
}

    • Clase Startup:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.DependencyInjection;

namespace Ejemplo1
{
    public class Startup
    {
        // This method gets called by the runtime. Use this method to add services to the container.
        // For more information on how to configure your application, visit https://go.microsoft.com/fwlink/?LinkID=398940
        public void ConfigureServices(IServiceCollection services)
        {
        }

        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }

            app.Run(async (context) =>
            {
                await context.Response.WriteAsync(System.Diagnostics.Process.GetCurrentProcess().ProcessName);
            });
        }
    }
}

Chatbot con inteligencia artifical en tensorflow (2/4)

2. Chatbot con inteligencia artifical  en tensorflow 

  • Hola a todos.En esta ocasión continuamos con nuestro tutorial para crear y entrenar  nuestro propio chatbot  que se comportará con inteligencia artificial. Para crear un chatbot, o realmente hacer cualquier tipo de tarea de aprendizaje automático, el primer trabajo que tenemos que hacer es adquirir datos para el entrenamiento.Después  necesitamos  estructurarlos y prepararlos para que se formateen para "la entrada" y "la salida"para que un algoritmo de aprendizaje automático puede digerir. 
  • En esta entrada explicaremos el código necesario para volcar el contenido de los ficheros que descargamos en el capítulo anterior en una base datos. La idea es preparar la estructura de la  base de datos para poder generar posteriormente los ficheros necesarios para entrenar nuestro modelo.
  • En el siguiente vídeo explico el código que utilizamos para alcanzar nuestro propósito:
  • Os dejo el código visto en el vídeo:
#Cargamos librerias necesarias
import sqlite3
import json
from datetime import datetime
import time

#De todos los meses disponibles en los datos del torrent de de reddit elijo marzo de  2015
timeframe = '2015-03'
sql_transaction = []
start_row = 0
cleanup = 1000000

#vamos a almacenar los datos en un una BBDD sqlLite
connection = sqlite3.connect('{}.db'.format(timeframe))
c = connection.cursor()

#Nos creamos una función para crear la tabla donde guardamos los campos que nos interesan del #JSON. En este caso son:
def create_table():
    c.execute("CREATE TABLE IF NOT EXISTS parent_reply(parent_id TEXT PRIMARY KEY, comment_id TEXT UNIQUE, parent TEXT, comment TEXT, subreddit TEXT, unix INT, score INT)")

#Función para formatear los datos que vamos leyendo
def format_data(data):
    data = data.replace('\n',' newlinechar ').replace('\r',' newlinechar ').replace('"',"'")
    return data

# Esta función se utiliza para crear sentencias de inserción y confirmarlas en grupos
# en lugar de hacer que inserte uno a uno
def transaction_bldr(sql):
    global sql_transaction
    sql_transaction.append(sql)
    if len(sql_transaction) > 1000:
        c.execute('BEGIN TRANSACTION')
        for s in sql_transaction:
            try:
                c.execute(s)
            except:
                pass
        connection.commit()
        sql_transaction = []

#función que actualiza el comentarios en nuestra BBDD sqlLite
def sql_insert_replace_comment(commentid,parentid,parent,comment,subreddit,time,score):
    try:
        sql = """UPDATE parent_reply SET parent_id = ?, comment_id = ?, parent = ?, comment = ?, subreddit = ?, unix = ?, score = ? WHERE parent_id =?;""".format(parentid, commentid, parent, comment, subreddit, int(time), score, parentid)
        transaction_bldr(sql)
    except Exception as e:
        print('s0 insertion',str(e))

#Funcion que guarda en BBDD un comentario que tiene padre
def sql_insert_has_parent(commentid,parentid,parent,comment,subreddit,time,score):
    try:
        sql = """INSERT INTO parent_reply (parent_id, comment_id, parent, comment, subreddit, unix, score) VALUES ("{}","{}","{}","{}","{}",{},{});""".format(parentid, commentid, parent, comment, subreddit, int(time), score)
        transaction_bldr(sql)
    except Exception as e:
        print('s0 insertion',str(e))
        
#Funcion que guarda en BBDD un comentario que no tiene padre
def sql_insert_no_parent(commentid,parentid,comment,subreddit,time,score):
    try:
        sql = """INSERT INTO parent_reply (parent_id, comment_id, comment, subreddit, unix, score) VALUES ("{}","{}","{}","{}",{},{});""".format(parentid, commentid, comment, subreddit, int(time), score)
        transaction_bldr(sql)
    except Exception as e:
        print('s0 insertion',str(e))

#Solo guardamos los comentarios cuyo tamaño sea válido para el entrenamiento
def acceptable(data):
    if len(data.split(' ')) > 1000 or len(data) < 1:
        return False
    elif len(data) > 32000:
        return False
    elif data == '[deleted]':
        return False
    elif data == '[removed]':
        return False
    else:
        return True

#Función que encuentra el padre de un comentario dado
def find_parent(pid):
    try:
        sql = "SELECT comment FROM parent_reply WHERE comment_id = '{}' LIMIT 1".format(pid)
        c.execute(sql)
        result = c.fetchone()
        if result != None:
            return result[0]
        else: return False
    except Exception as e:
        #print(str(e))
        return False

#Función que nos da la puntuación de un comentario dado
def find_existing_score(pid):
    try:
        sql = "SELECT score FROM parent_reply WHERE parent_id = '{}' LIMIT 1".format(pid)
        c.execute(sql)
        result = c.fetchone()
        if result != None:
            return result[0]
        else: return False
    except Exception as e:
        #print(str(e))
        return False
    
if __name__ == '__main__':
    create_table() #Empezamos creando la tabla sobre la que almacenar los datos
    row_counter = 0 #Contador para ver en que parte del archivo estamos.Va contando las filas
    paired_rows = 0 #Contador que nos dice las filas que están emparejas.Pregunta con respuesta
    
#Abrimos la ubicación del archivo que nos iteresa y vamos lyendo filas
     with open('D:/reddit/RC_{}'.format(timeframe), buffering=1000) as f:
        for row in f:
            #print(row)
            #time.sleep(555)
            row_counter += 1
            #vamos obtiendo los datos quqe nos interesan de cada fila
            if row_counter > start_row:
                try:
                    row = json.loads(row)
                    parent_id = row['parent_id'].split('_')[1]
                    body = format_data(row['body'])
                    created_utc = row['created_utc']
                    score = row['score']
                    comment_id = row['id']
                    subreddit = row['subreddit']
    
                    #Todos los comentarios inicialmente no tendrán un padre. 
                    #Sin embargo, a medida que avanzamos en el documento, encontraremos 
                    #comentarios que tienen padres que tenemos en nuestra base de datos. 
                    #Cuando esto sucede, queremos agregar este comentario al padre existente. 
                    parent_data = find_parent(parent_id)
                    
                    existing_comment_score = find_existing_score(parent_id)
                    
                    #Si existe un comentario asociado al padre con mejor puntuación reemplazamos
                    #el comentario existente.
                    #En el caso que el comentario no tenga padre se inserta
                    if existing_comment_score:
                        if score > existing_comment_score:
                            if acceptable(body):#validamos el tamaño
                                sql_insert_replace_comment(comment_id,parent_id,parent_data,body,subreddit,created_utc,score)
                                
                    else:
                        if acceptable(body):
                            if parent_data:
                                if score >= 2:#solo tratamos comentarios con más de dos votos
                                    sql_insert_has_parent(comment_id,parent_id,parent_data,body,subreddit,created_utc,score)
                                    paired_rows += 1
                            else:
                                sql_insert_no_parent(comment_id,parent_id,body,subreddit,created_utc,score)
                except Exception as e:
                    print(str(e))
                    
            #Muestro por pantalla cada 100000 filas                
            if row_counter % 100000 == 0:
                print('Total Rows Read: {}, Paired Rows: {}, Time: {}'.format(row_counter, paired_rows, str(datetime.now())))
            
            #Finalmente borrmos los comentarios que no tengan padre cada 100000 lineas #procesadas
            if row_counter > start_row:
                if row_counter % cleanup == 0:
                    print("Cleanin up!")
                    sql = "DELETE FROM parent_reply WHERE parent IS NULL"
                    c.execute(sql)
                    connection.commit()
                    c.execute("VACUUM")
                    connection.commit()

Curso .NET Core en C# - 1.Introducción - Visual Studio 2019

1.Introducción

  • Hola a todos. En este nuevo curso, analizaremos todos los conceptos básicos, intermedios y avanzados de ASP.NET Core que nos ayudan a crear aplicaciones web basadas en datos.Al final de este curso, podremos realizar todas las operaciones de un CRUD, es decir, crear, leer, actualizar y eliminar datos  utilizando SQL Server como nuestra base de datos.
  • En este curso veremos:
    • ASP.NET Core
    • ASP.NET Core MVC
    • ASP.NET Identity Core para seguridad
    • Entity Framework Core para acceso a datos
  • Alguno de los beneficios de de ASP.NET Core:

    • ASP.NET Core es un marco multiplataforma, de alto rendimiento y de código abierto para crear aplicaciones modernas, basadas en la nube y conectadas a Internet.
    • ASP.NET Core es un rediseño de ASP.NET 4.x.
    • ASP.NET Core ha sido rediseñado desde cero y ofrece los beneficios y características que comento en el vídeo: 


  • Es recomendable para seguir este curso conocer:
    •  HTML básico, CSS y C#. No es necesarios ser un experto. Todo lo que necesitas es  tener conocimientos básicos.
    • El conocimiento previo de MVC es útil pero no es obligatorio. 

Curso .NET Core en C# - 2.Preparación del entorno de trabajo - Visual Studio 2019

2.Preparación del entorno de trabajo

  • Hola a todos. En este nuevo curso, analizaremos todos los conceptos básicos, intermedios y avanzados de ASP.NET Core que nos ayudan a crear aplicaciones web basadas en datos.Al final de este curso, podremos realizar todas las operaciones de un CRUD, es decir, crear, leer, actualizar y eliminar datos  utilizando SQL Server como nuestra base de datos.
  • En este segundo capítulo preparamos el entorno de trabajo para poder comenzar a programar. Los dos enlaces que os dejo nos ayudarán para este propósito: 
  • En el vídeo os explico como instalar todo lo necesario para configurar nuestro entorno de trabajo. Además creamos nuestro primer proyecto:
  • Os dejo parte del código generado al crearnos nuestro primer proyecto .NET Core 2.2:
    • Clase Program:
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Logging;

namespace Ejemplo1
{
    public class Program
    {
        public static void Main(string[] args)
        {
            CreateWebHostBuilder(args).Build().Run();
        }

        public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>WebHost.CreateDefaultBuilder(args).UseStartup<Startup>();
    }
}

  • Clase Ejemplo1:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.DependencyInjection;

namespace Ejemplo1
{
    public class Startup
    {
        // This method gets called by the runtime. Use this method to add services to the container.
        // For more information on how to configure your application, visit https://go.microsoft.com/fwlink/?LinkID=398940
        public void ConfigureServices(IServiceCollection services)
        {
        }

        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }

            app.Run(async (context) =>
            {
                await context.Response.WriteAsync("Hello World!");
            });
        }
    }
}

Chatbot con inteligencia artifical en tensorflow (1/4)

1. Chatbot con inteligencia artifical  en tensorflow 

  • Hola a todos.En esta ocasión comenzamos  un tutorial para crear y entrenar  nuestro propio chatbot  que se comportará con inteligencia artificial. Para crear un chatbot, o realmente hacer cualquier tipo de tarea de aprendizaje automático, el primer trabajo que tenemos que hacer es adquirir datos para el entrenamiento.Después  necesitamos  estructurarlos y prepararlos para que se formateen para "la entrada" y "la salida"para que un algoritmo de aprendizaje automático puede digerir. 
  •  La estructura de Reddit es en forma de árbol. Para un chatbot, esto significa que necesitamos separar las cosas para ser un comentario y luego una respuesta. El comentario es la entrada y la respuesta es la salida deseada. En Reddit, no todos los comentarios tienen respuestas, y puede ser que muchos comentarios tengan varias respuestas.Nos basaremos en las puntuaciones de los comentarios  para elegir la mejor respuesta para nuestro chatbot. El comentario es la entrada, la respuesta es la salida deseada. 
  •  Lo que haremos es insertar los datos de los comentarios en una base de datos. Todos los comentarios vendrán cronológicamente, por lo que todos los comentarios serán inicialmente el "padre" y no tendrán un padre propio. Sin embargo, con el tiempo, habrá respuestas, y después podremos almacenar esta "respuesta"asociada a un padre en  la base de datos.
  • En el siguiente vídeo explico estas ideas:
.
  • Ejemplo de un json de los comentarios:
 {
 "author":"Arve",
 "link_id":"t3_5yba3",
 "score":0,
 "body":"Can we please deprecate the word \"Ajax\" now? \r\n\r\n(But yeah, this _is_ much nicer)",
 "score_hidden":false,
 "author_flair_text":null,
 "gilded":0,
 "subreddit":"reddit.com",
 "edited":false,
 "author_flair_css_class":null,
 "retrieved_on":1427426409,
 "name":"t1_c0299ap",
 "created_utc":"1192450643",
 "parent_id":"t1_c02999p",
 "controversiality":0,
 "ups":0,
 "distinguished":null,
 "id":"c0299ap",
 "subreddit_id":"t5_6",
 "downs":0,
 "archived":true
 }

Machine learning con Visual Studio 2019 - Ejemplos varios

ML.NET Varios ejemplos

  • Hola a todos.En este ocasión traigo un ejemplo sobre como empezar a utilizar machine learning con visual studio 2019. Hoy en día está de plena actualidad pero nunca está de más decir que Machine Learning es una disciplina científica del ámbito de la Inteligencia Artificial que crea sistemas que aprenden automáticamente.
  • En el ejemplo podemos ver:
    • Cómo entrenar, construir y generar modelos para machine learning.
    • Cómo predecir  los pronósticos de ventas del próximos mes utilizando el modelo ML entrenado.
    • En el ejemplos se implementó como una aplicación web única y monolítica utilizando ASP.NET Core Razor.
    •  La aplicación también está utilizando una base de datos de SQL Server para el catálogo de productos y la información de pedidos.
    •  Si desea utilizar un SQL Server real o una base de datos SQL de Azure, solo necesita cambiar la cadena de conexión en la aplicación.
  • En el siguiente vídeo podéis ver el ejmplo del que os hablo:

Machine learning con Visual Studio 2019 - Instalación y ejemplo

ML.NET Instalación y primer ejemplo

  • Hola a todos.En este ocasión traigo un tutorial sobre como empezar a utilizar machine learning con visual studio 2019. Hoy en día está de plena actualidad pero nunca está de más decir que Machine Learning es una disciplina científica del ámbito de la Inteligencia Artificial que crea sistemas que aprenden automáticamente.
  • El proceso de aprendizaje automático es similar al de la minería de datos. Ambos sistemas buscan entre los datos para encontrar patrones. Sin embargo, en lugar de extraer los datos para la comprensión humana –como es el caso de las aplicaciones de minería de datos– el aprendizaje automático utiliza esos datos para detectar patrones en los datos y ajustar las acciones del programa en consecuencia. Los algoritmos del aprendizaje automático se clasifican a menudo como supervisados ​​o no supervisados. Los algoritmos supervisados ​​pueden aplicar lo que se ha aprendido en el pasado a nuevos datos. Los algoritmos no supervisados ​​pueden extraer inferencias de conjuntos de datos
  • En el siguiente vídeo podéis ver como instalo y empiezo a trabajar con esta tecnología en visual studio 2019:

Patrones de diseño software 13. Patrón comportamiento Iterator

13. Patrón comportamiento Iterator

  • Hola a todos.Seguimos con  nuestro  curso dedicado a los patrones de diseño software.Los patrones de diseño son unas técnicas para resolver problemas comunes en el desarrollo de software y otros ámbitos  referentes al diseño de interacción o interfaces.
  • En esta ocasión veremos el patrón de diseño Iterator. En diseño de software, el patrón de diseño Iterador, define una interfaz que declara los métodos necesarios para acceder secuencialmente a un grupo de objetos de una colección.El patrón surge del deseo de acceder a los elementos de un contenedor de objetos (por ejemplo, una lista) sin exponer su representación interna
  • El modelo de clases que utilizaremos para este ejemplo es el siguiente:
  • En el siguiente  vídeo tenéis un ejemplo de este patrón de diseño
  • Os dejo el código de las diferentes clases vistas en el vídeo:
    •  Clase IteradorOrdenador.cs
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Iterator
{
    public class IteradorOrdenador
    {
        private ArrayList ordenador;
        private int posicion;

        public IteradorOrdenador(Ordenador o)
        {
            this.ordenador = o.datos;
            posicion = 0;
        }

        public Boolean existeSiguiente()
        {
            if (posicion < ordenador.Count)
                return true;
            else
                return false;
        }

        public Object siguiente()
        {
            object valor = ordenador[posicion];
            posicion++;
            return valor;
        }
    }
}

    •  Clase Ordenador.cs
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Iterator
{
    public class Ordenador
    {
        public ArrayList datos;

        public Ordenador()
        {
            datos = new ArrayList();
        }

        public Ordenador dameValor(int pos)
        {
            Ordenador o = null;
            if(pos<datos.Count)
                return (Ordenador)datos[pos];

            return o;
        }

        public void añadirValor(string valor)
        {
            datos.Add(valor);
        }

        public int dimension()
        {
            return datos.Count;
        }

        public IteradorOrdenador iterador()
        {
            return new IteradorOrdenador(this);
        }
    }
}
    •  Clase Program.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Iterator
{
    class Program
    {
        static void Main(string[] args)
        {
            Ordenador lista = new Ordenador();
            lista.añadirValor("Pentium 1");
            lista.añadirValor("Pentium 2");
            lista.añadirValor("Pentium 3");
            lista.añadirValor("Pentium 4");
            IteradorOrdenador iterador = lista.iterador();

            //Recorrido con el iterador
            while (iterador.existeSiguiente())
                Console.WriteLine(iterador.siguiente());

            Console.ReadLine();
        }
    }
}

Patrones de diseño software 12. Patrón comportamiento Strategy

12. Patrón comportamiento Strategy

  • Hola a todos.Seguimos con  nuestro  curso dedicado a los patrones de diseño software.Los patrones de diseño son unas técnicas para resolver problemas comunes en el desarrollo de software y otros ámbitos  referentes al diseño de interacción o interfaces.
  • En esta ocasión veremos el patrón de diseño Strategy. El patrón Estrategia (Strategy) es un patrón de diseño para el desarrollo de software. Se clasifica como patrón de comportamiento porque determina cómo se debe  realizar el intercambio de mensajes entre diferentes objetos para resolver una tarea. El patrón Strategy permite mantener un conjunto de algoritmos de entre los cuales el objeto cliente puede elegir aquel que le conviene e intercambiarlo dinámicamente según sus necesidades.
  • El modelo de clases que utilizaremos para este ejemplo es el siguiente:

  • En el siguiente  vídeo tenéis un ejemplo de este patrón de diseño
  • Os dejo el código de las diferentes clases vistas en el vídeo:
    •  Interface IConexion
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Strategy
{
    interface IConexion
    {
        string conectar();

        Boolean conexionEstablecida();
    }
}

    •  Clase GestionarConexiones.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Strategy
{
    class GestionarConexiones
    {
        private IConexion conexion;

        public void ConexionesOracle()
        {
            this.conexion = new Oracle();
        }

        public void ConexionesSQL()
        {
            this.conexion = new SQL();
        }

        public string conectar()
        {
          return  this.conexion.conectar();
        }

        public Boolean conexionCorrecta()
        {
            return this.conexion.conexionEstablecida();
        }
    }
}

    •  Clase Oracle.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Strategy
{
    class Oracle : IConexion
    {
        Boolean conexionCorrecta = false;

        public string conectar()
        {
            conexionCorrecta = true;
            return "Conectando con BBDD ORACLE";
        }

        public Boolean conexionEstablecida()
        {
            return conexionCorrecta;
        }
       
    }
}

    •  Clase SQL.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Strategy
{
    class SQL:IConexion
    {
        Boolean conexionCorrecta = false;

        public string conectar()
        {
            conexionCorrecta = false;
            return "Conectando con BBDD SQL";
        }

        public Boolean conexionEstablecida()
        {
            return conexionCorrecta;
        }
    }
}

    •  Clase Program.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Strategy
{
    class Program
    {
        static void Main(string[] args)
        {
            GestionarConexiones gesConex = new GestionarConexiones();
            gesConex.ConexionesOracle();
            Console.WriteLine(gesConex.conectar());

            if (!gesConex.conexionCorrecta())
            {
                gesConex.ConexionesSQL();
                Console.WriteLine(gesConex.conectar());
            }

            Console.ReadLine();
            
        }
    }
}

Curso .NET Core en C# - 34.Creamos nuestro propio log

34.Creamos nuestro propio log Hola a todos. En este curso, analizaremos todos los conceptos básicos, intermedios y avanzados de  ASP.NET...