Aquest article defineix els termes i presenta exemples de modelatge d'objectes i codificació per valor clau que són específics de l'enllaçat Cocoa i de la framework Core Data. Entendre els termes com camins clau és fonamental per utilitzar aquestes tecnologies efectivament. Aquest article és recomana que el llegeixis si ets nou en el disseny orientat a objectes o en la codificació per valor-clau.
Quan s'utilitza la framework Core Data, necessites una forma per descriure el teus objectes model que fa que no depenguis de les vistes i els controladors. En un bon disseny reutilitzable, les vistes i controladors necessiten una forma per accedir a les propietats del model sense imposar dependències entre ells. La framework Core Data soluciona aquest problema oferint conceptes i termes des la tecnologia de base de dades -- especialment, la entitat -- del model de relacions.
El modelat entitat-relació és una forma de representar objectes utilitzada típicament per descriure una dada d'una estructura de dades d'origen d'una forma que permet a aquestes estructures de dades ser mapejades com objectes en un sistema orientat a objectes. Fixeu-vos que el model entitat-relació no és l'únic a Cocoa; és una disciplina popular amb un conjunt de regles i termes que estan documentats en la literatura de les bases de dades. És una representació que facilitat l'emmagatzemament i la recuperació d'objectes en un origen de dades. Un origen de dades pot ser una base de dades, un fitxer, un servei web o qualsevol altre magatzem persistent. Donat que aquest no és dependent en de cap tipus d'estructura de dades també pot utilitzar-se per representar qualsevol tipus d'objecte i les seves relacions a altres objectes.
Cocoa utilitza una versió modificada de les regles tradicionals del model entitat-relació reflectit en aquest article com a modelatge d'objectes. El modelatge d'objectes és particularment útil en la representació de models del patró de disseny Model-Vista-Controlador (MVC). Això no és sorprenent en un aplicació Cocoa simple, els models són típicament persistents -- emmagatzemats en alguns tipus de contenidors de dades, per exemple, un fitxer.
En el patró de disseny MVC, els models són els objectes en la teva aplicació que encapsulat dades específiques i proporciona mètodes que operen en aquestes dades. Els models són normalment persistents però més important és, que els models no són dependents en com les dades es mostren a l'usuari.
En el model entitat-relació, els models s'anomenen entitats, els components d'una entitat són anomenats atributs i les referències a altres models s'anomenen relacions. Ajuntant atributs i relacions es coneix com a propietats. Amb aquestes tres conceptes simples (entitats, atributs i relacions), es poden modelar sistemes arbitràriament complexes.
Per exemple, un model objecte pot utilitzar-se per representar un consumidor base d'una companyia, una biblioteca de llibres, o una xarxa d'ordinadors. Una biblioteca de llibres tenen atributs -- com ho són el títol del llibre, el número ISBN i la data del copyright -- i relacions cap a altres objectes -- com són l'autor i la biblioteca on pertany. En teoria, si les parts d'un sistema poden identificar-se, el sistema pot expressar-se com un model d'objectes.
La Figura 1 mostra un exemple de model d'objecte utilitzat en una aplicació de gestió d'empleats. En aquest model, un Departament modela un departament i un Empleat modela un empleat.
Figura 1: Diagrama objecte de l'aplicació de gestió d'empleats

