Interfície i Implementació

Com a humans, estem constantment exposats a fets i les impressions que ens han fet sentir. Per fer això, tenim una estructura abstracta essencial on des de la superfície es detallen i es mostren les relacions fonamentals al treballar. Les abstraccions mostren les causes i els efectes, exposen els patrons i els marcs de treball, i separen el que és important del que no ho és. Són l'arrel de l'enteniment.

Per inventar programes, necessites se capaç de capturar les mateixes abstraccions i expressar-les en el disseny del programa.

Aquesta és la feina d'un llenguatge de programació per ajudar-te a fer-ho. El llenguatge ha de facilitar-te el procés de creació i disseny per permetre't codificar abstraccions que mostrin la forma en que treballen les coses. Ha de permetre't fer que les teves idees es concretin en el codi que escrius. Els detalls superficials no han d'amagar l'arquitectura del teu programa.

Tots els llenguatges de programació proporcionen mecanismes que ajuden a expressar abstraccions. En essencia, aquests mecanismens són formes d'agrupar detalls d'implementació, amagar-los, i donar-los, almenys en algun punt, una interfície comuna -- així com un objecte mecànic separa la seva interfície de la seva implementació, tal com il·lustra la Figura 1-1.

Figure 1-1 Interfície i Implementació

Figura 1-1 La Interfície i La Implementació

Mirant la unitat des de l'interior, com l'implementador, t'has adonat com està format i com treballa. Mirant-lo des de l'exterior, com un usuari, t'has adonat només que fa i com ho fa. Pots repassar els detalls i pensar únicament en termes del rol que la únitat juga a un nivell alt.

Les unitats principals d'abstracció en el llenguatge C són les estructures i les funcions. Ambdos, de formes diferents, amaguen l'element de la implementació:

  • En la banda de les dades del mon, les estructures de C agrupen els elements de dades dins de llargues unitats que poden enllaçar-se en entitats úniques. Mentre, el codi ha d'introduir-se dins la estructura i manipular els camps per separat, la majoria dels programes poden considerar-les com una única cosa -- no com un conjunt d'elements, sinó el que aquells elements volen representar. Una estructura pot incloure'n d'altres, així una organització complexe d'informació pot construir-se des de capes més simples.

    En C modern, els camps d'una estructura pertanyen al seu propi espai de noms -- que vol dir, que els seus noms no entren en conflicte amb elements de dades de fora de l'estructura que tinguin noms idèntics. Particionar l'espai de noms del programa és essencial per mantindre els detalls de la implementació fora de de la de la interfície. Imagina, per exemple, l'enorme treball d'assignament de noms diferents per cada peça de dades al llarg del programa i asseguran-te que els nous noms no entren en conflicte amb els vells.

  • En la banda procedimental del món, les funcions encapsulen comportaments que poden utilitzar-se repetidament sense tornar-los a reimplementar. Les dades d'element locals d'una funció, com els camps dins d'una estructura, estan protegits dins del seu propi espai de noms. Les funcions poden referenciar (cridar) a altres funcions, així ràpidament poden construir-se comportaments complexos a partir de petites peces.

    Les funcions són reutilitzables. Un cop definides, poden cridar-se qualsevol nombre de vegades sense tornar a considerar la seva implementació. Les funcions normalment més utilitzades poden recollir-se en llibreries i reutilitzar-se en moltes aplicacions diferents. Tots els usuaris l'únic que necessiten és la interfície de la funció, no el codi font.

    Tanmateix, a diferencia de les dades, les funcions no estan dividides en l'espais de noms separats. Cada funció ha de tenir un nom únic. Així com les funcions poden reutilitzar-se, el seu nom no.

Les estructures i funcinos de C són capaces d'expressar abstraccions significatives, però mantenen la diferència entre dades i operacions sobre dades. En els llenguatges de programació procedimental, les unitats més altes d'abstracció resideixen en un costat o l'altre de la divisió dades-vers-operació. Els programes que dissenyis sempre han de reflexar, en el nivell més alt, la forma com treballa l'ordinador.

Els llenguatges de programació orientats a objectes no perden cap de les virtuts de les estructures i les funcions -- ells van un pas més enllà i afegeixen una unitat capaç de fer abstracció a un nivell més alt, una unitat que amaga la interacció entre una funció i la seva informació.

Suposa, per exemple, que tens un grup de funcions que actuen en una estructura de dades en particular. Vols fer que aquelles funcions siguin fàcils d'utilitzar per, tant com sigui possible, obtindre l'estructura fora de la interfície. Així, dones unes quantes funcions adicionals per tractar les dades. Tot la feina de manipular les estructures de dades -- assignant-les, inicialitzant-les, obtenint-ne informació, modificant-ne els valors interns, mantenint-lo a l'hora i alliberant-lo -- és fa a través de les funcions. Tot el que l'usuari fa és cridar les funcions i passar'ls-hi l'estructura.

Amb aquests canvis, la estructura s'ha transformat en una senyal opaca que els altres programadors mai necessiten mirar-se. Poden concentrar-se en que fan les funcions, no com estan organitzades les dades. Has realitzat el primer pas per crear un objecte.

El següent pas és donar a aquesta idea suport al llenguatge de programació i amagar completament l'estructura de dades de manera que no calgui passar-la entre les funcions. Les dades seràn un detall de la implementació interna; tot el que s'exporta als usuaris és una interfície funcional. Com que els objectes encapsulen completament les seves dades (les amaguen), els ususris poden pensar-hi solsament en termes del seu comportament.

Amb aquest pas, la interfície a les funcions han estat molt més simples. Els que els criden no necessiten coneixer com estan implementades (quines dades utilitzen). Ara ja es pot cridar a això un "objecte".

L'estructura de dades oculta, uneix totes les funcions que hi comparteixen l'accés. Així, un objecte es més que una colecció de funcions aleatories; és un feix de comportaments que suporten unes dades compartides. Per utilitzar una funció que pertany a un objecte, primer crees l'objecte (que li dona la seva estructura interna de dades), llavors li dius a l'objecte quina funció ha d'executar. Comença a pensar en termes de que fa l'objecte, més que en termes de funcions individuals.

Aquesta progressió de pensar en funcions i estructures de dades a pensar en comportaments dels objectes és la essencia de l'aprenentatge de la programació orientada a objectes. Pot semblar poc familiar al principi, però a mida que agafis experiènciia amb la programació orientada a objectes, trobaràs que és una forma més natural de pensar les coses. Cada dia la terminologia de programació està plena d'analogies dels objectes del món real de varis tipus -- llistes, contenidors, taules, controladors, gestors d'events. Implementant aquestes coses així com programant objectes simplement extens l'analogia de forma natural.

Un llenguatge de programació pot jutjar-se pels tipus d'abstraccions que et permet codificar. No hauries de distreure't per asumptes extranys o esforçar-te per expressar-te utilitzant un vocabulari que no equival a la realitat que estàs intentant capturar.

Si, per exemple, sempre tens tendència a mantindre les dades correctes amb els procediments correctes, estàs forçat en tot moment a coneixer el programa sencer a baix nivell d'implementació. Mentre encara podries estar creant programes en un alt nivell d'abstracció, el camí des de la imaginació a la implementació pot arribar a ser una mica poc convincent -- i més i més difícils a mida que els programes es fan més grans i més complicats.

Per proporcionar un nivel d'abstracció més alt, els llenguatges de programació orientats a objectes et donen un vocabulari extens i un model més ric per programar-hi.

pàgina generada en: 0.609 segons.