Analizando el patrón "Módulo" en JavaScript

Muchos lenguajes de programación tienen mecanismos para ocultar, por ejemplo, métodos y propiedades de clases. JavaScript no tiene herramientas integradas que permitan, sin esfuerzo adicional, lograr tales efectos. Sin embargo, tales cosas pueden ser imitadas usando otras características del lenguaje.

imagen

El material, cuya traducción publicamos hoy, está dedicado al análisis del patrón de diseño "Módulo", que le permite ocultar información privada en los cierres, dando acceso solo a lo que el desarrollador decidió hacer público. Este artículo está destinado principalmente a programadores principiantes, a aquellos que parecen estar familiarizados con cosas como cierres y IIFE, pero que aún no los han usado con mucha confianza.

IIFE


Puede controlar el alcance de las variables en JavaScript utilizando el patrón "Módulo". Para crear un ámbito privado, puede usar el cierre. Como sabe, las funciones crean su propio alcance, cuyo contenido está separado del alcance global:

(function () { //      })(); 

Ante nosotros está la llamada función de auto-invocación ( IIFE , Expresión de función invocada inmediatamente, llamada inmediatamente expresión funcional). Dicha función se ejecuta inmediatamente después de su declaración. Es conveniente utilizar tales funciones para resolver un problema determinado que debe resolverse solo una vez, sin dejar nada superfluo en el ámbito global. Dentro de esta función (así como dentro de otras funciones) se crea un ámbito privado, inaccesible desde el exterior. Es decir, si se declara otra función dentro de este ámbito, luego de que se ejecute IIFE, no será posible acceder a ella.

 (function () { var myFunction = function () {   //     }; })(); 

Ahora intentemos acceder a la función myFunction desde el texto principal del programa:

 myFunction(); // Uncaught ReferenceError: myFunction is not defined 

Como puede ver, como se esperaba, esta llamada conduce a un error. Esto nos dice que esta función no está disponible en el ámbito desde el que intentamos acceder a ella. De hecho, no se hace nada útil en los dos ejemplos anteriores. Necesitamos estos ejemplos solo para prepararnos para el análisis del patrón "Módulo".

Devolver un objeto del módulo IIFE y API


¿Cómo asegurarse de que todavía se puede acceder a una función declarada dentro de otra función? De hecho, de lo que vamos a hablar ahora es del patrón "Módulo". Considere el siguiente ejemplo.

 //   var Module = (function () { return {   myMethod: function () {     console.log('myMethod has been called.');   } }; })(); //      Module.myMethod(); 

Puede notar que aquí se usa el mismo IIFE que antes, pero ahora la función devuelve un objeto con un método, al que se puede acceder desde el ámbito global. Naturalmente, este método no puede ser llamado. Cabe señalar que en este ejemplo no usamos las capacidades de cierre, hablaremos de esto a continuación.

Un objeto devuelto por IIFE es un objeto ordinario que puede tener muchos métodos y propiedades. Forman una interfaz pública o API de módulo.

 //   var Module = (function () { return {   myMethod: function () {   },   someOtherMethod: function () {   } }; })(); //      Module.myMethod(); Module.someOtherMethod(); 

Variables privadas y funciones almacenadas en el cierre.


Ahora es el momento de hablar sobre funciones y variables privadas. Por ejemplo, pueden ser algunas funciones auxiliares que aseguran el funcionamiento de los mecanismos internos del módulo.

Estas pueden ser variables temporales, o variables que desempeñan el papel de almacenamiento de ciertos datos, cuyo acceso queremos controlar estrictamente. Estamos interesados ​​en tal módulo de dispositivo, cuando solo lo que debería estar disponible para el mundo exterior, y todo lo demás está oculto. De hecho, todo lo que, en nuestro ejemplo, se declarará fuera del objeto devuelto por IIFE se volverá privado.

 var Module = (function () { var privateMethod = function () { }; return {   publicMethod: function () {   } }; })(); 

El método publicMethod de este ejemplo se puede llamar desde el exterior, pero la función privateMethod no privateMethod , porque está en un ámbito privado, en un cierre. Son precisamente esas funciones, inaccesibles desde el exterior, las que pueden servir como mecanismos auxiliares de los módulos. Se pueden usar para administrar estructuras de datos internas, para hacer algunas llamadas a ciertos servicios y en otras situaciones.

Al trabajar con tales funciones, debe tener en cuenta que se puede acceder a ellas desde otras funciones declaradas en el mismo ámbito, incluidos los métodos del objeto devuelto por IIFE, e incluso después de que el comando return devuelve ese objeto . Es decir, los métodos públicos tienen acceso a funciones privadas, pueden interactuar con ellos, pero en el ámbito global, estas funciones privadas no están disponibles.

 var Module = (function () { var privateMethod = function () { }; return {   publicMethod: function () {     //       privateMethod,      :     // privateMethod();   } }; })(); 

Gracias a esto, podemos proteger el código de interferencias no autorizadas y proteger el alcance global de la contaminación. Si esto no se hace, entonces, por un lado, el funcionamiento de los mecanismos internos de los módulos puede interrumpirse accidental o deliberadamente, debido a que el código externo se refiere a funciones o variables a las que no debe acceder. Por otro lado, si no utiliza el enfoque descrito aquí, muchas cosas innecesarias caen en el ámbito global, lo que, por ejemplo, puede conducir a conflictos de nombres.

Aquí hay un ejemplo de un objeto devuelto por IIFE que contiene métodos públicos y puede acceder a funciones privadas:

 var Module = (function () { var myModule = {}; var privateMethod = function () { }; myModule.publicMethod = function () { }; myModule.anotherPublicMethod = function () { }; return myModule; //      })(); //   Module.publicMethod(); 

Nombrar características privadas y públicas


Hay un acuerdo, según el cual al principio de los nombres de las funciones privadas se pone un guión bajo. Esto permite, solo mirando el código, comprender qué funciones son internas y cuáles están disponibles públicamente. Por ejemplo, podría verse así:

 var Module = (function () { var _privateMethod = function () { }; var publicMethod = function () { }; return {   publicMethod: publicMethod, } })(); 

Resumen


En este artículo, examinamos un patrón simple de "Módulo", que, mediante el uso de un cierre formado por una expresión funcional llamada inmediatamente y devuelto desde una expresión de objeto, le permite crear métodos públicos y funciones privadas y estructuras de datos que no se pueden operar directamente desde el exterior. Esta plantilla le permite ocultar los detalles de implementación de los módulos, protegiéndolos de cambios accidentales o intencionales, y ayuda a mantener limpio el alcance global.

Estimados lectores! ¿Utiliza el patrón "Módulo" en sus proyectos JS?

Source: https://habr.com/ru/post/es419997/


All Articles