Bine ați venit în partea a doua a acestei serii introductive despre Obiectiv-C. După ce a trecut săptămâna trecută examinând fundamentele limbii C pe care se construiește obiectivul C, în această săptămână vom trece la concentrarea asupra a ceea ce face ca obiectivul C să fie un limbaj atât de mare pentru dezvoltarea software-ului. În mod specific, vom discuta fundamentele programării orientate pe obiecte (OOP) și vom demonstra cum să creați o clasă și să trimiteți mesaje către obiectele din Obiectiv-C.
De ce avem Obiectiv-C? De ce nu folosiți limbajul C? Motivul pentru care avem obiectivul C este acela de a ne oferi un loc de joacă orientat spre obiecte în care să construim aplicațiile noastre. OOP este o paradigmă de programare care încearcă să permită dezvoltatorilor să se gândească la designul de software în termeni de obiecte și atribute în locul variabilelor și funcțiilor. În mod specific, OOP încearcă să obțină abstractizarea datelor, încapsularea, modularitatea, polimorfismul și moștenirea. Subiectul OOP ar putea umple cu ușurință o carte (sau o serie de tutori) pe cont propriu, așa că în schimb vă voi prezenta principiile de bază cu titlu de exemplu.
Imaginați-vă că aveți o mașină. Vă puteți gândi la mașina dvs. ca obiect. Există multe alte mașini în lume și ați putea chiar să dețineți mai multe. Mașina dvs. are diferite proprietăți: marca, modelul, culoarea, tipul motorului și multe altele. În termeni de programare orientată pe obiecte, am numi conceptul abstract al unei mașini o "clasă" și mașina individuală pe care o dețineți un obiect sau instanță (obiect instanțiat) al clasei. Atunci când se fabrică o mașină nouă, o nouă instanță a clasei de mașină este instanțiată (sau creată) și dată propriului set de proprietăți.
Încă puțin cam fuzzy? O altă mare analogie este aceea a cookie-ului și a tăietorului pentru cookie-uri. Clasa este tăietorul cookie, iar obiectul este cookie-ul.
Deci, de ce să gândiți în termeni de obiecte? Unul dintre cele mai bune motive este pentru că așa creierul dvs. conceptualizează în mod natural viața în lumea reală și există multe beneficii pentru a putea abstracționa dezvoltarea de software în termeni similari.
Clasele (și, prin urmare, obiectele) sunt alcătuite din metode și atribute. Dacă veniți dintr-un alt limbaj de programare, s-ar putea să fiți mai familiarizați cu metodele de egalitate cu funcții și atribute cu variabile. Vom discuta fiecare la rândul următor.
Deci, avem o "instanță" a unei mașini, acum ce facem cu ea? Ei bine, o conducem și o umplem cu benzină, printre altele. Conducerea și umplerea cu benzină se aplică numai autoturismelor pe care le folosim, ceea ce înseamnă că atunci când umplem o mașină sau conducem o mașină, impactăm doar asupra unei singure instanțe și nu asupra tuturor mașinilor din lume. Prin urmare, umplerea instanței de mașină este considerată o exemplu. Este ceva ce facem instanței noastre și doar instanței noastre.
Pe de alta parte, daca intrebam clasa originala a masinii cat de multe culori de masina sunt disponibile, aceasta este o metoda de clasa, pentru ca nu mai vorbim doar despre masina pe care o conducem, ci despre toate masinile in general.
Multe dintre aceste principii devin mai clare cu utilizarea, așa că să ne uităm la o sintaxă.
În Obiectiv-C, numim metode obiect prin trecerea mesajelor. Când vrem să știm cât de mult este gazul în cazul nostru de mașină, atunci trimitem un mesaj instanței noastre și mesajul este metoda pe care vrem să o aplicăm. Din punct de vedere programatic, se prezintă astfel:
[mesaj destinatar];
Parantezele indică faptul că trimitem un mesaj. Primul parametru este cine ar trebui să primească acest mesaj, iar al doilea parametru este mesajul. În cele din urmă, încheiem cu un semi-colon așa cum este comun pentru majoritatea limbajelor de programare.
Deci, cu exemplul nostru anterior în minte, așa vom interacționa cu instanța noastră de mașină pentru a adăuga gaz la rezervor;
[dansCar addGas];
Exemplul de mai sus presupune că am instanțiat o instanță a clasei Mașină și l-am numit "dansCar". Apoi, trimitem mesajul "addGas" către obiectul "dansCar", echivalent cu apelarea unei funcții. În altă limbă, această linie poate arăta astfel:
dansCar.addGas ();
Sa spunem ca clasa noastra de masini are un rezervor de gaz care este stocat ca procent. De exemplu, dacă rezervorul de gaz este la 50% atunci este jumătate plin și dacă este la 100%, înseamnă că este plin până la margine. Acum, dacă vrem să știm cât de mult este gazul în rezervor, nu luăm direct informațiile respective dintr-un atribut. În schimb, am folosi o metodă accessor pentru a accesa variabila internă pentru noi. De asemenea, atunci când vrem să umplem rezervorul, nu dăm atributul rezervorului de benzină un procentaj nou, folosim un setter pentru a actualiza atributul pentru noi. Acest proces este cunoscut sub numele de încapsulare de date.
Ceea ce înțelegem prin încapsularea datelor este că datele sunt conținute (ca să spunem așa) prin metode care înseamnă accesul la ele trebuie să folosim metode. Unii dintre voi care au programat în alte limbi și nu au auzit despre încapsularea datelor se întreabă de ce facem lucrurile în acest fel. Răspunsul este că, prin încapsularea datelor, există o pernă frumoasă între dezvoltatorul unei clase și utilizatorul unei clase. Deoarece metodele de clasă gestionează și menține atributele din cadrul clasei, ele pot mai ușor menține integritatea datelor. Un alt avantaj major este că, atunci când un dezvoltator își distribuie clasa, oamenii care îl folosesc nu trebuie să-și facă griji în privința internelor clasei. Un dezvoltator poate să actualizeze o metodă care să o facă mai rapidă sau mai eficientă, însă această actualizare este transparentă pentru utilizatorul clasei, deoarece utilizează în continuare aceeași metodă fără a schimba codul său.
Acest lucru ne aduce cu plăcere următoarea secțiune pe care o vom uita, care este modul în care Obiectivul C separă interfața de implementare.
Când creați sau lucrați cu o clasă simplă în Obiectiv-C, veți vedea că, în mod implicit, are două fișiere. Unul este fișierul de implementare care este un fișier care se termină cu un sufix de .m și fișierul de interfață care este un fișier care se termină cu un sufix de .h.
#import@ mașină de interfață: NSObject // Aici sunt atributele go float fillLevel; // Aici se află metodele go - (void) addGas; @Sfârșit
Mai întâi de toate, importăm Cocoa.h care este o bibliotecă standard cu multe coduri reutilizabile pe care le putem folosi în aplicația noastră.
În continuare, declarăm că aceasta este interfața pentru Mașină, dar de asemenea punem NSObject în acea declarație. Adăugarea "NSObject" înseamnă că clasa Mașină moșteneste de la clasa NSObject. Vom vorbi mai mult despre moștenire într-un viitor tutorial.
Variația instanței noastre "fillLevel" este declarată în continuare și specificăm că aceasta este de tip "float", astfel încât să putem reprezenta cu ușurință un procentaj.
Următoarea linie declară metoda noastră "addGas". "-" indică faptul că aceasta este o metodă de instanță, și nu o metodă de clasă. Porțiunea "(void)" înseamnă că metoda nu va întoarce nimic înapoi atunci când se termină executarea. Dacă clasa va reveni la un număr întreg, aceasta va fi schimbată la "(int)" și aceeași pentru orice alt tip de date. În cele din urmă, finalizăm declarația metodei cu punct și virgulă.
#import "Car.h" @implementation Masina - (void) addGas // codul merge aici pentru a adăuga gazul @end
Punerea în aplicare în acest caz conține metoda de adăugare a gazului în rezervor. De asemenea, importăm Car.h, care este fișierul de interfață. Unde se află metoda addGas, am putea adăuga mai multe metode, dar scopul de azi este să vă înțelegeți pur și simplu cum funcționează clasele, decât să faceți o clasă completă.
Data viitoare vom analiza în detaliu metodele și utilizarea variabilelor cu metode (precum și elementele de bază ale gestionării variabilelor în Obiectiv-C). Acest tutorial nu a fost prea lung, deoarece este adesea puțin confuz pentru dezvoltatorii noi de ce separăm clasele în mai mult de un fișier. Dacă vă simțiți deloc confuz, vă rugăm să re-citiți cele de mai sus sau să puneți întrebări în secțiunea de comentarii de mai jos. Clasele vor fi o reapariție constantă în această serie și este important să înțelegeți cum funcționează.
Văzând că această parte a seriei a fost destul de teoretică, nu puteți face prea multe pentru a practica. Cu toate acestea, recomandăm săptămâna aceasta să vă înscrieți pentru site-ul web al dezvoltatorului Apple, deoarece este o referință neprețuită. Odată ce ați făcut acest lucru, aveți un snoop în jurul o parte din clasele lor descărcabile și descărcați câteva simple. Nu trebuie să înțelegeți tot codul, ci doar să vedeți modul în care clasele sunt formate și separate între fișiere.