Els atributs representen estructures que contenen dades. Un atribut d'un objecte pot ser un valor simple, com ho és un escalar (per exemple, un enter, float o double, però també pot ser una estructura de C (per exemple un array de char o un NSPoint) o una instància d'una classe primitiva (com ho és, l'NSString, NSNumber, NSData o NSDate a Cocoa). Els objectes immutables com l'NSColor també són usualment considerats atributs. (Fixeu-vos que el Core Date només suporta nativament un específic conjunt de tipus d'atributs, descrits a NSAttibuteDescription. Pots, tanmateix, utilitzar tipus d'atributs addicionals, com els descrits a Atributs No-Estàndard de la Guia de Programació Core Data).
A Cocoa, un atribut normalment correspon a una variable d'instància del model o a un mètode d'accés. Per exemple, un Empleat té les variables d'instància nom, cognom i salari. En una aplicació de gestió d'empleats, podries implementar una vista en forma de taula per mostrar un conjunt d'objectes Empleats i alguns dels seus atributs, com es mostra a la Figura 2. Cada fila en la taula correspon a una instància d'Empleat, i cada columna correspon a un atribut d'Empleat.
Figura 2: Vista de taula d'Empleats

No totes les propietats d'un model són atributs -- algunes propietats són relacions a altres objectes. La teva aplicació està normalment modelada per múltiples classes. Durant l'execució, el teu model d'objecte és una col·lecció dels objectes relacionats que conformen un esquem d'objecte. Aquests són normalment els objectes persistents que els teus usuaris creen i guarden en algun contenidor de dades o fitxer abans de finalitzar l'aplicació (com en les aplicacions basades en documents. Les relacions entre aquests objectes model poden travessar-se durant l'execució per accedir a les propietats dels objectes relacionats.
Per exemple, en l'aplicació de gestió d'empleats, hi ha relacions entre un empleat i el departament en que treballen, i entre un empleat i el gestor d'empleats. L'últim és un exemple d'una relació reflexiva -- una relació des d'una entitat a si mateixa.
Les relacions són inherentment bidireccionals, així, com a mínim conceptualment, també hi ha relacions entre un departament i els empleats que treballen en el departament, i un empleat i els seus informadors directes. La Figura 3 il·lustra les relacions entre un Departament i una entitat Empleat, i la relació reflexiva de l'Empleat. En aquest exemple, les relacions de les entitats "empleats" amb el Departament són la inversa de les relacions de les entitats "departament" amb els Empleats. És possible, tanmateix, per què les relacions siguin navegables en només una direcció -- per evitar que ni hagi relacions inverses. Si, per exemple, mai has estat interessat de trobar des d'un objecte departament quins empleats hi estan associats, llavors no tens un model que el relacioni.
Figura 3: Relacions en l'aplicació de gestió d'empleats

Cada relació té una cardinalitat; la cardinalitat t'explica quants objectes destí poden (potencialment) resoldre la relació. Si l'objecte destí és un objecte únic, llavors la relació s'anomena una relació a-un. Si poden ser-ne més d'un objecte en el destí, llavors la relació s'anomena una relació a-molts.
Les relacions poden ser obligatòries o opcionals. Una relació obligatòria és una on el destí és requerit, per exemple, cada empleat ha d'associar-se amb un departament, una relació opcional és, com suggereix el nom, opcional -- per exemple, no cada empleat té informadors directes.
També és possible especificar un rang per la cardinalitat. Una relació opcions a-un té un rang 0-1. Un empleat ha de tenir un nombre arbitrari de informadors directes, o un rang que especifiqui un mínim i un màxim, per exemple, 0-15, el qual també il·lustra una relació opcional a-molts.
La figura 4 il·lustra la cardinalitat en l'aplicació de gestió d'empleats. Les relacions entre un objecte Empleat i un objecte Departament és una relació obligatoria a-un -- un empleat ha de tenir com a mínim un, i només un, departament. La relació entre un Departament i les seus objectes Empleat són una relació opcional a-molts (representada per un "*"). La relació entre un empleat i un gestor és una relació opcional a-molts (denotada per un rang 0-1) els empleats de dalt de tot no tenen gestors.
Figura 4: Cardinalitat de Relacions

Fixeu-vos també que les objectes destí de relacions són de vegades propietaris i de vegades compartits.
Per a que els models, vistes i controladors siguin independents pels altres, necessites tenir accés a les propietats de forma que sigui independent d'una implementació del model. Això s'acompleix utilitzant parelles de valors clau.
Especifiques propietats d'un model utilitzant una clau simple, sovint un string. La corresponent vist o controlador utilitza la clau per veure el valor de l'atribut corresponent. La construcció del "valor d'un atribut" reforça la noció que el propi atribut no necessàriament conté la dada -- el valor pot obtindre's indirectament o derivadament.
La codificació valor-clau s'utilitza per realitzar aquesta cerca -- és un mecanisme per accedir a les propietats d'objecte indirectament i, en certs contexts, automàticament. La codificació de valor-clau funciona utilitzant els noms de les propietats dels objectes -- normalment les seves variables d'instància o mètodes d'accés -- com a claus per accedir als valors d'aquestes propietats.
Per exemple, podries obtenir el nom d'un objecte Departament utilitzant la clau nom. Si l'objecte Departament també té una variable d'instància o mètode anomenat nom llavors per la clau poden retornar-se (si no ho és, un resultat d'error). De forma semblant,, podrien obtenir els atributs d'Empleat utilitzant les claus nom, cognom i salari.
Tots els valors d'un atribut particular d'una entitat donada són del mateix tipus de dada. El tipus de dada d'un atribut està especificat en la declaració de la seva corresponen variable d'instància o en el valor de retorn del seu mètode d'accés. Per exemple, el tipus de dada de l'atribut nom de l'objecte Departament pot ser un objecte NSString de l'Objecte-C.
Fixeu-vos que la codificació valor-clau només retorna valors objecte. Si el tipus de retorn o el tipus de dada del mètode d'accés específic o la variable d'instància utilitzada per proporcoinar el valor per una clau especificada no és un objecte, llavors un objecte NSNumber o NSValue es crea per que aquest valor sigui retornat en lloc seu. Si l'atribut nom del Departament és del tipus NSString, llavors utilitzant la codificació valor-clau el valor retornat per la clau nom de l'objecte Departament és un objecte NSString. Si l'atribut pressupost del Departament és del tipus float, llavors utilitzant la codificació valor-clau el valor retornat de la clau pressupost de l'objecte Departament és un objecte NSNumber.
De forma semblant, quan actives un valor utilitzant la codificació valor-clau, si el tipus de dada requerida pel mètode d'accés apropiat o la variable d'instància de la clau especificada no és un objecte, llavors el valor s'extreu de l'objecte passat utilitzant el mètode - apropiat.
El valor d'una relació a-un és simplement l'objecte destí d'aquesta relació. Per exemple, el valor d'una relació a-molts és l'objecte col·lecció (aquest pot ser una agrupació o un array -- si utilitzes el Core Data aquest és una altra agrupació que és típicament un arrau) que conté els objectes destí de les relacions. Per exemple, el valor de la propietat empleats d'un objecte Departament és una col·lecció que conté objectes Empleats. La Figura 5 mostra un exemple d'esquema objecte de l'aplicació de gestió d'empleats.
Figura 5: Esquema objecte de l'aplicació de gestió d'empleats

