✨ Continuemos con el desarrollo este día. Cada vez conoces mas de Sui y Sui Move, es por ello que poco a poco estos temas serán mas simples de entender, evaluar y asimilar.

Ya casi llegamos a la mitad 🔥

<aside> ❓ Recuerda que en el discord de Zona Tres resolvemos tus dudas en el canal de #preguntas. No dudes de utilizar este espacio para avanzar

</aside>

🧠 Objetivos de aprendizaje del día

El día de hoy deberás ser capaz de lo siguiente:


Objects vs Dynamic objects

Que pasa si manejamos bastantes campos dentro de nuestros objetos o simplemente tenemos algunos que no utilizamos tanto. Sui Move tiene la opción de crear objetos dinámicos en los cuales a través de funciones pueda crear o eliminar campos dentro de mis objetos. Estos pueden ser:

Añadiendo un dynamic object

Definimos las siguientes estructuras:

// Parent struct
    struct Parent has key {
        id: UID,
    }

    // Dynamic Field child struct type containing a counter
    struct DFChild has store {
        count: u64
    }

    // Dynamic Object Field child struct type containing a counter
    struct DOFChild has key, store {
        id: UID,
        count: u64,
    }

Integramos las API de dynamic fields y dynamic objects field asi como los metodos para añadir un nuevo campo en las estructuras:

module collection::dynamic_fields {
			
			// importamos las APIs de Sui 
      use sui::dynamic_object_field as ofield;
      use sui::dynamic_field as field;

    // Adds a DFChild to the parent object under the provided name
    public fun add_dfchild(parent: &mut Parent, child: DFChild, name: vector<u8>) {
        field::add(&mut parent.id, name, child);
    }

    // Adds a DOFChild to the parent object under the provided name
    public entry fun add_dofchild(parent: &mut Parent, child: DOFChild, name: vector<u8>) {
        ofield::add(&mut parent.id, name, child);
    } 
  }

Ademas de poder leer directamente estos campos dinámicos creados en nuestros objetos:

// Borrows a reference to a DOFChild
    public fun borrow_dofchild(child: &DOFChild): &DOFChild {
        child
    }

    // Borrows a reference to a DFChild via its parent object
    public fun borrow_dfchild_via_parent(parent: &Parent, child_name: vector<u8>): &DFChild {
        field::borrow<vector<u8>, DFChild>(&parent.id, child_name)
    }

    // Borrows a reference to a DOFChild via its parent object
    public fun borrow_dofchild_via_parent(parent: &Parent, child_name: vector<u8>): &DOFChild {
        ofield::borrow<vector<u8>, DOFChild>(&parent.id, child_name)
    }