Post Top Ad

Your Ad Spot

martes, 15 de septiembre de 2020

Encapsulación para piratas informáticos

 


La encapsulación introduce otra palabra elegante en su vocabulario orientado a objetos. Podrías pensar que estamos lanzando cohetes con toda la verborrea que acompaña a la programación en este estilo. De hecho, sin embargo, ¡esto no es ciencia espacial en absoluto! En realidad, es bastante sencillo si simplemente te tomas el tiempo para leer algunos buenos tutoriales, ver algunos screencasts excelentes y probar las cosas por ti mismo. En este tutorial, nos basaremos en la idea de captadores y definidores y cómo podemos usar la encapsulación para ocultar información y definir API públicas para consumidores de nuestra clase.

Hackear la Harley

En nuestro tutorial de getters y setters, tuvimos una clase que creó una motocicleta. Recuerde que al final de esa investigación, teníamos una clase pequeña que tenía dos propiedades de $ make y $ tires. También habíamos creado dos métodos de obtención y configuración dedicados para configurar de forma segura el tipo de neumáticos en nuestra motocicleta, así como para devolver el tipo de neumáticos en un formato específico. Hicimos esto uniéndonos a la lógica del getter y el setter para agregar comportamientos y verificación de datos. Descubrimos que nuestro astuto competidor ya no podía piratear nuestros neumáticos y poner la marca Cooper de bajo rendimiento en nuestra Harley ajustada para carreras. Cuando RacerX intenta hackearnos $motorcycle->setTires('Cooper'), falla. Sin embargo, ¿realmente logramos nuestro objetivo? Mmm…

Ut oh. ¿Ves eso ahí mismo? Nuestra Harley ahora luce un par de gomas miserables que conducirán a malos resultados en nuestra próxima carrera. ¿Cómo ocurrió eso? Bueno, aquí es donde entra la encapsulación. RacerX pudo continuar accediendo a nuestra propiedad directamente, porque dejamos su modificador de acceso configurado en publicWTF? ¿Qué es un modificador de acceso? Investiguemos.

  • Modificador de acceso público

    Public es el menos restrictivo, ya que dice que cualquier persona o clase puede acceder a la propiedad o al método.

  • Modificador de acceso protegido

    Protegido es un poco más seguro. Dice que solo la clase actual y cualquier hijo o subclases de la clase tendrán acceso al campo o método.

  • Modificador de acceso privado

    Finalmente tenemos Private, que es el más seguro y ofrece solo la clase actual para tener acceso al campo o método.

Ahora que tenemos un poco de definiciones para los modificadores de acceso público, protegido y privado, aplicémoslos a nuestro código y veamos qué sucede. Primero, pasaremos a una instancia protegida de neumáticos y probaremos cosas.

En nuestro código fuente cambiamos

a

Entonces aparece el competidor malintencionado e intenta cambiar nuestros neumáticos accediendo directamente a nuestra propiedad como tal

Sin embargo, ¡nos hemos protegido! ¡PHP ahora lanza una excepción a esto!

Sin embargo, nuestro enemigo corredor no se rinde rápidamente. Decide que simplemente intentará aplicar esos neumáticos Cooper a nuestra confiable Harley utilizando el método setTires setter que hemos configurado para nuestra clase. Sin embargo, recuerde que fallará miserablemente, ya que hemos incorporado algo de lógica para garantizar que esto no pueda suceder.

Actualmente tenemos neumáticos Dunlop en nuestra Harley. Sin embargo, se dice en la calle que los neumáticos Bridgestone son lo nuevo y queremos poder probarlos por nosotros mismos. ¿Podremos cambiar nuestros neumáticos a Bridgestone con éxito?

De hecho, sí, sí podemos. Al hacer uso de la encapsulación junto con un buen uso de getters y setters, hemos construido con éxito una clase que puede incluir en la lista negra ciertos tipos de neumáticos para que no se monten en nuestras llantas. Sin embargo, podemos montar los neumáticos de mejor rendimiento en cualquier momento que queramos, ya que lo permitimos en la lógica de nuestro armador.