Un camí clau és un string de claus separades per punts que especifiquen una seqüència de propietats d'objecte per atravesar-la. La propietat de la primera clau hi està determinada per, i cada clau sub-següent és evaluada relativa a, la propietat prèvia. Els camins clau et permeten especificar les propietats d'objectes relacionats en una forma que és independent de la implementació del mode. Utilitzant camins clau pots especificar el camí a través d'un esquema objecte, una profunditat arbitrària, a un atribut específic d'un objecte relacionat.
El mecanisme de codificació valor-clau implementa trobar el camí clau d'un valor donat semblant a les parelles valor-clau. Per exemple, en una aplicació de comptabilitat podries accedir al nom d'un departament mitjançant un objecte Empleat utilitzant el camí clau departament.nom on departament és una relació de l'Empleat i nom és un atribut de Departament. Els camins clau són útils si vols mostrar un atribut d'una entitat destí. Per exemple, la vista de taula d'empleats de la figura 6 està configurat per mostrar el nom de l'objecte departament dels empleats, no el propi objecte departament. Utilitzant l'enllaçat Cocoa, el valor de la columna "Departament" fa referència al departament.nom dels objectes empleats que es mostren en l'array.
Figura 6: Vista de taula Empleats mostrant el nom del departament.

No totes les relacions en un camí clau necessàriament tenen un valor. Per exemple, la relació gestor pot ser nil si l'empleat és el CEO. En aquest cas, el mecanisme de codificació valor-clau no es trenca -- aquest simplement atura el traspàs del camí i retorna un valor adequat, com és nil.