Portal    Foro    Buscar    FAQ    Registrarse    Conectarse


Publicar nuevo tema  Responder al tema 
Página 1 de 2
Ir a la página 1, 2  Siguiente
 
Termino Generalización.POO
Autor Mensaje
Responder citando   Descargar mensaje  
Mensaje Termino Generalización.POO 
 
Buenas!.

Encontré esta palabra que según el contexto cambia el significado de la misma.
He encontrado en relación a la programación varias explicaciones pero no se ponen de acuerdo y
me quedo con la duda.

Voy por partes.

En el libro de como piensa un informático usando Python. Explica que es el diseño de una interfaz.
Por ejemplo el diseño de una interfaz de una función es un resumen de como se utiliza.

- Que hace
- Que valor devuelve

Una interfaz debe ser limpia, tan limpia como sea posible, pero quizás no tan fácil o simple.

En ese capitulo crea una función y luego se le añade un parámetro mas.
Dice que la generalización es eso mismo, añadir un parámetro mas a la función, haciéndola mas general.
Ejemplo, si tenemos una función que dibuja un cuadrado siempre del mismo tamaño y añadimos un parámetro que le diga
cuanto mide el lado.

En caso de POO, esto parece que es la herencia.

Bien vayamos a otro ejemplo.

Suponer que tenemos el objeto perro y creo una instancia de perro llamada Coco.
Perro es una generalización de Coco

Entonces encuentro una similitud de estas dos palabra, generalización y herencia, pero no se si es del todo correcto.

Otro ejemplo.

Citar:

La generalización es la propiedad que permite compartir información entre dos
entidades evitando la redundancia. En el comportamiento de objetos existen con
frecuencia propiedades que son comunes en diferentes objetos.


Es Herencia, según esto.

Ahora vamos a lo que dice el diccionario de la RAE:

Citar:

1. tr. Hacer algo público o común. U. t. c. prnl.
2. tr. Considerar y tratar de manera general cualquier punto o cuestión.
3. tr. Abstraer lo que es común y esencial a muchas cosas, para formar un concepto general que las comprenda todas.


Saludos
 




===================
Gambas Básico
"No es un bug, es una característica no documentada"
 
última edición por Shell el Domingo, 16 Marzo 2014, 09:46; editado 1 vez 
Shell - Ver perfil del usuarioEnviar mensaje privadoVisitar sitio web del usuario 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Termino Generalización.POO 
 
No es lo mismo, aunque se parece. Generalización "amplía" la clase, herencia "utiliza" la clase.
Siguendo el ejemplo del perro: La clase "Coco" especifica más detalles de tu perro por ejemplo la propiedad dueño, o vacunas o lo que sea. Propiedades que no tienen cabida en la clase genérica "perro" (hay perros no vacunados, hay perros vagabundos, salvajes, etc) Digamos que la clase coco hereda de "Perro" y de "Dueño", que es el que de verdad tiene un domicilio, etc.
Parece que amplía la clase perro, pero en realidad no es así, el perro sigue siendo el perro "per se".

Dentro de las funciones, el parametrizar los elementos utilizados sí es una generalización, por cuanto la función te sirve cada vez más en más contextos.
Un ejemplo: Imagina una función que te devuelve un campo de una tabla de una base de datos. Algo así como:

Public sub getfield( strTabla as string, strCampo as string, vClave as variant) as Variant
 


Es evidente que tal función hará uso de una instancia de la clase Connection... Yo, en mis aplicaciones, sólo utilizo una instancia de Connection para cada base de datos, que declaro pública en un módulo y ya está. Ok.
Con mencionarla dentro de la función es suficiente. Ok.
Pero si añado el parámetro
Public sub getfield( strTabla as string, strCampo as string, vClave as variant, Optional hConn as Connection) as Variant

if not hconn then hConn = mComun.hCon ' la conexión general de la aplicaicón
 

