Az Eiffel egy osztály-orientált nyelv, ezért minden eljárás és függvény egy osztály műveleteként adható meg, és mindig egy meghatározott célobjektumra kell vonatkoznia. Híváskor a célobjektumot és az eljárás vagy függvény nevét a pont operátor választja el. Az Eiffel programozási nyelv az osztály-orientáltság következményeként dinamikus kötést használ, az alprogramok egy objektum dinamikus típusa alapján hívódnak. Minden alprogram külön jelzés nélkül is virtuális. Eiffel-ben az alprogramok lehetnek rekurzívak. (Ld. még OOP.)
Az eljárások és függvények megkülönböztetésére nincs külön kulcsszó, ugyanakkor ez a két fogalom erősen elkülönül egymástól. Az eljárásokat állapotváltoztató, a függvényeket lekérdező műveletek megvalósítására használják, vagyis a függvényeknek nem lehet mellékhatása. A nyelv specifikációja ezt nem köti ki, mert lehetnek olyan műveletek, amik változtatják az objektum attribútumait úgy, hogy az objektum kívülről látható (logikai) állapota nem változik (gondoljunk például egy file cache-elt olvasására), és ezt a fordító nem tudná ellenőrizni. Ugyanakkor a műveletek ilyen módon való szétválasztása általánosan elfogadott konvenció, amitől csak nagyon indokolt esetben szokás eltérni.
Eiffel-ben az alprogramok kétfélék lehetnek: a deferred
törzsű alprogramok a más nyelvekben absztraktnak nevezett metódusoknak felelnek meg. Ha egy osztály tartalmaz deferred metódust, akkor az egész osztály deferred, tehát absztrakt. A nem deferred alprogramokat effektívnek nevezzük. Az effektív metódusok csoportján belül is kétféle alprogram lehetséges: az external
kulcsszóval jelölt, más programnyelven megvalósított eljárás, illetve az internal, amit Eiffel nyelven valósítunk meg.
Példák:
require
kulcsszó után, míg az utófeltételt az ensure
kulcsszót követően adhatjuk meg. A feltételek egyszerű logikai kifejezések lehetnek, melyek futás közben ellenőrzés alatt állnak. (Ld. még helyességbizonyítás.)
Egy alprogramban a local
kulcsszó után adhatók meg a metódus belső, lokális munkaváltozói. Ezek kizárólag csak az alprogram törzsén belül használhatók, azon kívül érvényüket vesztik.
Egy alprogram végén rescue
kulcsszó után állhat a kivételkezelő rész. Megadása nem kötelező, de ajánlott. (Ld. még kivételkezelés.)
Példa:
do
kulcsszóval kezdődik, akkor a törzs az alprogram minden hívásakor lefut. Ha once
kulcsszóval kezdjük az alprogram törzsét, akkor az az adott objektum élettartama során legfeljebb egyszer fog lefutni, az alprogram legelső hívásakor; a későbbi hívások mindegyike hatástalan lesz. Ezzel a módszerrel lehet Eiffel-ben összetett típusokból konstans objektumot készíteni.
Példa:
creation
kulcsszó után felsorolt eljárások speciális szerepet töltenek be: ezek lesznek az osztály konstruktorai. A konstruktorok nevére nincs határozott megkötés (mint pl. C++ -ban), a nyelv fejlesztői által ajánlott név a make
.
A nyelv nem engedi meg, hogy egy osztály két rutinjának azonos legyen a neve, azaz nem támogatja a függvénynév túlterhelést. Különböző osztályoknak lehetnek azonos nevű rutinjai, ilyenkor a megfelelő rutin kiválasztása a célobjektum dinamikus típusa alapján történik. Például megengedett a következő:
put_int
, put_char
.
A nyelv szigorú típusossága az alprogramokra is vonatkozik, így paraméterátadáskor a aktuális paraméterek számának és típusának pontosan meg kell egyeznie az alprogram szignatúrájában szereplőkkel. A paramétereket csak pozícionálisan lehet megadni, nincs lehetőség default értékek megadására sem.Változó argumentumszámú alprogramot a tömb típus segítségével valósíthatunk meg. Példa:
Current
néven lehet a rutinokban hivatkozni, ez is persze csak olvasható. Függvények esetén a függvény eredményét a Result
nevű változóba kell beleírni, ami a függvény egy implicit módon definiált változója, melynek típusa megegyezik a függvény visszatérési értékének típusával, egyébként pedig ugyanúgy viselkedik, mint a többi lokális változó. Az Eiffelben nincs return
utasítás, a függvény akkor fejeződik be, amikor a vezérlés a végére ér, eredménye pedig a Result
aktuális értéke.
Példa: