C# ir .NET pamokėlės #5. Metodai

Tai vienas iš naudingiausių įrankių kuriant programas. Jei esate dirbę su kitomis neobjektinėmis kalbamomis, manau žinote tokį dalyką, kaip funkcija. Realiai tai yra tas pats dalykas, kaip metodas, tik skiriasi pavadinimas ir yra keli maži skirtumai. Jei nesate susidūrę su funkcijomis, o net ir esate, siūlyčiau vis tiek atidžiai viską perskaityti, nes, kai kurie, kad ir maži skirtumai jums vieną dieną gali labai pagadinti gyvenimą.

Metodai – tai yra tam tikras programuotojo kodas, kuris yra padėtas tam tikroje vietoje ir gali būti iškviečiamas kada panorės programuotojas. Jau galit paklausti, kokį velnią aš čia užrašiau? Tuoj paaiškinsiu. Atsiverskite pirmą pamoka apie C# ir .NET. Pabaigoje buvo paprastas pavyzdys:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace MugIT
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("MugIT");
        }
    }
}

Įsivaizduokime, kad žodį MugIT reikia parašyti daug kartų ir įvairiose situacijose. Norint tai padaryti visose tose situacijose jums vis reikia parašyti Console.WriteLine("MugIT"); . Dabar įsivaizduokime, kad realiai norint gauti žodį MugIT mus reiktų parašyti 100 eilučių kodo. Mes matome, kad pastoviai naudojame šimtą tų pačių eilučių vis iš naujo ir iš naujo, kol suprantame, kad gavome vos ne visą knygą kodo, kurio kodas yra identiškas. Hmm.. susimąstome, kad rasti tam tikras smulkias vietas yra sudėtinga, nes visą kodą peržvelgti užtrunka 10min.
Labai dideli tinginiai prieš daugelį metų susidūrė su šia problema ir jiems kilo mintis sukurti kažkokią mini programą, kurią galėtų iškviesti kada tik panorėtų. Kaip pavyzdį, galite įsivaizduoti, kad metodas yra tarnaitė. Jos tikslas tvarkyti. Vietoj to, kad visą laiką po kiekvieno jos apsilankymo namuose jūs ieškotumėte naujos, jus tiesiog tą pačia tarnaitę pakviečiat tvarkyti vėl. Rezultatas tas pats, tik vienu atveju jus esate ramus, kad visos jūsų atleistos tarnaitės jus nepaduos į teismą už tai, kad jas atleidžiate dėl protu nesuvokiamų priežasčių. Apibendrinant - rogramuojant reikia stengtis kad kodas nepasikartotų keliose skirtingose programos vietose. Klaidos atveju reikės taisyti tik vieną vietą o ne visas 20. Reiškia darbą atliksite 20 kartų greičiau ir efektyviau.Dabar pažiūrėkite, kaip viskas atrodys programoje:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace MugIT
{
   class Program
   {
      static void Main(string[] args)
      {
         MugIT();
      }
      public static void MugIT()
      {
         Console.WriteLine("MugIT");
      }
   }
}

Kaip matote pats metodas yra:

public static void MugIT()
{
    Console.WriteLine("MugIT");
}

Taigi dabar išsiaiškinkime, kaip kas veikia:

  • Žodis public nurodo, kad mūsų metodas yra matomas visam pasauliui. Tai yra, bet koks atėjęs naujas programuotojas galės naudotis metodu.
  • static – tai reiškia, kad norint sukurti metodą mums nereikia kurti objekto. Objektas WTF? Taip, tai yra objektinio programavimo viena iš pagrindinių dalių, bet kadangi dar nedėstėme klasių, tai mes šią vietą tiesiog praleiskime.
  • void – tai reiškia, kad metodas nieko negražina. Tai yra mes negauname jokios reikšmės. Žiūrėdami #3 mūsų pamokėlę susipažinote su tipais, tai pvz aš vietoj void įrašyčiau int, tai reiškia, kad mano metodas turėtų gražinti sveiką skaičių, booltrue ar false, string – kažkokį tekstą ir t.t.
  • MugIT()- Tai metodo pavadinimas. Kaip minėjau anksčiau pavyzdyje su tarnaitėm, norint, kad ji atliktų savo darbą, reik ją pakviesti, bet norint tai padaryti reik žinoti jos vardą:
static void Main(string[] args)
{
    MugIT();
}

Kaip matote žinodami metodo pavadinimą galima jį iššaukti, kad ir šimtą kartų.

