Vezérlőpult
D1. Metódusdefiníció · Metódusok

D blokk · Metódusok · 1. tananyag

Metódusdefiníció: a kód rendet rak

A C blokk végére a programjaid ütőképesek — de kezdenek hosszúra nyúlni, és az ismétlődő részek másolgatása egyre kockázatosabb. A megoldás a metódus: névvel ellátott kódrészlet, amelyet egyszer írsz meg, és bárhonnan meghívhatsz. És ma megfejtjük a rejtély első felét: mit jelent a void a B8-as Konzol.cs-ben.

2 tanóradefiníció és hívása DRY-elv

Tanulási célok

1A másolás csapdája — és a kiút

A C6-os Mintagyárban a menüt minden kör elején kirajzoljuk. Ha egy sort módosítani akarsz rajta, jó eséllyel több helyen kell — és ha egy helyen elfelejted, a program következetlenné válik. Ez a másolt kód átka.

A szakma erre külön elvet tart számon: DRY — Don't Repeat Yourself, azaz „ne ismételd önmagad”. Az ismétlődő kódrészletnek egy helye legyen, és onnan használd mindenhol. C#-ban ennek az eszköze a metódus.

ℹ️ MÁR RÉGÓTA HASZNÁLSZ METÓDUSOKAT

A Console.WriteLine, az int.Parse, a Konzol.Cim — mind metódus: mások által megírt, névvel ellátott kódrészlet. Az első napod óta hívod őket (A6). Ma megírod a sajátjaidat.

2Az első saját metódus

Koszones();
Console.WriteLine("A program dolgozik…");
Koszones();

void Koszones()
{
    Console.WriteLine("═══════════════════");
    Console.WriteLine("  Üdv a programban!");
    Console.WriteLine("═══════════════════");
}

Két rész:

A kimenetben a keretes üdvözlés kétszer jelenik meg — pedig a kódját csak egyszer írtad le. Pontosan ez a cél.

💡 HOL ÉLJEN A DEFINÍCIÓ?

A top-level programban a szokásunk (és a legolvashatóbb): a futó utasítások elöl, a metódusdefiníciók a fájl végén. A hívás nyugodtan megelőzheti a definíciót — a fordító a teljes fájlt látja.

3A fejléc anatómiája — a void megfejtése

RészJelentés
voida visszatérési típus helye — a void azt jelenti: ez a metódus nem ad vissza értéket, csak elvégez valamit
Koszonesa metódus neve — PascalCase, igés: mit csinál? (Koszones, MenutRajzol)
()a paraméterlista — most üres; a D2-ben ide kerül majd a metódus bemenete

És most nézd meg újra a B8-as Konzol.cs egy fejlécét:

public static void Siker(string szoveg)

A rejtély fele tehát megvan — és a blokk végére a teljes fejlécet folyékonyan olvasod majd.

4A vezérlés útja: beugrás és visszatérés

Console.WriteLine("A");   // 1.
Koszones();               // 2. → a vezérlés BEUGRIK a törzsbe
Console.WriteLine("B");   // 4. ← a törzs végén IDE tér vissza

void Koszones()
{
    Console.WriteLine("Üdv!");   // 3.
}
TOP-LEVEL UTASÍTÁSOK WriteLine("A"); Koszones(); WriteLine("B"); 1 2 4 A DEFINÍCIÓ void Koszones() { WriteLine("Üdv!"); } 3 beugrás visszatérés a hívás utáni sorra Kimenet: A · Üdv! · B

A program tehát nem „fentről lefelé” fut többé, hanem a hívások mentén ugrik — de mindig pontosan oda tér vissza, ahonnan elugrott.

Ezt a debuggerrel a saját szemeddel is követheted (A9):

BillentyűNévMit csinál a híváson állva?
F11Step Intobelép a metódus törzsébe — soronként követed odabent
F10Step Overátlépi a hívást — a metódus lefut, de egy lépésnek látod

Metódusba — vagy maradhat helyben?

Döntsd el: érdemes-e az adott kódrészletet metódusba kiemelni?

1 / 8Pontszám: 0
…

5A Konzol osztály bővül: Elvalaszto()

A B8-ban ígértük: a Konzol osztály velünk nő. Most először te írsz bele metódust. Nyisd meg a Konzol.cs-t, és a meglévő metódusok mellé vedd fel:

public static void Elvalaszto()
{
    Console.ForegroundColor = ConsoleColor.DarkGray;
    Console.WriteLine("────────────────────────────");
    Console.ResetColor();
}

Használata bárhonnan: Konzol.Elvalaszto(); — és a programjaid kimenete egységesen tagolt lesz. Figyeld meg: pontosan úgy építkezik, mint a Siker — színt állít, kiír, színt visszaállít. A mintát másoltad, a tartalmat te írtad: így nő egy segédosztály.

6Gyakori hibák

