Programación orientada a objetos en WordPress Scope

Al continuar nuestra discusión sobre la programación orientada a objetos en WordPress, debemos comenzar a hablar sobre la idea del alcance. En resumen, se refiere a la idea de que las clases pueden controlar cómo se accede a sus atributos y funciones (o si se puede acceder a ellas o no).

Esta es otra idea central de la programación orientada a objetos, después de la cual deberíamos estar en buena forma para comenzar a trabajar en un complemento de WordPress real..

Antes de seguir adelante, tenga en cuenta que cada artículo de esta serie se basa en el anterior, por lo que si se está uniendo a nosotros, asegúrese de consultar los artículos anteriores de la serie:

  1. Una introducción
  2. Las clases
  3. Los tipos
  4. Estructuras de control: sentencias condicionales
  5. Estructuras de control: Bucles
  6. Funciones y atributos

Una vez que todos estén al día, continuemos nuestra discusión sobre la última parte del paradigma necesario para que entendamos antes de comenzar con la aplicación práctica de la programación orientada a objetos dentro de WordPress..

Definiendo el alcance

Según la Wikipedia, la primera definición de alcance es la siguiente:

En la programación de computadoras, el alcance de un enlace de nombre, una asociación de un nombre a una entidad, como una variable, es la parte de un programa de computadora donde el enlace es válido: donde el nombre puede usarse para referirse a la entidad. En otras partes del programa, el nombre puede referirse a una entidad diferente (puede tener un enlace diferente), oa nada en absoluto (puede estar sin consolidar).

A menos que seas un programador experimentado, esto es un poco confuso, ¿no es así? De hecho, incluso puede leerse como un poco de jerga.

Pero está bien porque el propósito de este artículo es proporcionar una definición de trabajo, así como algunos ejemplos prácticos de cómo se ve dentro del contexto de un programa..

Entonces, antes de ver los tres aspectos diferentes del alcance en la programación orientada a objetos, formulemos una definición más clara. 

En resumen, el alcance se refiere a cómo se puede acceder a las variables y funciones desde objetos de terceros u objetos secundarios dentro del programa. 

Por ejemplo, digamos que usted tiene una Entrada en el blog objeto y un Autor objeto. A continuación, digamos que el Autor tiene atributos para nombre de pila y apellido y el Entrada en el blog quiere acceder a ellos para, por ejemplo, mostrarlos en la pantalla.

Quizás una ilustración de alto nivel ayudaría:

En este post, el Entrada en el blog está solicitando información de nombre de la Autor clase. Observe que en el diagrama anterior, el nombre de la clase está en el primer blog, los atributos en el segundo bloque, y luego los terceros bloques vacíos generalmente se reservan para las funciones.

Pero eso está más allá de la, Ejem, alcance de este artículo.

Recuerde: las clases normalmente representan sustantivos, los atributos representan adjetivos y las funciones representan verbos o acciones que el objeto puede realizar. Para ese fin, las clases normalmente encapsulan su información en formas estratégicas tales que cómo Su trabajo se mantiene oculto y qué Lo que pueden hacer es demostrado por sus funciones públicamente disponibles..

Para hacer esto, las variables y funciones deben tener un cierto alcance que otorgue a otros objetos acceso a su información. Este tipo de objetos incluye objetos de terceros que desean aprovechar los datos representados por una clase, y otro tipo de objeto representa un objeto que hereda información de esa clase.

La herencia está más allá de lo que vamos a cubrir en este artículo en particular; Sin embargo, cubriremos esto un poco más adelante en la serie para aquellos que son completamente nuevos en la programación orientada a objetos..

Así que, dicho esto, estamos listos para echar un vistazo a un ejemplo práctico de alcance que incluye cómo lo hemos estado utilizando hasta ahora en la serie y cómo afecta a las decisiones de diseño en el futuro..

Todo sobre lo público, lo privado y lo protegido.

El manual anterior debería haber explicado, al menos en un nivel alto, qué alcance es y qué importancia tiene, pero si no es así, quizás las siguientes secciones.

Específicamente, vamos a echar un vistazo a cada uno de los tipos de alcance que pueden tener las variables y las funciones, vamos a explicar lo que significa cada una, y luego vamos a explicar cuándo querría usar cada uno de ellos.

Antes de seguir adelante, tenga en cuenta que la público, protegido, y privado Las palabras clave se pueden utilizar para definir ambos atributos. y funciones Esto es importante porque las reglas que se aplican a los atributos también son aplicables a las funciones.

Dicho esto, echemos un vistazo a cada una de las palabras clave..

Público

Simplemente pon, público atributos y funciones están disponibles para cada tipo de objeto que intenta acceder a la variable o la función.

Por ejemplo:

primer_nombre = $ nombre;  función pública set_last_name ($ nombre) $ this-> last_name = $ nombre;  función pública get_first_name () return $ this-> first_name;  función pública get_last_name () return $ this-> last_name;  // Otros detalles de la clase ...

Dada esta configuración, cualquier objeto que llame a una instancia de este objeto no solo puede acceder al $ first_name y $ last_name atributos, pero también puede cambio ellos. Del mismo modo, cualquier objeto que llame a una instancia de objeto, puede acceder a las funciones para recuperar el nombre y cambiar el nombre..

Entonces, surge la pregunta: ¿cuál es el punto de tener estas funciones si el atributo se hace público? Quiero decir, es redundante, ¿no? Sí. Y lo contestaremos más adelante en el artículo una vez que hablemos del tema. privado palabra clave.

Protegido

