2011-02-11 36 views
7

Duplicar posible:
difference between abstraction and encapsulation?¿Cuál es la diferencia entre la abstracción y la encapsulación?

¿Cuál es exactamente la diferencia entre la encapsulación y la abstracción en Java? Cualquier breve ejemplo también sería apreciado.

+4

Posibles duplicados: http://stackoverflow.com/questions/742341/difference-between-abstraction-and-encapsulation y http://stackoverflow.com/questions/3362335/difference-between-encapsulation-and-abstraction- conceptos –

+0

Corrija el error tipográfico en el título de la pregunta. Cheers –

+0

¿Es esta tarea? Si es así, por favor agregue una etiqueta de tarea. –

Respuesta

8

La abstracción y el encapsulado son dos grandes sabores que saben muy bien juntos.

La encapsulación está minimizando lo que expone al usuario de su código. Ese "usuario" puede ser el resto de tu código, o quien usa el código que publicas.

Hay algunas ventajas definitivas a la encapsulación:

  • El usuario de su código no depende de partes del programa que son propensos a cambiar. Cuando cambie su programa, no es necesario que cambie su código
  • Usted tiene más control sobre cómo su código y estado cambian a lo largo de la vida útil de su programa. Debe manejar un menor número de escenarios, y tendrá menos problemas inesperados para fijar

no sé Java, pero aquí es un pequeño ejemplo de encapsulación en C#:

public class Giraffe 
{ 
    public Giraffe(int heightInFeet) 
    { 
     this.heightInFeet = heightInFeet; 
     this.numberOfSpots = heightInFeet * 72; 
    } 

    public override string ToString() 
    { 
     return "Height: " + heightInFeet + " feet" 
      + " Number of Spots: " + numberOfSpots; 
    } 

    private int heightInFeet; 
    private int numberOfSpots; 
} 

En lugar de exponer numberOfSpots, está encapsulado dentro de la clase y expuesto mediante el método ToString.

Abstracción está utilizando puntos de extensión para permitir que la opción se posponga a una parte diferente del código exacto que se ejecuta. Esa elección podría hacerse en cualquier lugar de su programa, en otro programa o dinámicamente en tiempo de ejecución.

También hay grandes beneficios a la abstracción:

  • Cuando cambie su código que implementa una abstracción, el usuario de la abstracción no tiene que cambiar su código. Mientras la abstracción no cambie, los usuarios no tendrán que cambiar su código.
  • Cuando escribe código que usa una abstracción, puede escribir el código una vez que será reutilizable contra cualquier código nuevo que implemente esa abstracción. Puede escribir menos código para hacer más.

Una abstracción muy utilizada en C# es IEnumerable. Las listas, las matrices, los diccionarios y cualquier otro tipo de clase de recopilación implementan IEnumerable. La estructura foreach bucle y la totalidad de la biblioteca de LINQ se basan en que la abstracción:

public IEnumerable<int> GetSomeCollection() 
{ 
    // This could return any type of int collection. Here it returns an array 
    return new int[] { 5, 12, 7, 14, 2, 3, 7, 99 }; 
} 

IEnumerable<int> someCollectionOfInts = GetSomeCollection(); 

IEnumerable<string> itemsLessThanFive = from i in someCollectionOfInts 
             where i < 5 
             select i.ToString(); 

foreach(string item in itemsLessThanFive) 
{ 
    Console.WriteLine(item); 
} 

Usted puede escribir sus propias abstracciones, también:

public interface IAnimal 
{ 
    bool IsHealthy { get; } 
    void Eat(IAnimal otherAnimal); 
} 

public class Lion : IAnimal 
{ 
    public Lion() 
    { 
     this.isHealthy = true; 
    } 

    public bool IsHealthy 
    { 
     get { return isHealthy; } 
    } 

    void Eat(IAnimal otherAnimal) 
    { 
     if(otherAnimal.IsHealthy && !(otherAnimal is SlimeMold)) 
     { 
      isHealthy = true; 
     } 
     else 
     { 
      isHealthy = false; 
     } 
    } 

    private bool isHealthy; 
} 

IAnimal someAnimal = PullAnAnimalOutOfAWoodenCrate(); 

Console.WriteLine("The animal is healthy?: " + someAnimal.IsHealthy); 

Usted puede usar los dos juntos, como lo hice con IAnimal y IsHealthy. IAnimal es una abtraction, y que tiene solo un acceso get, y ningún acceso set en IsHealthy es encapsulamiento.

4

La encapsulación es para proteger sus variables o métodos miembros del mundo exterior.

La abstracción es la forma de tener una implementación específica. eso es qué implementación usar es desconocida para el usuario.

6

Estos dos conceptos son bastante diferentes.

