Fundamentos de la programación orientada a objetos: abstracción

A menudo utilizamos conceptos generalizadores en la vida cotidiana para transmitir la esencia de la información sin entrar en detalles. Por ejemplo, para responder a la pregunta «¿cómo has llegado hasta aquí?», una persona puede limitarse a decir «en coche». Y todo el mundo tendrá claro que estamos hablando de un vehículo de 4 ruedas, con un motor y un habitáculo para pasajeros; la marca concreta, el color o el año de fabricación del coche no nos importan.

Tampoco le importa al usuario realmente, a la hora de trabajar con el programa, qué tipo de algoritmo se implementa en él, siempre y cuando el programa realice correctamente su tarea. Por ejemplo, se puede ordenar una lista de una docena de maneras diferentes.

Por tanto, abstracción significa proporcionar una interfaz de programación sencilla que deje ocultas todas las complejidades y detalles de la implementación.

La interfaz de programación es un conjunto de funciones que se definen en el contexto de una clase y que realizan un conjunto de acciones en función de la finalidad de los objetos. Además de estas funciones de interfaz, puede haber funciones auxiliares más pequeñas, pero sólo están disponibles dentro de la clase. De forma similar a las estructuras, existe un nombre especial para todas las funciones de una clase: se denominan métodos.

La implementación, por regla general, utiliza variables o arrays pertenecientes al objeto (según la descripción de la clase) para almacenar información. Se denominan «campos» (este término procede del hecho de que las propiedades de los objetos suelen asociarse, en una relación 1:1, con campos de entrada en la interfaz de usuario, o con campos en bases de datos, en los que puede guardarse el estado actual del objeto para restaurarlo la próxima vez que se inicie el programa).

Los campos y métodos, aunque se describen en la clase, están relacionados con un objeto específico: cada instancia tiene su propio conjunto asignado de variables, tienen valores que son independientes del estado de otros objetos, y los métodos trabajan con los campos de su instancia.

La interfaz y la aplicación deben ser independientes. Si se desea, un método de implementación debe poder sustituirse fácilmente por otro sin que ello afecte en modo alguno a la interfaz de programación. También es muy importante diseñar la interfaz en función de los requisitos de una tarea concreta, y no personalizarla específicamente para la aplicación. El desarrollador de la clase debe ser capaz de ver su creación desde dos puntos de vista diferentes: como autor de algoritmos internos y estructuras de datos, o como un exigente cliente potencial que utiliza la clase a modo de «caja negra» y su panel de control es la interfaz. Se recomienda empezar a desarrollar una clase desde la concepción de la interfaz de programación hasta la búsqueda y elección de los métodos de implementación.