Siguiente, protegido los atributos y las funciones están disponibles dentro del contexto de la clase en la que están definidos, pero no Para objetos de terceros. Dicho esto, ellos Pueden ser llamados desde dentro de su propia clase, pero no de clases externas.

primer_nombre = $ nombre;  función protegida set_last_name ($ nombre) $ this-> last_name = $ nombre;  función protegida get_first_name () return $ this-> first_name;  función protegida get_last_name () return $ this-> last_name;  // Otros detalles de la clase ...

Pero hay una excepción: las subclases.. 

Por ejemplo, digamos que usted define una clase llamada Contribuyente que es una subclase de Autor, esto significa que el Contribuyente tiene acceso a todos del protegido (y público) atributos y funciones de su clase padre.

Dado el código anterior, esto significa que puede llamar a métodos como get_first_name () desde dentro del Autor clase o dentro de la Contribuyente clase pero no de cualquier clase externa.

Es cierto que las subclases tienen más que ver con la herencia, que es algo de lo que hablaremos más adelante en la serie; Sin embargo, menciono esto para proporcionar una aclaración importante entre público atributos y funciones y privado atributos y funciones.

Privado

en breve, privado los atributos y funciones bloquean los atributos y funciones en la clase en la que se definen. Esto significa que ningún objeto externo o subclases puede acceder alguna de la información.

Claramente, esta es la forma más estricta de alcance, pero no debe leerse como si fuera algo malo (o algo bueno). En su lugar, está destinado a proporcionar una forma para que cierta información permanezca oculta (o abstraída) dentro del contexto de la clase en la que se define..

Volviendo a nuestro primer ejemplo, echemos un vistazo a cómo podemos refactorizar la clase de modo que proporcione la cantidad máxima de utilidad tanto para las clases externas como para las subclases..

primer_nombre = $ nombre;  función privada set_last_name ($ nombre) $ this-> last_name = $ nombre;  función privada get_first_name () return $ this-> first_name;  función privada get_last_name () return $ this-> last_name;  // Otros detalles de la clase ...

En primer lugar, este ejemplo demuestra un mal uso de la privado palabra clave. 

En este ejemplo, no solo los atributos son inaccesibles, sino que tampoco se puede acceder a las funciones. En otras palabras, para otros objetos en "el mundo exterior", esta clase parece no tener nada disponible. Peor aún, ni siquiera las subclases pueden acceder a esta información..

En resumen, el código realmente no tiene sentido.

Por lo tanto, vamos a refactorizar esto un poco, pero es más que el atributo permanece oculto (y, por lo tanto, inaccesible para los objetos de terceros), y especificaremos una forma para que los objetos de terceros recuperen los nombres, pero solamente Permitir que la clase actual y sus subclases las cambien:

nombre de pila;  función pública get_last_name () return $ this-> last_name;  // Otros detalles de la clase ...

Por supuesto, esto es solo un ejemplo. Obviamente, estamos omitiendo algunos de los detalles de implementación de tal manera que no saber qué detalles pueden requerir, digamos, los nombres que se actualizarán. 

Pero no importa: Esto muestra un ejemplo completo de cómo privado, protegido, y público Los aspectos del ámbito de una clase pueden trabajar en conjunto para proporcionar una forma segura y estratégica de acceder a la información..

Abstracción y ocultación de información

En lo que se refiere al ámbito, puede argumentar que todo se reduce a la abstracción y al ocultamiento de la información.. 

Es decir, que las clases (que son planos para el objeto, si recuerdas de nuestros artículos anteriores) deben organizar estratégicamente su información de manera que:

  • información que debería solamente Ser accesible y relevante para ello debe permanecer. privado
  • La información que debe ser accesible por sí misma y sus subclases debe estar protegida.
  • La información que debe ser accesible por objetos de terceros debe ser pública.

De hecho, iré un paso más allá y diré que no es probable que vea muchos atributos marcados como público. En cambio, es más probable que veas los atributos marcados como protegido - a efectos de subclasificación - o privado, de modo que sus datos puedan ser gestionados por funciones que estén sujetas apropiadamente. 

Inicialmente, esto suena relativamente simple, ¿verdad? Y el concepto en sí no es terriblemente complicado, pero cuando se trata de construir sistemas que dependen de una serie de objetos diferentes, todos trabajan juntos para proporcionar una abstracción sólida, interfaces limpias mediante las cuales clases y subclases de terceros pueden interactuar con él, y formas eficientes Al organizar la información, puede ser más desafiante: hay muchas partes móviles que considerar..

Dicho esto, esta es una de esas cosas que escribir código, interactuar con otros desarrolladores y leer código puede generar experiencia.. 

En lo que sea que valga la pena, no tengo miedo de admitir que estas siguen siendo estrategias con las que me cuesta no porque no entiendo los conceptos, sino porque intentar proporcionar la implementación de la clase más limpia posible puede ser difícil, especialmente en un sistema. eso es apto para cambiar.

Pero eso es contenido para otra publicación..

Por supuesto, si tiene preguntas o comentarios sobre cualquier tema relacionado con el tema de alcance, no dude en dejarlos en los comentarios..

Que sigue?

A partir del próximo artículo, comenzaremos a incorporar parte de esta información en una aplicación práctica de creación de un complemento de WordPress..

Entonces, para aquellos de ustedes que han estado esperando para ver cómo funciona esta serie en conjunto con WordPress, el próximo artículo debe comenzar a reunir todos los conceptos a medida que continuamos la serie con nuestro propio complemento de WordPress utilizando el concepto de programación orientada a objetos..