Metoduose yra dar vienas labai naudingas dalykas vadinamas parametru. Kartais mums gyvenime prireiks pačiam metodui nurodyti tam tikrus duomenis. Kad ir kalbant apie pavyzdėlį su tarnaitėm, kartais mums reiks nurodyti ar valyti viską ar tik tam tikrus kambarius. Kadangi metodas yra uždaras programos kodas, kuris yra atskirtas nuo programos kodo, mes galima pasinaudoti parametrais. Aišku turbūt vėl pagalvojot – ką aš čia šneku, bet nepabėgit ir aš viską išaiškinsiu. Įsivaizduokime, kad man prie kiekvieno MugIT reiks nurodyti kažkokį papildomą žodį, pvz MugIT technologija. Tas žodis bus vis skirtingas.

namespace MugIT
{
   class Program
   {
      static void Main(string[] args)
      {
         MugIT("technologija");
      }

      public static void MugIT(string zodis)
      {
         Console.WriteLine("MugIT " + zodis);
      }
   }
}

Kaip matome pavyzdyje metodo prierašas pasikeitė, jame atsirado string zodis. Tai yra parametras. Parametre nurodėme kokia reikšmė bus naudojama ar skaičius ar tekstas ar panašiai kas. Zodis – reikšmė kuria naudosimės. Kaip matome mes galime daugiau jo nepriskirti string tipui, o iškart naudoti.

Na ir apžvelkime iškvietimą:

MugIT("technologija");

Metodas yra iškviečiamas. Jis pasižiūri koks parametras yra įrašytas. Šiuo atveju string zodis = „technologija“.

Na, šiandien manau jums išploviau smegenis ir taip. Na gale leisiu paplauti dar šiek tiek. Pačioje pirmoje savo programoje MugIT jus naudojotės dar vienu metodu. Taip, Console.WriteLine("MugIT"); - metodas. Tam tikri metodai dėl dažno naudojimo buvo tiesiog jau parašyti pačių kūrėjų. Kitaip sakant metodo pavadinimas yra WriteLine(), o viduje yra parametras, tai konkretus dalykas, kuri mums reikia atspausdinti. O visas metodo kodas yra saugomas bibliotekos using System; viduje.

Na ir pagaliau duosiu trumpą metodą schemą, tiems, kurie labai tingėjo skaityti ką aš parašiau :D

public static duomenų_tipas metodo_pavadinimas(Parametrų_sąrašas)
{
   // Atliekami veiksmai
}

Gerai gerai, šiam kartui tiek :D

Susiję įrašai:

  1. C# ir .NET pamokėlės #7. String Sveiki. Kadangi dažnai įvairiose programose reikia atlikti įvairius veiksmus su...
  2. C# ir .NET pamokėlės #6. Masyvai Masyvas (angl. Array) – rinkinys vienodo tipo informacijos, kuri yra...
  3. C# ir .NET pamokėlės #3. Sąlygos sakiniai Sąlygos sakinys, tai if...else formuluotė. Jeigu esate programavę su kokia...
  4. C# ir .NET pamokėlės #8. IRC prisijungimas. Praktinė pamoka Sveiki, turbūt retas nežinos mIRC programos. Seniau buvo užėjus populiarumo...
  5. C# ir .NET pamokėlės #4. Ciklai Ciklas, tai kokio nors veiksmo atlikimas keletą kartų. Pavyzdžiui, kad...
Topix Rokit Twitter Facebook Digg Delicious Stumbleupon

