GOTO naredba se u C# (ne znam kako je u ostalim prog. jezicima) smatra lošom praksom jer dovodi do pisanja špageti koda.
Primer sa MSDN-a:
Code:
public class GotoTest1
{
public static void Main()
{
int x = 200, y = 4;
int count = 0;
string[,] myArray = new string[x,y];
// Initialize the array:
for (int i = 0; i < x; i++)
for (int j = 0; j < y; j++)
myArray[i,j] = (++count).ToString();
// Read input:
Console.Write("Enter the number to search for: ");
// Input a string:
string myNumber = Console.ReadLine();
// Search:
for (int i = 0; i < x; i++)
for (int j = 0; j < y; j++)
if (myArray[i,j].Equals(myNumber))
goto Found;
Console.WriteLine("The number {0} was not found.", myNumber);
goto Finish;
Found:
Console.WriteLine("The number {0} is found.", myNumber);
Finish:
Console.WriteLine("End of search.");
}
}
1. Prvo smo inicijalizovali promenljive
x i
y i kreirali niz. OK
2. Inicijalizovali smo niz. OK
3. Od korisnika tražimo da unese broj. OK
4. Vršimo pretragu niza i ako uspemo da pronađemo broj skačemo na liniju
Found. Nije OK, jer umesto da nastavimo sa čitanjem koda, skrolujemo do linije
Found da vidimo šta se tamo dešava, pa onda pokušavamo da se vratimo tamo gde smo stali. Pri tom moramo da skočimo na vrh koda da vidimo vrednosti za
x i
y i proverimo da li su te vrednosti u međuvremenu promenjene (pošto nisu const / readonly).
5. Ispisujemo da nismo pronašli broj i skačemo na liniju
Finish. Nije OK jer ponovo jurimo po kodu i pokušavamo da shvatimo šta se dešava.
Ovaj primer je jednostavan jer sadrži samo 2 goto naredbe, ali kada debagujemo aplikaciju sa više goto naredbi onda je jako teško shvatiti šta je pisac želeo da kaže.
Prethodni primer bih refaktorisao na sledeći način:
Code:
internal class Program
{
private static void Main(string[] args)
{
var myArray = CreateArray(200, 4);
Console.Write("Enter the number to search for: ");
string myNumber = Console.ReadLine();
if (myArray.Contains(myNumber))
{
Console.WriteLine("The number {0} is found.", myNumber);
}
else
{
Console.WriteLine("The number {0} was not found.", myNumber);
}
Console.WriteLine("End of search.");
}
private static string[,] CreateArray(int x, int y)
{
var myArray = new string[x, y];
int count = 0;
for (int i = 0; i < x; i++)
{
for (int j = 0; j < y; j++)
{
myArray[i, j] = (++count).ToString(CultureInfo.InvariantCulture);
}
}
return myArray;
}
}
public static class ArrayHelpers
{
public static bool Contains(this string[,] myArray, string number)
{
if (myArray == null)
{
return false;
}
foreach (var item in myArray)
{
if (item == number)
{
return true;
}
}
return false;
}
}
1. Kreiram matricu 200x4. Ne zanimaju me detalji.
2. Od korisnika tražim da unese broj.
3. Gledam da li postoji broj. Opet me ne zanima po kom algoritmu. Ako broj postoji ispisujem jednu poruku, ako ne postoji, ispisujem drugu poruku.
Ovaj primer ima više linija koda, ali je dosta fleksibilniji od prvog.
1. CreateArray metodu mogu da iskoristim na više mesta umesto da radim C/P.
2. Contains metoda radi sa bilo kojim dvodimenzionalnim nizom, a iz naziva se već vidi šta radi. Nije potrebno komentarisati / tumačiti parče koda gde se ova metoda poziva :)