Keresési módszerek

BecomeAnXcoder – Keresési módszerek

Bevezető

Az előző fejezetben a metódusokról tanultunk. Két metódus törzsét mi írtuk és felhasználtunk egy Apple által szolgáltatottat is. A setIntValue: metódus arra szolgált, hogy egy egész számot megjelenítsünk egy szövegmező objektumban. Hol lehet megtalálni az általunk felhasználható metódusokat?

Emlékeztetnénk arra, hogy az Apple által szolgáltatott metódusok esetében neked egyetlen kódot sem kell írnod. További előnyük, hogy hibamentesek. Ezért mindenképpen tanácsos körülnézni, hogy van-e megfelelő kész metódus, mielőtt belevágnánk a programozásba.

Gyakorlat

Ha az Interface Builder-ben a paletta ablakban egy objektum fölé mozgatjuk a kurzort, vagy kiválasztjuk azt, akkor egy kis ablakban megjelenik egy rövid leírás. Amennyiben egy gombot választunk ki az egérrel, akkor azt fogjuk látni, hogy “NSButton”. Amennyiben egy “System Font Text”-et tartalmazó szövegmezőt, akkor azt látjuk, hogy “NSTextField”. Ezek mindegyike egy osztály neve. Nézzük meg most, hogy az NSTextField osztályban milyen metódusok érhetők el.

Az Xcode-ban válasszuk ki a Help → Documentation menüt. A bal oldali oszlopban válasszuk ki a Cocoa (Core Library)-t, az API keresési módot a felső sorból és írjuk be az “NSTextField”-et a kereső mezőbe. (Lásd az ábrát.) Amint elkezded beírni a keresőkifejezést, a lehetséges találatok fokozatosan szűkülnek, míg végül az NSTextField fog látszódni a lista tetején. Kattints az NSTextField osztálytípusra, hogy az alatta levő mezőben megjelenjen annak részletes leírása.

24 Documentation

Navigáció a Cocoa documentációban az Xcode segítségével

Az első dolog, amit meg kell jegyezni az az, hogy ez az osztály sok mindent örököl más osztályoktól. Az utolsó, az (Inherits from) sorban a főkutya, a mindenekfelett álló NSObject.
Az oldalon kicsit lejjebb található a következő cím (szkrollozni kell hozzá):
Methods
Itt fogjuk kezdeni a keresést. Ha átfutjuk az alcímeket, gyorsan látni fogjuk, hogy itt nem találjuk meg azt a metódust, aminek a segítségével ki tudunk íratni egy értéket a szövegmező objektumba. Az öröklődés elve alapján meg kell találni a sorban a következő szuperosztályt. Az NSTextField osztályt közvetlenül tartalmazó szuperosztály az NSControl (ha itt sem járnánk sikerrel, akkor jöhet a következő, az NSView osztály, és így tovább). Mivel az egész dokumentáció HTML alapon működik, nagyon egyszerű a navigáció, csak rá kell kattintani az NSControl linkre, ( az Inherits from listában látható). Ezzel megkapjuk az NSControl osztály információs oldalát:

NSControl
Inherits from NSView : NSResponder : NSObject

Látható, hogy egy osztállyal feljebb léptünk. A metódus listában észrevehetünk egy alcímet:

Setting the control’s value (Vezérlő elemek beállítása)
Éppen ez az amit keresünk, hiszen egy értékbeállításra van szükségünk. Alatta találjuk a következő alcímet:

- setIntValue:

Biztatóan hangzik, ezért ennek a metódusnak elolvassuk a leírását rákattintva a setIntValue: linkre.

setIntValue:
- (void)setIntValue:(int)anInt
Beállítja a fogadó (vagy a kiválasztott) cella értékét az anInt egész értékre. Ha a cella szerkesztés alatt áll, akkor megszakít minden szerkesztési folyamatot mielőtt beállítja az értéket; ha a cella nem az NSActionCell-ből öröklődik, akkor kijelöli a cellának a belsejét a megjelenítés frissítéséhez szükséges módon (az NSActionCell viszont a saját frissítési módszerét alkalmazza).