He "Generalizado" la función. Hace lo mismo de antes, pero ahora vale para cualquier aplicación y para cualquier base de datos.
(Hacer notar que declaro optional el parámetro por pura vaguería de seguir usando una "por defecto". Esto, soy consciente, limita la "generalización", por cuanto obliga a que exista el mcomun.hcon o se generaría un error, pero para mí, como en mis aplicaciones siempre existe tal módulo y tal parámetro... pus me vale.)
 



 
última edición por shordi el Domingo, 16 Marzo 2014, 11:54; editado 3 veces 
shordi - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Termino Generalización.POO 
 
Shordi:

Desde luego generalizarla no tiene que ser nada sencillo, sin tener que modificar parte del cuerpo de la función e
ir ampliando con otras funciones que llaman a la primera.

En parte parece que es aprovechar la misma función ampliándola para que tenga nuevas posibilidades.

Si antes la función dibujaba cuadrados de lado de tamaño fijo, se la ha cambiado para que pueda tener lados de tamaño
variable. Luego se la puede cambiar para que dibuje polígonos,etc,etc.

Saludos
 




===================
Gambas Básico
"No es un bug, es una característica no documentada"
 
Shell - Ver perfil del usuarioEnviar mensaje privadoVisitar sitio web del usuario 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Termino Generalización.POO 
 
Citar:
Si antes la función dibujaba cuadrados de lado de tamaño fijo, se la ha cambiado para que pueda tener lados de tamaño
variable. Luego se la puede cambiar para que dibuje polígonos,etc,etc.

Bueno... para mí eso es ampliarla, no generalizarla. Si hace poligonos ya no es la función de antes y el código que la usa posiblemente deba ser modificado... pero a lo mejor la distinción no es más que semántica.
 



 
shordi - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Termino Generalización.POO 
 
Shell y Shordi:

Citar:
Desde luego generalizarla no tiene que ser nada sencillo, sin tener que modificar parte del cuerpo de la función e ir ampliando con otras funciones que llaman a la primera.
En parte parece que es aprovechar la misma función ampliándola para que tenga nuevas posibilidades.
Si antes la función dibujaba cuadrados de lado de tamaño fijo, se la ha cambiado para que pueda tener lados de tamaño variable. Luego se la puede cambiar para que dibuje polígonos,etc,etc.


Hay un patrón de diseño que se usa para lo que comentais.

