Minek annyi foreach?

Ha elfogadjuk azt az alaptételt, hogy “kevesebb kód – kevesebb bug”, akkor miért ragaszkodunk annyira a szószátyár foreach ciklusokhoz?

Számtalanszor látok olyan kódot, ami egy lista minden elemével csinál valamit, gyakran csak átadja egy metódusnak:

  List<string> vezerek = new List<string> { "Álmos", "Előd", "Ond", "Kond", "Tas", "Huba", "Töhötöm" };
  foreach( var vezer in vezerek )
  {
    Console.WriteLine( vezer );
  }

Ennél az alábbi sokkal egyszerűbb és pont ugyanezt csinálja:

  vezerek.ForEach( vezer => Console.WriteLine( vezer ) );

Persze olyan is van, amikor nem minden elemmel akarjuk elvégezni ezt a műveletet, csak azokkal, ami teljesít egy feltételt:

  foreach( var vezer in vezerek )
  {
    if( vezer.EndsWith( "d" ) )
    {
      Console.WriteLine( vezer );
    }
  }

Ennél is van egyszerűbb:

  vezerek.FindAll( vezer => vezer.EndsWith( "d" ) ).ForEach( vezer => Console.WriteLine( vezer ) );

Az első példában egyértelmű, hogy a rövidebb megoldást célszerű alkalmazni, mert pont ugyanazt csinálja a két kód, csak az egyik rövidebb és jobban olvasható. A második esetben azonban a FindAll és a ForEach egyaránt egy-egy for ciklusra fordul, tehát itt már két ciklus fog lefutni egymás után – azaz  mérlegelnünk kell az olvashatóság és a teljesítmény között. Például nem biztos, hogy ez a legjobb megoldás egy CheckBoxList kiválasztott elemeinek DataTable-be töltésére:

  DataTable dt = new DataTable();
  dt.Columns.Add( "Item", typeof( string ) );
  this.cblNames.Items
.Cast<ListItem>()
.ToList()
.FindAll( item => item.Selected )
.ForEach( item => dt.Rows.Add( item.Value ) );

Ha eltekintünk a teljesítménytől, akkor is fontos szempont, hogy sokak számára a fenti lambdás írásmód még nem számít “olvashatónak”, ugyanúgy ahogy a (feltétel) ? (ha igaz) : (ha hamis) szintakszis (van ennek valami szép neve?) sem. Mindkettő túl tömör. Azonban van egy óriási előnyük: ordít róluk, hogy mire szolgál az adott kódsor. A foreach csak egy ciklus, a ForEach pedig egy gyűjtemény minden elemével elvégez egy műveletet. Az if csak egy feltétel vizsgálat, a (feltétel) ? (ha igaz) : (ha hamis) viszont egy feltételtől függő értékadás. Kétségkívül kell hozzá kis gyakorlat, de megéri.

Ti mit gondoltok, olvashatóbb a tömörebb kód?



Balássy György (MS RD, ASP.NET MVP, MCTS)

Balássy György (MS RD, ASP.NET MVP, MCTS) Villamosmérnök, a BME Automatizálási és Alkalmazott Informatikai Tanszékén webportálok fejlesztését oktatja. 2000 óta foglalkozik a Microsoft .NET platformjával, melynek meghonosításában jelentős szerepet vállalt előadóként, konzulensként és A .NET Framework és programozása című könyv társszerzőjeként. Az MSDN Kompetencia Központon belül a Portál Technológiák Csoport vezetője, szakterülete web alapú rendszerek fejlesztése és üzemeltetése. 2004-ben Magyarországon elsőként kapta meg a Most Valuable Professional címet, majd 2005 óta a Microsoft magyarországi regionális igazgatója. Publikációi a Technet Magazinban, az MSDN Kompetencia Központ honlapján és szakmai blogjában olvashatóak.

2009.07.27. 6:34:37 | Permalink | Hozzászólások: 0 | Tárgyszavak:


  • Seven – Ready To Go

    Balássy György (MS RD, ASP.NET MVP, MCTS) Ahogy előzetes megígérték – még júliusban – elkészült a Windows 7 és a Windows Server 2008 R2! Nem tudom, hogy ki miért fog átállni, át fog-e egyáltalán, összeszedtem néhány kedvenc és nem annyira kedvenc feature-ömet. Tovább »
  • Konfig módosítás telepítőből

    Balássy György (MS RD, ASP.NET MVP, MCTS) Kár szépíteni a dolgot, mindenki utál telepítőt írni az alkalmazásához. A telepítő készítés igen komoly versenyben van a doksi írással, vagy a projekt vezetői teendők közül az erőforrás- és határidő becsléssel, ha azt nézzük, egy átlag fejlesztő mennyire undorodik tőle. Tovább »


Írja meg Ön is véleményét!


Hozzászólásokat csak regisztrált, bejelentkezett felhasználóktól tudunk elfogadni!

Hozzászólások