Az alkalmazásunkban az NSTextField objektumunk a fogadó és ide kell egy egész értéket betöltenünk. Ezt a metódus kódjából is láthatjuk:

- (void)setIntValue:(int)anInt

Az Objective C nyelvben a metódus példány kezdetét egy mínusz jel jelöli (az osztály metódus deklarációról majd később fogunk beszélni). A void azt jelöli, hogy nincs semmilyen visszatérési érték a metódusból a hívó fél felé. A konkrét alkalmazásunkban amikor küldünk egy setIntValue: üzenetet a textField objektumnak a MAFoo objektum nem kap vissza semmilyen értéket a szövegmező objektumtól. Ez rendben is van. A kettőspont után látható (int) azt mutatja, hogy az anInt változó értéke egész típusú kell, hogy legyen. A konkrét feladatunkban az 5 és a 0 értékeket küldjük vele, tehát nyugodtak lehetünk.

Néha egy kicsit bonyolultabb megtalálni a legmegfelelőbb metódust. Jelentősen megkönnyíti a dolgodat, ha ismerős vagy a dokumentációban, javasoljuk tehát annak olvasgatását.

Mi a helyzet, ha a textField szövegmező objektumból szeretnénk kiolvasni egy értéket? Emlékszel a függvények hasznos tulajdonságára, mely szerint a belső változók rejtettek? Ugyanez a helyzet a metódusokkal is. Az objektumok metódusai azonban gyakran párba állíthatók, amiket “Accessor”-oknak (kiegészítőknek) nevezünk, az egyik az érték olvasására, a másik az érték beállítására szolgál. Mi már ismerjük a másodikat, ami a setIntValue:metódus. Az első, ennek a párja pedig így néz ki:

//[1] - (int) intValue

Amint az jól látható, ez a metódus egy egész értékkel tér vissza. Ezért ha a textfield objektumunkhoz kapcsolódóan egy egész értéket szeretnénk kiolvasni, akkor egy ilyen üzenetet kell küldeni:

//[2] int resultReceived = [textField intValue];

Megismételjük: a függvényekben és a metódusokban is az összes változónév rejtett. Ez a változóneveknek egy kiváló tulajdonsága, hiszen nem kell aggódni, hogy a program egy részében beállított változó összegabalyodik egy ugyanolyan nevű másik változóval. Ugyanakkor a függvény neveknek egyedieknek kell lenniük. Az Objective-C egy lépéssel továbbmegy a védelemben: a metódusneveknek csak egy osztályon belül kell egyedinek lenniük, különböző osztályok viszont tartalmazhatnak ugyanolyan metódus neveket. Ez egy nagyon kellemes tulajdonság nagy programok esetén, hiszen a programozók egymástól függetlenül írhatják meg az osztályokat úgy, hogy nem kell aggódniuk metódusnév konfliktustól sem.
Polimorfózisnak (görög eredetű szó) nevezzük azt a tényt, hogy különböző metódusok neve különböző osztályokban akár ugyanaz is lehet, és ez az egyik dolog, ami az objektum-orientált programozást olyan különlegessé teszi. Ez lehetővé teszi, hogy úgy írjunk meg programrészeket, hogy fogalmunk sincs előre arról, hogy milyen osztályhoz tartoznak azok az objektumok, amelyekkel éppen dolgozunk. Csupán az szükséges, hogy futásidőben az aktuális objektumok megértsék a számukra küldött üzeneteket.
A polimorfózisnak köszönhetően rugalmasan tervezhető és könnyen bővíthető programokat lehet írni. Például az általunk írt GUI alkalmazásban ha kicseréljük a szövegmezőt egy másik osztály olyan objektumára, amelyik megérti a setIntValue: üzenetet, az alkalmazásunk továbbra is működni fog anélkül, hogy módosítanánk a programkódot, vagy akár még újrafordítás nélkül is. Lehetőségünk van variálni az objektumokat futás közben úgy, hogy közben semmit sem kell megszakítani. Ebben rejlik az objektum-orientált programozás ereje.

 

eredeti oldal