Es el patrón Bridge  (http://jsbsan.blogspot.com.es/2013/...-dibujando.html)

La ventaja que tiene es que puedes cambiar el comportamiento de la función  "sin modificar el cuerpo de la función",  simplemente añadiendo clases  (por ejemplo que dibuje con un ancho determinado, que dibuje con un tipo de linea punteado, que dibuje con un color determinado, etc...)

Todo ello, lo hace sin modificar la función, y además lo puedes hacer dinámicamente!! (osea puedes cambiar el comportamiento de la función durante la ejecución).

El ejemplo que pongo en el blog, es es de dibujar punteado o dibujar normal.
La funcion ".dibuja" no cambia,  pero la forma de dibujar la podemos cambiar:

Public Sub dibujandoCirculo()
 
  Dim circu As Circulo
  Dim dp As New DibujandoPuntueado 'en vez de DibujandoPunteado, pensad que es dibujar cuadrado de lado fijo
  Dim dn As New DibujandoNormal ' en ez de DibujandoNormal, pensad que es dibujar cuadro lado variable
 
  circu = New Circulo(dp)
  circu.Dibuja()
 
  circu = New Circulo(dn)
  circu.Dibuja()
 
End


Si quisieramos añadir  "DibujandoRayaPunto", simplemente definiriamos esa nueva clase y la añadimos...

Public Sub dibujandoCirculo()
 
  Dim circu As Circulo
  Dim dp As New DibujandoPuntueado
  Dim dn As New DibujandoNormal
  Dim dRP as New DibujandoRayaPunto
 
  circu = New Circulo(dp)
  circu.Dibuja()
 
  circu = New Circulo(dn)
  circu.Dibuja()


  circu=new Circulo(dRP)
  circu.Dibuja()
 
End


Veis que sigo usando el método Dibuja(), pero genera distintos resultados.

Nota:
Para comprender el ejemplo que pongo, hay que leerse completamente el post del patron brigde (enlace)
 




===================
Blog personal
Web: SoloGambas seleccion de articulos dedicados a Gambas
Visita el Curso de Gambas3 ¡¡¡Gratuito!!!
 
jsbsan - Ver perfil del usuarioEnviar mensaje privadoVisitar sitio web del usuario 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Termino Generalización.POO 
 
Ups. Me he quedado en los patrones creacionales,aun...  


Saludos
 




===================
Gambas Básico
"No es un bug, es una característica no documentada"
 
Shell - Ver perfil del usuarioEnviar mensaje privadoVisitar sitio web del usuario 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Termino Generalización.POO 
 
Citar:
La ventaja que tiene es que puedes cambiar el comportamiento de la función  "sin modificar el cuerpo de la función",


Pues yo veo que sí lo has modificado. Ahora creas una instancia y la llamas desde dentro de la función, por lo tanto ya no es la misma función aunque se llame igual.

Creo que son conceptos diferentes y que os estáis yendo por los cerros de Úbeda.

Cuando se habla de generalización, simplemente se está diciendo que las clases padre tienen que ser generales y tener solamente los atributos necesarios para que clases derivadas no tengan que repetirlos. Entonces, las clases derivadas ya no serán tan generales, sino más especializadas. Ni más ni menos. La herencia es algo intrínseco en POO, pero no explica la generalización en sí misma.

Saludos
 




===================
Jesús Guardón

Por favor, usemos el corrector ortográfico antes de pulsar el botón "Enviar".

"uo ǝs ʇɐu pıɟıɔıן ɐdɹǝupǝɹ ɐ dɹoƃɹɐɯɐɹ, soןo ɥɐʎ bnǝ dɹodouǝɹsǝןo"
 
jguardon - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Termino Generalización.POO 
 
jguardon:

Citar:
Pues yo veo que sí lo has modificado. Ahora creas una instancia y la llamas desde dentro de la función, por lo tanto ya no es la misma función aunque se llame igual.

Si, se modifica el PROGRAMA PRINCIPAL "DibujandoCirculo", pero no la función interna "DIBUJA()".
El programa principal,  debe de cambiar porque se ha añadido un nuevo requerimiento: "dibujandoRayaPunto"

Citar:
si tenemos una función que dibuja un cuadrado siempre del mismo tamaño y añadimos un parámetro que le diga cuanto mide el lado.

Si lo hacemos en plan "funcional": la función "DIBUJA()" cuadrado tendríamos que modificar su algoritmo interno, para que actué de forma diferente según el número de parámetros. Si no recibe ningún parámetro sigue dibujando el cuadrado del mismo tamaño, si recibe un parámetro entonces dibuja el cuadrado sabiendo la medida del lado.

Pero usando el patrón,  no cambio el algoritmo de dibujar de la función "cuadrado siempre del mismo tamaño", sino añado otra forma de dibujar "cuadrado dado un lado".

Para compararlo correctamente, habría que ver como se modificaría el programa completo sin usar el patrón y usándolo.
 




===================
Blog personal
Web: SoloGambas seleccion de articulos dedicados a Gambas
Visita el Curso de Gambas3 ¡¡¡Gratuito!!!
 
jsbsan - Ver perfil del usuarioEnviar mensaje privadoVisitar sitio web del usuario 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Termino Generalización.POO 
 
Me hago viejo...
 



 
shordi - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Termino Generalización.POO 
 
Acabo de montar un ejemplo (2 programitas) para que se pueda apreciar mejor lo que he comentado:

Descarga: enlace

El programa DibujandoCuadradoFuncional, lo hace en modo funcional, la función "dibuja()", según el número de parámetros, dibuja el cuadrado:

Public Sub dibuja(Optional lado As Integer, Optional girado As Integer)
  
  If lado = 0 And girado = 0 Then
    TextArea1.text &= "Dibujo un cuadrado con lado fijo\n"
  Else
    If lado <> 0 And girado = 0 Then
      TextArea1.text &= "Dibujo cuadrado con un lado de " & Str$(lado) & " unidades\n"
    Else If girado <> 0 Then
      TextArea1.text &= "Dibujo cuadrado girado  " & Str$(girado) & " angulos\n"
      
    Endif
  Endif
  
End

Como veis, este algoritmo de la función dibuja() a medida que se irian añadiendo  más formas de dibujar, va aumentando en complejidad (un montón de If...Then anidados) y por lo tanto, a la larga será más díficil de ampliar con más opciones,  de mantener y corregir errores.
Nota:
En vez de usar If.. Then, se puede usar Select Case... y funciones especificas para cada forma de dibujo,  (sería una optimización del uso de If... then anidados) pero esto tiene el mismo problema a la hora de ampliar y de mantener


Ahora pasamos al otro método usando el patrón brigde:
El programa "DibujandoCuadradoOrientadoAObjetosPatronBrigde", vemos que se van añadiendo clases para decir como dibujamos, y al cuadrado se le asigna una de ellas (.setFormaDeDibujar(xxxx) ) cuando ya sabemos como debe de ser dibujada (al pulsar el botón de cualquiera de las opciones).

Como veis, es muy sencillo ir añadiendo más formas de dibujar, simplemente añadiendo una clase nueva (que herede de la clase interface "dibujo") que defina la nueva forma de dibujar, sin necesidad de tocar a las ya existentes, siendo estas clases independienes una de otras.
Con lo cual es más fácil de mantener y corregir errores el pograma, al ser todo independiente.

 poo_brigde

Otras ventajas:
- Un mismo cuadrado puede ser dibujado de distinta forma, según se la asignemos con .setFormaDeDibujar(xxxx)
- Podemos ampliar a otras figuras (cuadrado, circulos, elipses), y seguir usando la misma metodologia.
 En el ejemplo que publique en el blog (enlace), hace referencia a dibujar dos tipos de figuras circulos y rectangulos y ambas a su vez tiene dos métodos de dibujo (DibujoNormal y DibujoPunteado)

Saludos
 




===================
Blog personal
Web: SoloGambas seleccion de articulos dedicados a Gambas
Visita el Curso de Gambas3 ¡¡¡Gratuito!!!
 
jsbsan - Ver perfil del usuarioEnviar mensaje privadoVisitar sitio web del usuario 
Volver arribaPágina inferior
Mostrar mensajes anteriores:    
 
Ocultar¡Este tema fue útil?

 

Elegir valoración:                       

Media de valoración Valoración mínima Valoración máxima Número de valoraciones
0.00 0 0 0
 
OcultarTemas parecidos
Tema Autor Foro Respuestas último mensaje
No hay nuevos mensajes Ayuda Con El Termino "transaction" cmunpal Bases de Datos 1 Jueves, 08 Septiembre 2011, 23:56 Ver último mensaje
jguardon
No hay nuevos mensajes Termino. Biblioteca, Librería Shell General 6 Sabado, 06 Abril 2019, 11:29 Ver último mensaje
Shell
 

Publicar nuevo tema  Responder al tema  Página 1 de 2
Ir a la página 1, 2  Siguiente

Usuarios navegando en este tema: 0 registrados, 0 ocultos y 0 invitados
Usuarios registrados conectados: Ninguno


 
Lista de permisos
No puede crear mensajes
No puede responder temas
No puede editar sus mensajes
No puede borrar sus mensajes
No puede votar en encuestas
No puede adjuntar archivos
No puede descargar archivos
No puede publicar eventos en el calendario