Creemos ahora una clase para niños de nuestra clase de Motocicletas e intentemos poner y sacar los neumáticos del niño. Crearemos una clase Miniciclo que amplíe la clase Motocicleta.

Dado que la clase Miniciclo hereda de la clase Motocicleta, también podrá evitar los intentos de las personas de instalar neumáticos Cooper en sus llantas.

Sin embargo, montar un juego de neumáticos de nuestra selección aprobada de marcas funciona bien.

Creando una caja negra

Uno de los mayores puntos de venta de la programación orientada a objetos es la idea de una caja negra. Cuando decimos caja negra, lo que queremos decir es que, como consumidor de una clase determinada, no nos importa cómo completa su trabajo, siempre que lo haga con precisión y éxito. En este ejemplo del uso de getters y setters para cambiar neumáticos en una motocicleta, hasta ahora lo hemos mantenido muy simple. Sin embargo, en la vida real, probablemente haya muchos pasos para cambiar un neumático. Por ejemplo, tendríamos que dejar salir el aire de los neumáticos viejos. Entonces es posible que tengamos que luchar con un hierro para neumáticos para sacar el neumático de la llanta. Después de eso, tendríamos que hacer lo mismo para intentar colocar un neumático nuevo en la llanta, y finalmente tendríamos que inflar los neumáticos nuevos una vez que pudiéramos volver a colocarlos en las llantas. Es probable que haya incluso más pasos que ese. Piense en el dueño del equipo. No le importan todos los pasos necesarios para cambiar un neumático. Simplemente sabe que los Bridgestones son lo nuevo, así que le dice al mecánico: "Cambia los neumáticos". El dueño del equipo quiere poder simplemente dar la orden, y cuando regrese de comprar una hamburguesa en el puesto de comida, se montarán las nuevas Bridgestones. Así es como funciona la idea de una caja negra. Otro ejemplo podría ser su gerente en el trabajo. Tal vez usted trata con clientes que están teniendo problemas técnicos y su gerente quiere que usted “arregle al cliente” o “haga que desaparezcan”. Bueno, para arreglar al cliente, o hacer que desaparezca, puede ser necesario realizar diez acciones de procedimiento diferentes en un orden muy específico, y posiblemente algunas oraciones. Al jefe no le importa cómo lo haces. Solo hazlo.

Creemos esta idea en código para nuestra clase de Motocicletas.

En este fragmento de arriba, agregamos dos nuevos métodos privados. Estos métodos están destinados a ser utilizados exclusivamente por la propia Clase. Los objetos de esta clase no pueden hacer uso de ellos, ni tampoco los niños ni las subclases, ni nadie más para el caso. Estos métodos privados contienen los pasos especiales y secretos para completar un trabajo específico. En este caso, simplemente estamos ocultando la implementación del cambio exitoso de neumáticos en una motocicleta. Cuando necesitamos cambiar neumáticos, simplemente lo hacemos a través de nuestro método setTires () y las cosas siguen funcionando perfectamente. No nos importa cómo se haga, siempre y cuando se haga.

Como podemos ver arriba, nuestra capacidad para montar los neumáticos correctos sigue funcionando como un campeón. Sin embargo, pensemos en ese enemigo de RacerX que podría estar interesado en hacerle algo malicioso a nuestra motocicleta para obtener una ventaja. Tal vez piense que eliminar en secreto todo el aire de nuestros neumáticos será la clave para la victoria. Veamos qué sucede cuando alguien intenta llamar a nuestro método deflateOldTires () de forma maliciosa.

¡Boo Yeah! Verás, ¡nadie puede mirar dentro de nuestra caja negra! Debido a que este método es privado, solo la clase misma puede utilizarlo para lograr el objetivo general de la interfaz pública de esa clase.

Resumen de encapsulación para piratas informáticos

Este tutorial cubrió algunas de las formas de comenzar a implementar el comportamiento y la ocultación de información a través de la encapsulación. De hecho, esta es la regla de encapsulación en la programación orientada a objetos. Debemos ocultar tanta información y comportamiento como sea posible.


No hay comentarios.:

Publicar un comentario

Dejanos tu comentario para seguir mejorando!

outbrain

Páginas