Ámbitos y namespaces, despacito, 3ª y última entrega

Para finalizar la entrega, vamos a ver cómo es posible anidar los namespaces, ya que es una posibilidad que tenemos como opción, pero también puede ocurrirnos que, al importar o 'includear' librerías de terceros, nos ocurra y podamos perder el control

Voy a generar una estructura de cuatro niveles de namespace.

#include <Arduino.h>

String mestoyAfuera = "¡¡ Yo me libro de todo eso !!";

namespace nivel_1 {
    int v_1 = 1;        // --- Una variable cuyo ámbito es el nivel 1

    namespace nivel_2 {

        // --- Una función cuyo ámbito es el nivel 2 dentro del nivel 1
        void fun_n2() {
            Serial.println( "Yo puedo ver a v_1 " + String(v_1) );
        }

        int v_2 = 2;    // --- Esta variable pertenece al ámbito del nivel 2


        namespace nivel_3 {     // --- ¡¡ VAMOS A PONERLE SALSA A ESTO

            /*--Una función cuyo ámbito es el nivel 3, el cual está dentro
                del nivel 2, todos ellos dentro del nivel 1
            */
            void fun_n3() {
                Serial.println( "Yo también puedo ver a v_1 " + String(v_1) );
                Serial.println( "Pero también puedo ver a v_2 " + String(v_2) );
            }

            int v_3 = 3;    // --- Supongo que ya sabes donde está esta variable

            namespace nivel_4 { // --- ¡¡ A VOLVERNOS LOCOS !!

                int v_4 = 4;    // --- La más interna de todas

                void fun_n4() {
                    Serial.println( "Yo también puedo ver a v_1 " + String(v_1) );
                    Serial.println( "Pero también puedo ver a v_2 " + String(v_2) );
                    Serial.println( "Y por supuesto a v_3 " + String(v_3) );
                }

            } // --- No te pierdas, aquí acaba nivel_4

            // --- Y aquí estamos en nivel_3

            void fun_t4() {     // --- Esta función va a tomar del nivel 4
                Serial.println( "En el nivel 4 hay v_4 " + String(nivel_4::v_4) );
            }

        } // --- No te pierdas, aquí acaba nivel_3

        // --- Y aquí estamos en nivel_2
        void fun_t34() {     // --- Esta función va a tomar del nivel 3 y 4
            Serial.println( "En el nivel 4 hay v_4 " +
                             String(nivel_3::nivel_4::v_4) );

            Serial.println( "En el nivel 3 hay v_3 " + String(nivel_3::v_3) );
        }

    } // --- No te pierdas, aquí acaba nivel_2

    // --- Y aquí estamos en nivel_1
    void fun_t234() {     // --- Esta función va a tomar del nivel 2, 3 y 4
        Serial.println( "En el nivel 4 hay v_4 " +
                        String(nivel_2::nivel_3::nivel_4::v_4) );

        Serial.println( "En el nivel 3 hay v_3 " +
                        String(nivel_2::nivel_3::v_3) );


        Serial.println( "En el nivel 2 hay v_2 " + String(nivel_2::v_2) );
    }

}   // --- Y aquí estamos fuera de todo lío

¿Te parece complicado?, pues cuando tu haces include de una librería que hace include la cual hace include de otra, sobre todo cuando reaprovechas código, es algo que puede sucederte, con namespaces o con ámbitos.
Mejor controlarlo

void fun_t1234() {     // --- Esta función va a tomar del nivel 1, 2, 3 y 4
    Serial.println( "En el nivel 4 hay v_4 " +
                    String(nivel_1::nivel_2::nivel_3::nivel_4::v_4) );

    Serial.println( "En el nivel 3 hay v_3 " +
                    String(nivel_1::nivel_2::nivel_3::v_3) );

    Serial.println( "En el nivel 2 hay v_2 " + String(nivel_1::nivel_2::v_2) );
    Serial.println( "En el nivel 1 hay v_1 " + String(nivel_1::v_1) );
}


void setup() {
    Serial.begin(9600);

    // --- Sólo para no volvernos locos
    using namespace nivel_1;
    using namespace nivel_2;
    using namespace nivel_3;
    using namespace nivel_4;


    fun_n2();
    fun_n3();
    fun_n4();

    fun_t4();
    fun_t34();
    fun_t234();
    fun_t1234();

}


void loop()
{
    
}

Y ahora te propongo un ejercicio personal:

  • ¿Puedes usar los using namespace para reducir los println?
  • ¿Que pasa si cambiar el orden de las líneas 106 a 109?
  • ¿Por qué no tomas toas las variables v_1, v_2, v_3 y v_4 ya les cambias
    el nombres a todas por, no se, pongamos npi, a ver que pasa?

Si esto lo controlas, tienes más posibilidades de entender los objetos y la herencia de los mismos, de hecho es el camino que yo tomé para aprenderlo cuando lo estudie.

Un saludo, y como siempre el sketch abajo para su descarga

AmbitonotanSencillo.ino (4.33 KB)

¡Muy buen aporte!
Gracias @TonyDiana

Si sirve para algo y para alguien, me alegro, gracias a ti por comentar y por contestar mis preguntas aveces tontas, jejeje

A mi me sirve y mucho.
Si con uno alcanza, date por satisfecho.

Espero otro tutorial con más detalles, por ejemplo, por que tu madre es más famosa en el pueblo que tu padre. Jajaja