IIC2233-2016-02 / Syllabus

Repositorio principal del curso
29 stars 25 forks source link

Listas con varios tipos de datos #723

Closed Pyralspite closed 7 years ago

Pyralspite commented 7 years ago

Hola, tengo una duda con UML y listas en general. En la práctica, python permite hacer cosas como

class Clase:
    def __init__(self):
        self.lista = []

    def agregar(self, cosa):
        self.lista.append(cosa)

clase = Clase()
clase.agregar('string')
clase.agregar(1)
clase.agregar(0.5)

Pero al momento de hacer el diagrama de clases, tengo dudas sobre como definir el atributo lista y el método agregar. Estaba pensando en hacerlo con object:

Clase
-----------------
+ lista: object[]
-----------------
+ agregar(cosa:object): None

pero no sé si sea la forma correcta. Es más, no se si sea correcto que una clase tenga como atributo una lista que almacene más de un tipo de dato. Es una mala práctica?

Aparte: Por qué otros lenguajes no lo permiten?

EDIT aaossa: Formato

ivaniadg commented 7 years ago

Hola!

Las listas son EDD ordenadas y mutables. Están pensadas para poder agregar, eliminar y acceder a elementos según su ubicación. Python no prohibe mezclar tipos de datos en una lista pero los programadores prefieren no hacerlo porque existen otras estructuras (tuplas) que son para eso. No hay muchas razones para mezclar distintos tipos en una lista, muchos casos es mejor usar otra EDD.

Otros lenguajes no lo permiten porque se declara el tipo de datos cuando se crea la lista, esto se hace para se reservar los espacios de memoria lo que la hace más eficiente. La única forma de poner diferentes tipos en haciendo upcasting, transformar los objetos a la clase base y usar esa clase como el tipo de objeto de la lista

La forma en que estás haciendo el UML está correcta. object debería ser reemplazado con el tipo de objeto que recibe. Si son distintos tipos, entonces toma la clase base en común. Si es object entonces deberías cambiar el tipo de EDD.

Pyralspite commented 7 years ago

Muchas gracias :D!