A goto rövid receptje

C# + foreach + switch.

Aki szerint a segédváltozó szebb és kifejezőbb, azt fejbe rúgom. :)

Hozzászólások

A segedvaltozo nem jobb es nem kifejezobb! :-)

Ezzel egyutt orulok, hogy Javaban es C#-ban nincs. Csak visszaelnenek vele...
--
Ki oda vágyik, hol száll a galamb, elszalasztja a kincset itt alant:


()=() 
('Y') Blog | @hron84
C . C Üzemeltető macik
()_()

Van, pont azért, mert néha kell, mint a fenti esetben, mikor egy foreachon belül lévő switch-case-ből kellene break-el kilépni, amit nem lehet, mert a breakkal csak egy sizntet tudsz ugrani.

Szerinted miért írtam, hogy C#+foreach+switch? :)

----------------
Lvl86 Troll, "hobbifejlesztő" - Think Wishfully™

Javaban anonim osztályt _csak_ adott interfacehez vagy osztályhoz lehet írni:


Object obj = new Object {
	public String toString() {
		return "Hello";
	}
}

Runnable r = new Runnable {
	public void run() {
		System.out.println(obj);
	}
}

Ha ezt tudod, akkor elég egyértelmű miről van szó, ha meg nem akkor tessék előbb utánaolvasni. :)

Jo, eltevedtem egy kicsit. De az ilyen bonyolult dolgokat en amugy is kulon fuggvenybe szoktam kiszervezni, es a return meg kilep mindenhonnet... raadasul elegans is :-)
--
Ki oda vágyik, hol száll a galamb, elszalasztja a kincset itt alant:


()=() 
('Y') Blog | @hron84
C . C Üzemeltető macik
()_()

hubazz, nagyon kemeny vagy...

--
"Pont attól akartam megkímélni magam, hogy gondolkodni kelljen ;)" (lajos22)

Az állapotváltozót nem azért használjuk a goto helyett, mert szebb...

Szerintem nem a "sátáni eszköztár" része, de kerülendő, mert könnyű vele átláthatatlan és nehezen karbantartható kódot írni. Ha a programot többen módosítják és van köztük kezdő, tapasztalatlan vagy béna programozó akkor mindenki életét meg tudják keseríteni vele.
Általában goto nélkül is lehet szép és hatékony kódot írni (nyilván konkrét esettől függ hogy indokolt-e a használata vagy nem).

Amikor valaki még csak kezdi tanulni a programozást, akkor szerintem jó ha azt hallja, hogy ne használjon GOTO-t, mert így nem szokik hozzá, hogy össze-vissza tud ugrálni a program flowban. Amikor meg már valamennyire tud programozni, akkor majd rájön hogy azért jól jön néha az a goto. Szerintem nincs ezzel semmi baj, egy kezdő és egy tapasztaltabb programozónak másképp kell hozzáállnia a kérdéshez.

Elmúlt 10 évben talán ha 3x kellett gotot használnom, amiből egyik meg se maradt, mert félúton át lett dolgozva a kód és már nem volt szükség rá. Nem kell túldramatizálni ezt a "jaj, mi történhet vele" dolgot.

----------------
Lvl86 Troll, "hobbifejlesztő" - Think Wishfully™

Bónusz, meg lehet nézni, hogy mi lesz a segédváltozóból egy normálisabb fordító esetén (VS2010, C++, release profil):

int _tmain(int argc, _TCHAR* argv[])
{
00A01000  push        esi  
	bool done = false;

	srand (time(NULL));
00A01001  push        0  
00A01003  call        dword ptr [__imp___time64 (0A020A8h)]  
00A01009  push        eax  
00A0100A  call        dword ptr [__imp__srand (0A020A0h)]  
00A01010  mov         esi,dword ptr [__imp__rand (0A0209Ch)]  
00A01016  add         esp,8  
00A01019  lea         esp,[esp]  

	while (!done)
	{
		int r = rand() % 10;
00A01020  call        esi  
00A01022  cdq  
00A01023  mov         ecx,0Ah  
00A01028  idiv        eax,ecx  

		switch (r)
00A0102A  dec         edx  
00A0102B  je          wmain+32h (0A01032h)  
00A0102D  sub         edx,2  
00A01030  jne         wmain+20h (0A01020h)  
		{
			case 1:
				done = true;
				break;

			case 3:
				done = true;
				break;
		}
	}

	return 0;
00A01032  xor         eax,eax  
00A01034  pop         esi  
}

(Sajnos a C# fordító alapból nem optimalizálja ki a segédváltozót).

----------------
Lvl86 Troll, "hobbifejlesztő" - Think Wishfully™

Nekem a foreach-ben switch is eleve csúnya :)

A kód nélkül nehéz erre bármit is mondani, de nem a switch-csel van gondom. Az persze mindenképp jobb mint a sok else if. Ha végig kell vizsgálni egy enum lehetséges példányait akkor azt vagy kiemelném onnan egy erre dedikált metódusba, vagy eleve maga az enum is végezhetné. De kód nélkül csak a levegőbe beszélek, szóval ha tényleg ez a legelegánsabb megoldás, akkor elfogadom :)

De minek tegyem ki külön metódusba, főleg, hogy lehetne potenciálisan lehetne átadogatni egy halom változót neki paraméternek, nem keveset akár ref-ként? Konkrét eset amúgy az volt, hogy egy enumban volt megadva, hogy milyen módon dolgozza fel az elemeket, illetve az egyes elemek feldolgozott eredményei alapján történhetett az, hogy kilép az első érték után vagy csak az összes után, stb. Még a strategy pattern se adott volna itt szép eredményt túlzottan, arról nem beszélve, hogy sokkal több kód lett volna.

C#-ban meg magához az enumhoz nem tudsz kódot adni. (Meg semmi keresnivalója nincs ott).

----------------
Lvl86 Troll, "hobbifejlesztő" - Think Wishfully™