apie įrašą „C# ir .NET pamokėlės #5. Metodai“

  1. Tekste pilna klaidų. Kad ir "tai reiškia, kad norint sukurti funkcija mums nereikia kurti objekto." Kaip patys minėjote, CSharp'e nėra funkcijų, yra metodai. Funkcijų niekas nekuria, objektiniame programavime kuriami objektai.
    Nepykit, bet, manau, jūsų "pamokėlės" yra bevertis laiko gaišimas ir skaitančiųjų jas klaidinimas. Jeigu turite iniciatyvos, geriau išverstumėte iš anglų kalbos į lietuvių kalbą tokias pamokeles - būtų ir patiems naudos, ir kitiems :)

  2. Pirma tai C++ yra objektinė (Object Oriented Language) kalba. Būtent tuo ji ir skiriasi nuo C. Tokius dalykus programuotojas turėtų žinoti. Antra tai labai jau sudėtingai aiškinate elementarius dalykus. Pabandykite supaprastinti.

  3. Mielieji, labai ačiū, kad komentuojate, bet prašyčiau, konkretumo.

    Evaldai, klaidos yra ištaisomas, tad jei netingi, parašyk, mes pažiūrėsim :)

    infoguru, ačiū už pastebėjimą, trūksta, vieno žodžio dėl objektinio programavimo :) O dėl aiškinimo, tai čia man sunku vertinti, nes vėl neparašei kurią vietą sunkiai aiškinam, plius, kaip paminėta ankstesnėse pamokėlėse jei turite klausime tikrai lauksime jūsų forume ir ten stengsimės jums padėti.

    O pabaigai tiesiog norėčiau pridurti, kad šio projekto esmė yra mokytis kartu. Mes pradėjome rašyti apie C#, nes, kaip tik C# stengėmės perprasti ir tikimės, kad labiau išmanantys padės, o gal patars įvairiais klausimais :) Tad, baisiai nepykit jei pamatysit klaidas, o tiesiog pasistenkite mums padėti jas ištaisyti. Iškart labai dėkoju :)

  4. Va konkretus pavyzdys kaip nereikėtų rašyti:

    Kaip pavyzdį, galite įsivaizduoti, kad metodas yra tarnaitė. Jos tikslas tvarkyti. Vietoj to, kad visą laiką po kiekvieno jos apsilankymo namuose jūs ieškotumėte naujos, jus tiesiog tą pačia tarnaitę pakviečiat tvarkyti vėl. Rezultatas tas pats, tik vienu atveju jus esate ramus, kad visos jūsų atleistos tarnaitės jus nepaduos į teismą už tai, kad jas atleidžiate dėl protu nesuvokiamų priežasčių.

    Manau tai galima paprasčiausiai parašyti taip:

    Programuojant reikia stengtis kad kodas nepasikartotų keliose skirtingose programos vietose. Klaidos atveju reikės taisyti tik vieną vietą o ne visas 20. Reiškia darbą atliksite 20 kartų greičiau ir efektyviau.

    ---
    Pykti mes nepykstame, tik kaip sakė Evaldas klaidinate žmones. Prieš rašant panašias pamokas siūlyčiau keletą gerų C++ programavimo knygų persiskaityti, pasisemsite įkvėpimo ir įgysite patirties.

  5. Kaip supratau perskaitęs pamoką, metodą galiu aprašyti nebutinai prieš jį naudojant, kad ir po jo, nes programa pirma peržiūrės visą kodą, tik tada jį vygdys?

  6. Neradau paminėta, kad pats static void Main(string[] args) yra metodas. Dėl pačio name'ingo, kad c# nebėra funkcijų ir procedūru galima ginčytis. Mano nuomone, tai tik užvadinimo klausimas. Man metodas yra apibendrinamasis žodis, apjungiantis tiek procedūras, tiek funkcijas, o jos realiai skirtusi taip - procedūra reikšmės negrąžina arba gražina per parametrus, funkcija gražina reikšmę. Truputi komkrečiau susišnekėti įmanoma. P.s. tas pavyzdys su tarnaite - nerealus :D Tikrai nuoširdžiai pasijuokiau. Be to, tik statiniams ir vidiniams (naudojamiems klasės ribose) metodams nereikia kurti objekto. Galima naudoti

    ManoKlase.Metodas();

    jei statinis naudojamas už klasės ribų ir

    Metodas();

    jei klasės viduje. Jei metodas nėra statinis ir norima jį naudoti kitoje klasėje, reikia susikurti klasės, kurioje yra metodas, objektą, norint jį panaudoti.

    ManoKlase klase = new ManoKlase();
    klase.Metodas();

    Taipogi nešnekėta visiškai apie metodų prieinamumą. Pvz metodą MugIT nematau prasmės būti public, nes naudojamas klasės viduje. T.y. jis turėtų būti private.

    • ZeroDivide, šaunu, kad tave prajuokinau, toks mokymosi tikslas ir yra kažką išmokti bei praleisti gerai laiką, o dabar rimtoji dalis. Pamėginsiu paaiškinti tau vieną dalyką, manau ir kitiems jis puikiai tiks. Tavo komentare radau labai daug naudingos informacijos, kurią manau kada papildysiu pamokėlėje "Metodai 2:Plačiau" ar panašiai, bet kartu supratau, kad nesupratai, kad rašom ir naujokam, žinai aš suprantu, kad tavo pasaulyje žmones, net nematę klasių, jau žino kas tai yra, žino ir apie objektus, bet žinai - realybėje, taip nėra, žmogus, pirma turi kažkur apie tai paskaityti, kad galėtų orientuotis apie ką tu kalbi. Tad čia tas pavyzdys su klase ir objektu yra nevietoje ir nelaiku.

      Išvada paprasta, mes negalime rašyti ar naudoti to apie ką visai nerašėme, gal todėl atsiranda daug netikslumų, nes norim paprastam žmogui paaiškinti viską be mokslinių terminų ir panašų dalykų, jei jam bus įdomu, jis visada galės paprašyti papildomos informacijos, ką ir daro keli mūsų bendruomenės nariai. Tad nekaltinkit mūsų jei neįdėjom kokio nors dalyko, gal tiesiog negalėjom to padaryti.

      Evaldai, kiekviena knyga turi autorines teises ir kopijavimas yra baudžiamas Lietuvos, tiek kitų šalių įstatymais, tad jokių kopijavimų nebuvo ir nebus :)

      • "Išvada paprasta, mes negalime rašyti ar naudoti to apie ką visai nerašėme, gal todėl atsiranda daug netikslumų" - galbūt išvada, kad savo mokymo planą išdėliojai ne ta linkme ir reikėjo pirmoj pamokoj truputi supažindinti žmogų su OOP principais? Nebūtinai išmokyt aprašyt, bet bent pasakyt kas yra klasė, objektas ir panašiai. Taip abstrakčiai, kad dabar nekiltų problemų pavartoti bent patį žodį. O tada, kai jau pažengtum su pamokom tolyn, galėtum pamokyti kaip viskas apsirašo ir konkrečiai naudojama. Mano nuomone mokyti objektinės programavimo kalbos procedūriniais principais yra negerai, dėl to, kad padedi blogus pamatus. Pamenu, kai man reikėjo pereiti prie objektinio programavimo - visas kodas vienoj klasėj, visi metodai public static ir t.t. Baisu net pažiūrėt, kai atsiverčiu seną kodą savo, kadaise rašyta :)
        Tai ką tu darai yra labai konstruktyvus ir geras darbas, kuriam tu neatlygintinai naudoji savo laiką. Mes gi atėję nesakom, kad prirašei nesamonių ir t.t. Mes pasakom, kur galbūt suklydai, kur galėtum ką papildyti. Ir žmogui, kad ir naujokui, kai skaito, galbūt šitie komentarai yra naudingi, aiškiau į kur plėstis. Be to, manau, nė vienas iš komentatorių nepaprieštaraus, jei mūsų pastabas sudėsi į sekantį straipsniuką. Nežiūrėk į mus kaip į priešus, sužlugdyt mes tavęs nenorim, stengiamės padėti vystyti tavo atliekamą darbą, nes jis yra prasmingas.

  7. hm... Čia juk pamokėlės ;D Kadangi pats programavimu susidomėjau prieš kelis metus, galiu save laikyti naujoku, kuriam šitos pamokėlės. Realiai skaitant originalias knygas (EN kalba) supratimas apie objektinį programavimą (tiek c# ar pan.) pateikiamas platesnis. Tik tiek, kad vargina skaitymas ir ten pateikiamų pavyzdžių nagrinėjimas, kurie kartais labai perpildyti ar pateiktą jų per mažai suprasti pagrindiniams principams.. O šiaip dėl bendro supratimo, gal ir kiek netikslaus, bet tikrai originalaus, pamokėlės yra vertos dėmesio. Anyway, man daug mieliau būtų skaityti apie tai kaip kuriamas kažkoks realus produktas ir į blog'ą rašomi komentarai, pastabos, taip pat nuorodos. O dabar šiek tiek nuvilia pirmose "pamokėlėse" akcentuotas paprastumas ir patrauklumas.

    • Tavo pasiūlymas paintrigavo. Galima manau būtų suorganizuoti tokias pamokėles, tik duokit pasiūlymų produkto įdėjai. Aišku, tada neturėtumėt tikėtis, kad bus rašoma tokiu lygiu, tiesiog būtų kodas ir jo analizė, bet jei atrodo, kai tai bus vertinga medžiaga - pirmyn, galim daryt. Tikrai nepatingėčiau weekly straipsniuką įdėti, jei tik kam nors tai bus naudinga. Tik prašau, nesiūlyk iki tokio lygio "darom OS" :) Kažką simple, galbūt šiek tiek kvailo :) Šiaip draugas mano sau pačiam mokytis susigalvojo man rods soft'ą, į kurį gali susivest manga'as ( nu sudėt aprašymus, įkelt paveiksliukus, tokį katalogą pasidaryt ). Tai jei bus konstruktyvių pasiūlymų, tai manau ir užsiimti galima bus. P.s. Dar syk sakau - ne kažką super sudėtingo. Man reik dar dirbt ir po darbo pailsėti :D

Palikti atsakymą