¿Cómo se usa la encapsulación para seguridad?

7

Estoy aprendiendo OOP. He estudiado mucho sobre la encapsulación, pero cuanto más leía, más me confundía.

Entiendo que ocultamos (haciendo datos privados) los datos y los exponemos al usuario de la clase (otros desarrolladores) como propiedades o métodos. También entiendo que por encapsulación ocultamos detalles.

En un artículo (http://www.csharp-station.com/Tutorial/CSharp/lesson19) leí:

Resumen del artículo

Al diseñar un objeto, debes pensar en cómo otros podrían usarlo. En el mejor de los casos, cualquier programa que utilice el objeto estaría bien diseñado y el código nunca cambiaría. Sin embargo, la realidad es que los programas cambian a menudo y en un entorno de equipo, muchas personas tocan el mismo código en un momento u otro. Por lo tanto, es beneficioso considerar qué podría salir mal así como la imagen prístina de cómo se debe usar el objeto .

En el caso del objeto BankAccount, examine la situación en la que el código que se encuentra fuera de su objeto podría acceder a un campo de Cantidad decimal o a un campo de Cadena CustomerName. En el momento en que se escribe el código, todo funcionaría bien. Sin embargo, más adelante en el ciclo de desarrollo, se dará cuenta de que el objeto BankAccount debe realizar un seguimiento de un CustomerID en lugar de la cadena CustomerName porque no desea duplicar las relaciones entre la información (o algún otro motivo válido para modificar la definición de estado interno) . Dichos cambios causan un efecto de ondulación en su código porque fue creado para usar la clase BankAccount, como se diseñó originalmente (con CustomerName como una cadena), y ahora debe cambiar el código que accede a ese estado en toda su totalidad. aplicación.

El principio de encapsulación orientado a objetos ayuda a evitar este tipo de problemas, lo que le permite ocultar el estado interno y el acceso abstracto a él a través de miembros de tipo, como métodos, propiedades e indizadores. La encapsulación lo ayuda a reducir el acoplamiento entre objetos y aumenta la capacidad de mantenimiento de su código.

Pregunta ¿Cómo ayudará la encapsulación al realizar cambios en el código y de sus efectos de ondulación? Para un miembro de datos, si cambio su tipo de int a float (incluso si estoy exponiendo esta propiedad de uso), tendré que cambiar el tipo de variable cuando ya estoy usando este código.

Guíenme amablemente cómo la encapsulación ayudará con tales cambios.

Gracias por esta ayuda y orientación.

    
pregunta haansi 17.05.2012 - 16:21

6 respuestas

8
  

¿Cómo ayudará la encapsulación al realizar cambios en el código y desde su   efectos de ondulación. Para un miembro de datos, si cambio su tipo de int a   flotar, (incluso si estoy exponiendo esto usando la propiedad) necesitaré   cambiar el tipo de variable donde ya estoy usando este código.

El beneficio de la encapsulación es que le permite cambiar la implementación interna sin romper el código del cliente. No lo protege si decide que necesita cambiar la interfaz a su código, pero eso es un asunto diferente.

Ejemplo: Supongamos que tiene un valor que representa el precio por unidad de algún producto básico. El precio se expresa en centavos, y como no se trata en centavos fraccionarios, decidió convertir la propiedad en un entero (usaré C aquí porque no estoy muy familiarizado con C #):

int _price

int pricePerUnit(void) {
    return _price;
}

int priceForUnits(int units) {
    return units * _price;
}

Todo funciona bien hasta que un día, cuando alguien se da cuenta de que su empresa está perdiendo mucho dinero debido a errores de redondeo. Muchos de los productos que rastrea se compran y venden en muchos miles de unidades, por lo que debe comenzar a rastrear el precio con una precisión de al menos 0.001 centavo. Debido a que era lo suficientemente inteligente como para encapsular el precio en lugar de permitir que los clientes accedan a él directamente, puede hacer ese cambio rápidamente:

double _dprice

int pricePerUnit(void) {
    return (int)_dprice;
}

int priceForUnits(int units) {
    return (int)(units * _dprice);
}

La interfaz que los clientes utilizan para obtener precios sigue siendo la misma, pero ahora los datos que obtienen son más precisos. Si el precio por unidad es de $ 1.001, priceForUnits(1000000) ahora devolverá un precio que es $ 1000 mayor que antes. Eso sucede aunque no haya cambiado la interfaz de su sistema y, por lo tanto, no haya roto ningún código de cliente.

Ahora, eso no siempre es todo lo que necesitas hacer. A veces, tendrá que cambiar o aumentar su interfaz para que también pueda informar el precio con mayor precisión a los clientes:

double pricePerUnit() {
    return _dprice;
}

Un cambio como ese interrumpirá el código del cliente, por lo que, en cambio, podría mantener la interfaz anterior y proporcionar una rutina mejor y más nueva:

int pricePerUnit() {
    return (int)_dprice;
}

double accuratePricePerUnit() {
    return _dprice;
}

Usted y el resto de su equipo pueden embarcarse en el proceso de convertir a todos los clientes de su sistema para utilizar el accuratePricePerUnit() más nuevo y mejor. El código del cliente será más preciso a medida que avance en esa tarea, pero incluso las cosas antiguas deberían seguir funcionando tan bien como lo hicieron en el pasado.

De todos modos, el punto es que la encapsulación le permite cambiar la forma en que funcionan las partes internas al presentar una interfaz consistente, y eso lo ayuda a hacer cambios útiles sin romper otro código. No siempre lo protege de tener que actualizar otro código, pero al menos puede ayudarlo a hacerlo de manera controlada.

    
respondido por el Caleb 17.05.2012 - 19:46
2

En mi experiencia, la encapsulación hace que hacer lo "incorrecto" sea mucho más difícil. Puede agrupar las funciones que se unen semánticamente y aislarlas de las que pueden llevar a un comportamiento malo o impredecible. También puede ayudar a ocultar los detalles al usuario final, lo que puede ayudar a aumentar la seguridad y la confiabilidad.

Considere esta publicación de John D Cook . Considera que tienes un objeto Bread . Una cosa natural para cortar este pan. Así que escribes una función slice() , para que puedas hacerlo

slice(loaf)

con un nuevo objeto loaf que has creado. Esto tiene sentido. Pero si no tienes cuidado, puedes llamar accidentalmente

slice(finger)

con un objeto finger en algún lugar de tu proyecto. Esto podría llevar a cosas muy malas. En su lugar, encapsule esta función / método en una clase Bread para que pueda hacer esto

loaf.slice()

Esto definitivamente ayuda a evitar llamar accidentalmente finger.slice() , ya que finger probablemente no tenga un método slice() asociado.

Este es un poco de un ejemplo artificial, pero lo he encontrado útil. La encapsulación a veces puede ser un aspecto subestimado de la POO, pero es bueno.

    
respondido por el joshin4colours 17.05.2012 - 18:54
2

La encapsulación ayuda a grandes grupos de desarrolladores a coordinar su trabajo de manera más eficiente. Cada grupo de desarrolladores trabaja en módulos diferentes, y esos módulos están encapsulados: separe el código en una pequeña cantidad de operadores ampliamente disponibles cuyo uso no pueden controlar de manera estricta, y una gran cantidad de operadores internos que pueden controlar de manera estricta. Lo que esto significa es que cada grupo de desarrolladores puede definir invariants que son importantes para que mantengan sus módulos, y asegúrese de que esos invariantes se mantienen independientemente de lo que hagan los desarrolladores de otros módulos.

Dado que la encapsulación permite la conservación de invariantes, a menudo se utiliza para mantener invariantes de seguridad / seguridad, por ejemplo.

  • que nunca se accede a un almacén de datos sin las credenciales adecuadas
  • que a una cuenta bancaria nunca se le agrega más dinero del que se eliminó de otra
  • que ciertas operaciones siempre se registran

El Modelo de capacidad de objeto es una metodología para escribir código sensible a la seguridad que es la encapsulación en esteroides.

  

El modelo de seguridad se basa en no poder falsificar referencias; Ver sintetizando direcciones de actores.

     

Los objetos solo pueden interactuar enviando mensajes sobre referencias.   Una referencia puede ser obtenida por:

     
  1. condiciones iniciales: en el estado inicial del mundo computacional que se describe, es posible que el objeto A ya tenga una referencia al objeto B.   paternidad: si A crea B, en ese momento A obtiene la única referencia al recién creado B.
  2.   
  3. dotación: si A crea B, B nace con ese subconjunto de referencias de A con las que A eligió dotarlo.
  4.   
  5. introducción: si A tiene referencias tanto a B como a C, A puede enviar a B un mensaje que contenga una referencia a C. B puede conservar esa referencia para su uso posterior.
  6.   

En el modelo de capacidad de objetos, todos los cálculos se realizan siguiendo las reglas anteriores.

     

Las ventajas que motivan la programación orientada a objetos, como la encapsulación o la ocultación de información, la modularidad y la separación de preocupaciones, corresponden a objetivos de seguridad tales como la separación de privilegios mínimos y privilegios en la programación basada en capacidades.

    
respondido por el Mike Samuel 17.05.2012 - 19:10
1

La principal forma en que la encapsulación ayuda a reducir los efectos de cambio del cambio es manteniendo la mayor cantidad de detalles de implementación privados para la clase. Al limitar la interfaz solo a los miembros necesarios para usar la clase, se pueden realizar muchos cambios en la implementación sin afectar el código que usa la clase.

Ese parece ser el punto que señala el texto que citó, aunque también lo encontré un poco confuso en mi primera lectura.

    
respondido por el Jonathan Wood 17.05.2012 - 16:31
1

Creo que le permite cambiar la funcionalidad de su clase sin, aunque no siempre, introducir saltos de BC (compatibilidad binaria o de comportamiento). Es decir, puede cambiar la forma en que su clase hace "algo" sin tener que cambiar cómo el usuario final le dice que haga "algo".

El ejemplo que dio al cambiar el tipo de retorno es una ruptura de BC, porque cualquiera que haya usado su clase anteriormente no podrá usar la nueva versión sin volver a compilar. Esto es algo que debe hacerse solo como último recurso, y en un entorno profesional solo se puede hacer con la autorización de los arquitectos y una vez que se haya presentado la documentación, se haya notificado a los clientes, etc.

También le da un control completo sobre el estado de su objeto.

    
respondido por el James 17.05.2012 - 18:31
1
  

¿Cómo ayudará la encapsulación al realizar cambios en el código y de sus efectos de ondulación?

Déjame darte un ejemplo típico y simplista. Primero, supongamos que no está utilizando encapsulación: Tiene un conjunto de datos y usa una matriz para almacenar esos datos, y hay otra parte de su programa que usa esa matriz. Ahora, si en algún momento decide que una lista vinculada es una mejor opción para almacenar sus datos. Si reemplaza la matriz con la lista vinculada, ¿qué va a pasar? Su programa se interrumpirá, a menos que realice cambios en todas partes para reemplazar la lógica de procesamiento de matriz con la lógica de procesamiento de lista enlazada.

Pero, si usa OO / Encapsulación, probablemente particione su programa en clases, una que almacene los datos y otra que use los datos. En la primera clase, usted oculta su implementación (encapsulación) y expone sus servicios a través de métodos como

size()
remove(int index)
add(int index, Object o)
get(int index)

...

En este segundo caso, si cambia la implementación de la clase de almacenamiento de matriz a lista vinculada, o cualquier otra cosa, no afectará a sus clientes. Sin efecto dominó.

    
respondido por el Nazar Merza 17.05.2012 - 19:38

Lea otras preguntas en las etiquetas