La abstracción es la práctica de hacer una clase base 'abstracta' y luego ampliar su funcionalidad. Una clase abstracta es algo que no existe en un asunto concreto; su único propósito es extenderse. Piensa si estabas escribiendo clases para representar diferentes especies. Todas sus diferentes especies podrían extender una clase abstracta de Animal porque todos compartirían atributos comunes como animales. Sin embargo, nunca crearías un objeto Animal, porque cada animal que ves en el mundo es una ardilla, un perro o un pez ... o algún tipo de implementación concreta de esa base, la clase animal abstracta.

La encapsulación es la práctica de hacer que las variables de su clase sean privadas, y luego permitir el acceso a ellas desde los métodos get y set. El propósito de esto es separar la forma en que se accede a sus datos y la forma en que se implementa. Por ejemplo, si tiene alguna variable que tiene un requisito, cada vez que se modifique, también incrementa una segunda variable en 1, luego encapsularía esa funcionalidad; De esta forma, su código es más confiable porque no tiene que recordar adherirse a esa regla cada vez que acceda a la variable original.

Si desea ejemplos de código específicos, recomendaría hacer una búsqueda en Google, porque hay muchos ejemplos como ese disponible. Aquí hay dos:

http://www.tutorialspoint.com/java/java_abstraction.htm http://www.tutorialspoint.com/java/java_encapsulation.htm

+0

Hola, Herminator, gracias por la respuesta. ¿Podemos llamar? un DTO es un ejemplo de encapsulación. –

3

La encapsulación es parte de la abstracción. La noción de abstracción es la de crear un objeto para representar otro objeto. Normalmente, el objeto original es más complejo que la abstracción. Una abstracción es, por lo tanto, una representación, generalmente como una ayuda para la memoria, para la terminología/comunicación, etc. Piénselo de esta manera: el arte abstracto es una representación de otra cosa. Un volante, cambio de marchas y pedales 2/3 es una abstracción de cómo funciona un automóvil.

Básicamente, la abstracción le permite representar algo complejo, con muchos detalles, como algo mucho más simple. En mi opinión, esto está relacionado con 'fragmentación' en la ciencia cognitiva. No somos capaces de mantener cosas complejas en nuestra cabeza, así que simplificamos abstrayendo, luego usando la abstracción. Los patrones de diseño son otro gran ejemplo. En lugar de hablar de detalles, podemos hablar sobre el patrón Command, State o Strategy, etc.

La encapsulación forma parte de la creación/creación de una abstracción. Cuanto menor es la interfaz de un objeto, más fácil es abstraer. No necesita saber cómo funcionan un motor y una caja de cambios para conducir un automóvil, solo necesita comprender sus abstracciones (cambio de marchas y acelerador). Los detalles del motor y la caja de cambios están encapsulados (en la interfaz) para crear la abstracción.

La encapsulación es necesaria para la abstracción porque una abstacción no puede ocuparse de todos los detalles reales y la complejidad (de lo contrario no es una abstracción). Por lo tanto, la palanca de cambios es una representación (o modelo) incompleta de una caja de cambios, pero es lo suficientemente completa para el uso diario. La encapsulación se puede considerar como "ocultar detalles", que es necesaria para crear una representación más simple.

También es importante discutir el concepto de una 'interfaz'. En su mayor parte, los términos 'interfaz' y 'abstracción' son más intercambiables en este caso. Una interfaz es la parte de un sistema con el que el usuario trata o interactúa. La interfaz para un automóvil es el volante, el cambio de marchas y los pedales, etc. La abstracción produce una interfaz. No maneja directamente el motor/caja de engranajes, maneja sus respectivas interfaces.

Otra razón para la encapsulación es porque estamos tratando con un modelo/abstracción incompleto, no entendemos la complejidad total del original, y no podemos confiar en que manejemos todas las variables (porque no lo hacemos) entiendo el modelo completo). Esto es importante para el desacoplamiento, porque sin abstracción, los componentes que interactúan saben demasiado el uno del otro. Piénselo, porque cada automóvil tiene un volante, pedales y cambio de marchas, puede conducir cualquier automóvil, independientemente del tipo de motor, etc. Además, la caja de engranajes está separada del motor. De lo contrario, cada motor personalizado necesitaría una caja de engranajes personalizada.

De manera similar, una clase es una abstracción. La clase representa un modelo complejo, a través de su interfaz: los miembros públicos de la clase. Esta interfaz se crea a través de encapsulación. La clase presenta una interfaz simplificada de su implementación más compleja para sus colaboradores. También puede pensar que es una situación de 'necesidad de saber'. Los colaboradores de la clase no necesitan saber exactamente cómo funciona. Del mismo modo que no necesita saber cómo funciona un motor para conducir un automóvil.

El encapsulado, las interfaces y la abstracción desempeñan un papel fundamental en la cohesión y el acoplamiento, y por lo tanto en el mantenimiento de su código. Si no crea buenas abstracciones y viola el principio de "necesidad de saber", entonces su código se enreda, se vuelve frágil y una pesadilla para cambiar, porque no hay "memoria intermedia". El concepto OO de 'tell not not ask' también está relacionado con esto.

Cuestiones relacionadas