[HOME PAGE] [STORES] [CLASSICISTRANIERI.COM] [FOTO] [YOUTUBE CHANNEL]

Classe (informàtica) - Viquipèdia

Classe (informàtica)

De Viquipèdia

Engranatges
Article inacabat!
Un (o més d'un) viquipedista treballa en l'edició de la present entrada, per la qual cosa és possible que trobeu defectes de contingut o de forma: a fi de coordinar la redacció, contacteu amb els col·laboradors més recents amb un missatge a la pàgina de discussió de l'article en qüestió abans de realitzar modificacions o substitucions importants.

El seu ús és temporal mentre l'usuari estigui editant l'article. No us oblideu de treure l'avís un cop estigui acabat, o bé es podrà treure després d'uns dies d'inactivitat.


En programació orientada a objectes, una classe és una construcció d'un llenguatge de programació usada per agrupar camps relacionats i mètodes. Està conceptualment relacionat amb classes de la teoria de conjunts.

Una classe és un paquet cohesionat que consisteix en un tipus concret de metadada. Descriu les regles que marquen el comportament de l'objecte; les referències a aquests objectes són fetes com a instàncies d'una classe. Una classe té tant una interfície com una estructura. La interfície descriu com es pot interactuar amb la classe i la instància a través de mètodes, mentre l'estructura descriu com es particiona la dada en camps dintre de la instància. Una classe és el tipus més específic d'un objecte en relació a una capa en concret. Una classe també pot tenir una representació (metaobjecte) en temps d'execució, que proveeix suport per manipular la metadada relativa a la classe.

Els llenguatges de programació que donen suport a les classes tenen diferències subtils en com donen suport a les diferents funcionalitats pròpies de les classes. La majoria donen suport a diferents formes d' herència. Molts llenguatges també donen suport a les funcionalitats que aporta l'encapsulació, per exemple, els especificadors d'accés.

Taula de continguts

[edita] Motius pels quals usar classes

Les classes quan es fan servir adequadament, poden accelerar el desenvolupament reduint la introducció de codi redundant, el testeig i la resolució de bugs. Si una classe ha estat testada en profunditat i se la considera com a robusta, la seva reutilització garanteix la no propagació d'errors arreu del codi. Si se'n fa una extensió, on se li afegeix nou codi, el mateix nivell de testeig de les noves parts de codi garanteixen el mateix nivell de fiabilitat de la classe resultant.

Una altra raó per fer servir classes és la de simplificar les relacions i les dades interrelacionades. Abans que escriure codi que crida repetidament la subrutina que dibuixa una finestra, és millor i més intuïtiu tractar la finestra com un objecte i dir-li que es redibuixi quan faci falta. Amb classes, els ítems GUI que són similars a finestres (per exemple, les caixes de diàleg), poden simplement heretar la majoria de les seves funcionalitats i estructures de dades de la classe de la finestra. El programador només necessita llavors afegir el codi propi de la nova classe. Efectivament, les GUIs són una possible aplicació de les classes molt comuna i molt útil i la programació GUI acostuma a ser molt més fàcil amb un bon disseny de classes.

[edita] Instanciació

Una classe és usada per crear-ne instàncies (objectes) per instaciar la classe. Les instàncies d'una classe comparteixen el mateix conjunt de propietats, encara que poden ser diferents en el seu contingut (poden tenir estats diferents). Per exemple, una classe "Persona" descriuria les propietats comunes a totes les instàncies de la classe Persona. Les persones són generalment semblants, però varien en certes propietats com l'alçada o l'amplada. La classe també definiria com es realitzen certes opcions: córrer, saltar, dormir, llençar un objecte, etc. Un dels beneficis de programar amb classes és que totes les instàncies d'una classe en particular seguirà el comportament definit de la classe que instacien.

En la majoria de llenguatges, les estructures, tal com estan definides per la classe, determinen com s'ocupa i allibera la memòria ocupada per les seves instàncies. Aquesta tècnica és coneguda com model cookie-cutter. L'alternativa a aquest model és la que es fa servir, per exemple, al Python, on els objectes estan estructurats com contenidors clau-valor associatius. I aquests models, objectes que són instàncies de la mateixa classe podrien contenir diferents variables, de manera que l'estat pot ser dinàmicament afegit a l'objecte. Això es podria semblar en certes maneres, als llenguatges basats en prototipus, però no és equivalent.

[edita] Interfícies i mètodes

Els objectes defineixen la seva interacció amb el món exterior a través dels mètodes que exposen. Un mètode, és una subrutina (funció) amb una propietat especial que té el seu accés a dades emmagatzemades en un objecte (instància). Els mètodes que manipulen les dades de l'objecte i porten a terme tasques són, de vegades, tractades com a comportament.

Els mètodes formen la interfície dels objectes amb el món exterior; els botons del frontal d'un reproductor de vídeo, per exemple, són la interfície entre els humans i el material elèctric, que hi ha dintre de la caixa que forma l'electrodomèstic. Es prem el botó d'"on" per deixar l'aparell encès o apagat. En aquest exemple, la televisió és la instància, cada mètode és representat per un botó i el conjunt de botons comprèn la interfície. En la seva forma més comuna, una interfície és una especificació d'un grup de mètodes relacionats sense cap implementació associada dels mètodes.

Cada classe implementa una interfície, proveint d'estructura (és a dir, dada i estat) i implementacions de mètodes (és a dir, proveint de codi que especifica com funcionen els mètodes). Hi ha una distinció entre la definició d'una interfície i la implementació d'aquesta interfície. En la majoria de llenguatge, aquesta línia acostuma a ser difusa. Alguns llenguatge tanmateix, aporten característiques que ajuden a separar interfícies i implementació. Per exemple, una classe abstracta pot definir una interfície sense proveïr d'implementació, mentre al llenguatge Dylan, les definicions de classe ni tan sols defineixen interfícies.

Les interfícies també poden ser definides per incloure un conjunt de funcions auxiliars, anomenades mètodes estàtics o mètodes de classe. Els mètodes estàtics, com mètodes d'instància, estan exclusivament associats amb la classe. La diferència amb els mètodes d'instància és que no treballen amb instàncies de la classe; així, els mètodes estàtics, ni requereixen una instància de la classe ni poden accedir a les dades de cap instància. Per exemple, donar la informació del fabricant d'un reproductor pot ser un mètode estàtic. Aquest mètode éstà clarament associat a la classe, encara que està fora del domini de cada instància individual de la classe.

Els llenguatges que suporten herència de classe també permeten a les classe que heretin interfícies de les classes de les que deriven. En llenguatges que suporten Classe (informàtica)#Amagar i encapsular encapsulació, es considera que la interfície d'una classe és el conjunt de mètodes i atributs públics que té (via mètodes getter i setter); se suposa que cap mètode privat o estructura interna de dades són coneguts per qui fa servir la classe i per tant no formen part de la interfície.

La metodologia de programació a objectes està dissenyada de manera que les operacions de qualsevol interfície d'una classe són fetes independents unes de les altres. Això ens aboca a disseny client-servidor (o per capes) on els servidors no depenen de cap manera dels clients. Una interfície no emplaça els clients a cap requeriment per invocar les operacions de la classe en cap ordre en particular. Aquesta tècnica té el benefici que el codi del client pot assumir d'una interfície estan disponibles per ser usades en qualsevol moment en què l'objecte apunta a una referència vàlida.

[edita] Estructura d'una classe

Donat que té una interfície, una classe conté una descripció d'estructura de dades emmagatzemades a les respectives instàncies de la classe. Les dades estan particionades en atributs (o camps, propietats membres de les dades). Tornant a l'exemple del televisor, les característiques visibles, com el tamany i si suporta color, tots junts, conformen l'estructura. Una classe representa la descripció complerta d'un televisor, incloent els seus atributs (estructura) i botons (interfície).

L'estat de les dades d'una instància està emmagatzemat en algun dispositiu, com la memòria o un fitxer. S'assumeix que l'emmagatzematge es troba en un lloc concret, on se'n pot accedir a la instància a través de referències a la identitat de les instàncies. Tanmateix, el lloc on es pot trobar en un moment donat, pot acabar variant. En aquests casos la identitat de l'objecte no canvia. L'estat està encapsulat i cada accés a l'estat es fa a través dels mètodes de la classe.

Una classe també descriu un conjunt d'invariants els quals són preservats per tots els seus mètodes. El propòsit principal dels invariants és establir. Un invariant és una restricció sobre l'estat d'una instància que ha de ser sempre satisfet. El principal propòsit dels invariants és dir quins objectes pertanyen a la classe. Un invariant distingeix tipus de dades i classes entre elles; això és, una classe no permet usar tots els possibles valors per l'estat de la instància i al seu lloc només permet els valors ben definits per la semàntica de l'ús pel qual el tipus de dades ha estat definit. Els mètodes (públics) suportats sovint estableixen una invariant de forma implícita. Alguns llenguatges de programació suporten l'especificació d'invariants com part de la definició de la classe i les forcen arreu del tipus. L'encapsulació de l'estat és necessària per ser capaç de forçar les invariants de la classe.

Alguns llenguatges permeten que la implementació de la classe especifiqui mètode constructor i destructor i permeten crear i destruir objectes de la classe. Un constructor que admet paràmetres pot ser usat per crear objectes amb dades. El propòsit principal d'un constructor és el d'establir la invariant de la classe, generant un error si l'invariant no és vàlid. El propòsit principal d'un destructor és el de destruir la identitat de l'objecte, invalidant qualsevol referència cap a ella dintre del procés. En alguns llenguatges, un destructor pot retornar un valor que pot ser usat per obtenir un representació pública (codificació de transferència) d'un objecte d'una classe i simultàniament destruir la còpia de l'objecte emmagatzemat a la meòria de l'actual fil. Els constructors i els destructors també són, de vegades, usats per reservar i alliberar, respectivament, recursos associats amb l'objecte. De vegades, els constructors i destructors estan especificats com mètodes estàtics.

Una classe pot també contenir camps estàtics o camps de classe, que contenen dades que estan especificades respecte a la classe, tot i que a part de qualsevol instància. Si la classe en sí mateixa és tratada com una instància d'una hipotètica metaclasse, els camps i mètodes estàtics serien camps i mètodes d'instàcia d'aquella metaclasse.

[edita] Representació d'una classe en temps d'execució

Com un tipus de dades, una classe acostuma a ser considerada com una construcció, en temps d'execució. Un llenguatge també pot suportar prototipus o metaobjectes factoria que representen informació en temps d'execució sobre classes o fins i tot representen metadades que proveeixen accés a funcionalitats de reflexió per manipular formats d'estructures de dades. Molts llenguatge distingeigxen aquest tipus d'informació sobre classes des d'una classe sobre la base que la informació no té per què per què ser necessitada en temps d'execució. Alguns llenguatges dinàmics no fan distincions estrictes entre construccions en temps d'execució i de compilació no tampoc no distingirien entre metaobjectes ni classes. Per exemple: si Humà és un metaobjecte que representa la classe Persona, les instàncies de Persona poden ser creades usant els recursos el metaobjecte humà.

[edita] Ocultació de la informació i encapsulació

Molts llenguatges suporten el concepte d' ocultació de la informació i encapsulació, típicament amb especificadors d'accés per mebres de la classe Els especificadors de la classe especifiquen restriccions a les quals s'hi accedirà a través d'instàncies. Alguns especificadors d'accés també controlarian com les classes hereden les restriccions. El seu primer propòsit és el de separar la interfície de la classe amb la seva implementació.

Un conjunt habitual d'especificadors d'accés (també anomenats modificadors) que suporten molts llenguatges orientats a objectes:

  • Privat: restringeix l'accés a la pròpia classe. Només els mètodes que són part de la pròpia classe poden accedir els membres privats.
  • Protected: permet que la pròpia classe i totes les subclasses hi accedeixin.
  • Public: vol dir que tots els clients poden accedir al membre pel seu nom.

Noteu que encara que molts llenguatges suporten aquests especificadors d'accés, la seva semàntica podria variar subtilment d'uns als altres.

Un ús habitual dels especificadors d'accés és el de separar les estructures internes de les dades d'una classe de la seva interfície; això vol dir que l'estructura interna és privaa. Els mètodes d'accés públics poden ser usats per inspeccionar o alterar aquestes dades privades. Els diversos llenguatges de programació orientats a objectes forcen això a diversos graus. Per exemple, el llenguatge Java no permet que el codi del client accedeixi a les dades privades d'una classe en cap cas, mentre en llenguatges com Objective-C o Perl el codi del client pot fer el que vulgui. En C++, els mètodes privats són visibles però no accessibles a través de la interfície; tanmateix acostumen a ser fet invisibles per declarar explícitament classes plenament abstractes que representen les interfícies d'una classe.

Els especificadors d'accés no necessàriament controlen la visibilitat, en tant que fins i tot el mètodes privats poden ser visibles al codi del client. En alguns llenguatges, un membre inaccessible però visible pot ser referenciat en temps d'execució ( per exmple, un apuntador cap a ell pot ser retornat per funcions seves), però tots els intents d'usar-lo referenciant el nom del membre des del client serien previnguts pel comprovador de tipus. El disseny orientat a objectes usa els especificadors d'accés en conjunció amb un disseny acurat d'implementació de mètodes publics per forçar invariants de les classes. Els especificadors d'accés han de protegir la classe contra usos accidentals dels membres des del client, però no són apters per proteccions en temps d'execució de dades d'objectes.

A més, alguns llenguates, com ara C++, suporten mecanismes on una funció explícitament declarada com amic de la classe pot accedir als membres designats com privats o protegits.

De la mateixa manera, en Java, un mètode sense especificador d'accés pot ser accedit per les classes del mateix paquet.


[edita] Bibliografia

  • Allen J. Peralta Giménez, Horacio Rodríguez Hontoria : "Enginyeria del software : programació orientada a objectes ; Allen J. Peralta Giménez, Horacio Rodríguez Hontoria". ISBN : 84-7653-374-8
  • Meyer, B.: "Object-oriented software construction", 2a edició, Prentice Hall, 1997, ISBN 0-13-629155-4
  • Rumbaugh i al.: "Object-oriented modeling and design", Prentice Hall, 1991, ISBN 0-13-630054-5

[edita] Vegeu També