TünetMi történt?Mit tegyél?
a metódus „nem csinál semmit”csak definiáltad, de sehol sem hívtad mega definíció önmagában nem fut — kell a Koszones(); hívás
CS0201 a Koszones; sorraa hívásról lemaradt a ()metódust mindig zárójellel hívunk: Koszones();
CS0103 egy változóra a metóduson kívüla változó a metódus törzsében születetta metódusban deklarált változó csak ott él (a C4-es hatókör-szabály rokona)
CS0128: ugyanaz a metódusnév kétszerkét azonos nevű definícióegy név — egy definíció (a „hasonló, de más” esetre a D3-as túlterhelés lesz a válasz)
a program StackOverflowException-nel leálla metódus véletlenül önmagát hívjaa törzsből ne hívd ugyanazt a metódust
kisbetűs metódusnévműködik, de sérti a konvenciótmetódusnév PascalCase-zel és igével: MenutRajzol
; a fejléc után: void Koszones();a definícióból törzs nélküli „ígéret” letta fejléc után nem ;, hanem { } törzs áll

7Gyakorlat — a Mintagyár rendet rak

  1. Nyisd meg a C6-os MintaGyar projektet (benne a Konzol.cs).
  2. Emeld ki a menü kirajzolását egy FoMenu() metódusba — a do-while törzsében csak a hívás maradjon. Futtasd: kívülről semmi sem változott, belül rend lett.
  3. Bővítsd a Konzol.cs-t az 5. szakasz Elvalaszto() metódusával, és hívd meg minden menüpont lefutása után.
  4. Emelj ki még legalább egy összefüggő részt beszédes nevű metódusba (pl. Bucsuzas() a kilépő üzenetnek).
  5. Debuggerrel: tegyél töréspontot a FoMenu(); hívásra, és próbáld ki az F11-et és az F10-et — nézd meg a különbséget!
  6. Commit: Mintagyar metodusokkal strukturalva.
✅ ELLENŐRZŐ PONT

A program pontosan úgy működik, mint eddig; a do-while törzse rövid és olvasható; a Konzol.Elvalaszto() működik.

8Feladatok

Gyakorló feladatok

⭐ alap · ⭐⭐ haladó · ⭐⭐⭐ kihívás

D1.1⭐

Háromszoros üdvözlés: írj Koszones() metódust, amely kiírja a neved keretben — és hívd meg háromszor. Hány sor kódot spóroltál a másoláshoz képest?

D1.2⭐

Vonalhúzó: írj Vonal() metódust, amely 30 kötőjelet ír ki egy sorba (C4-es ciklussal!) — és tagolj vele egy háromrészes kiírást.

D1.3⭐⭐

Logó: tervezz 4-5 soros „ASCII-logót” a saját monogramodból, tedd Logo() metódusba, és írasd ki a program elején és végén.

D1.4⭐⭐

Konzol-bővítés: vedd fel a Konzol.cs-be a Figyelem() metódust (sárga szín, ⚠ jel — a B8.4-es feladat, de most már érted, mit írsz!), és használd egy rövid programban a Siker/Hiba mellett.

D1.5⭐⭐⭐

Refaktor: vedd elő a C7-es fagylaltozó-kasszádat (vagy az átváltót), és szervezd metódusokba az ismétlődő/összefüggő részeit (menürajzolás, búcsúzás, elválasztók). A működés nem változhat — a do-while törzse viszont férjen el egy képernyőn.

9Önellenőrző kvíz

Ellenőrizd magad!

Minden kérdésnél egy válasz helyes. A végén pontszámot kapsz.

10Fogalomtár

FogalomJelentés
metódusnévvel ellátott kódrészlet — egyszer definiálod, akárhányszor meghívod
definícióa fejléc + törzs leírása — önmagában nem fut le
hívásMetodusNev(); — ekkor fut le a törzs
fejlécvisszatérési típus + név + paraméterlista: void Koszones()
törzsa { } közti utasítások
void„nem ad vissza értéket” — a metódus csak elvégez valamit
vezérlésátadáshíváskor a futás beugrik a törzsbe, majd visszatér a hívás utáni sorra
DRY-elvDon't Repeat Yourself: az ismétlődő kódnak egy helye legyen
Step Into / Step OverF11: belépés a hívott metódusba; F10: átlépés fölötte

11Összegzés

  1. A metódus a kód újrahasznosításának alapegysége: definíció egyszer, hívás akárhányszor — ez a DRY-elv gyakorlata.
  2. A fejléc: void (nincs visszatérési érték) + PascalCase, igés név + üres (); a definíció a fájl végére, a hívás bárhová.
  3. A vezérlés a hívásnál beugrik, a törzs végén visszatér — F11-gyel követheted, F10-zel átléphetsz.
  4. A metódusban deklarált változó csak ott él — a hatókör-szabály itt is érvényes.
  5. A Konzol osztályba először írtál saját metódust — a B8-as fájl többé nem „csak használt” kód: kezded érteni, hogyan épül fel.
  6. A metódusaink egyelőre mindig ugyanazt csinálják. A következő lépés: bemenet és kimenet — paraméterek és visszatérési érték.