var persons = Enumerable.Range(0, 10).Select(i => new Person {
FirstName = i.ToString(),
LastName = "Nazwisko"
}).ToList();
persons.ForEach(Console.WriteLine);
Natomiast wciaz jedyna nowoscia jest uzycie lambdy, ktora mozna wyrzucic.
Szablony, delegaty, wyrażenie lambda czyli również uwiązanie zmiennej/leniwa ewaluacja, enumeracje, iteratory, sekwencje, metody rozszerzające, ogólnie LINQ, a na koniec polimorfizm. Faktycznie, 5 minut nauki dla osoby która raczkuje w programowaniu. :)
Co do elastycznosci, na ktora sie tak czesto powolujesz a nie masz o niej pojecia, to:
Mam kod który działa podobnie do Twojego, czyli
for (int i = 0; i < persons.Length; i++)
{
var p = new Person();
p.Name = "Jan";
p.Age = i.ToString();
persons[i] = p;
}
Jednak chcę go zmienić żeby wczytawał dane z konsoli, nie ma problemu (u Ciebie też).
for (int i = 0; i < persons.Length; i++)
{
var p = new Person();
p.Name = Console.ReadLine();
p.Age = int.Parse(Console.ReadLine());
persons[i] = p;
}
Po chwili dostaję informację "użytkownik nie wie co zrobić, należy mu wyświetlić komunikat". U siebie dopiszę dwie naturalne linijki, a Ty albo całkowicie zmienisz swój kod, albo stworzysz babola.
for (int i = 0; i < persons.Length; i++)
{
var p = new Person();
Console.Write("Podaj imię: ");
p.Name = Console.ReadLine();
Console.Write("Podaj swój wiek: ");
p.Age = int.Parse(Console.ReadLine());
persons[i] = p;
}
"Program się wysypał jak użytkownik przypadkiem wpisał literę w wieku", znowu zmieniam w prosty sposób kod i mam:
for (int i = 0; i < persons.Length; i++)
{
var p = new Person();
Console.Write("Podaj imię: ");
p.Name = Console.ReadLine();
while (true)
{
Console.Write("Podaj swój wiek: ");
if ( int.TryParse(Console.ReadLine(), out p.Age))
break;
else
Console.WriteLine("Podany wiek nie jest liczbą.");
}
persons[i] = p;
}
Wracając do przykładu z dzieckiem i dodawaniem. Zadanie brzmi
Podaj sumę:
a) 1+5 = ? (Ty uczysz sumy ciągu arytmetycznego)
b) 2+9 = ? (dzieciak używa wzoru)
c) 1+2+4 = ? (dzieciak nie ma żadnego pożytku z sumy ciągu arytmetycznego...)
W tym zadaniu można pokazać użytkownikowi "zamiast z tablic możesz skorzystać z List<int>, a wynik możesz wyświetlić za pomocą foreach".
#Moj algorytm nie wymusza znajomosci sposobu iteracji po kolekcji.
#Wszystkie czesci sa atomowe i moga byc reuzywane w osobnych miejscach, niezaleznie od rodzaju obiektow czy kolekcji agregujac.
#Kod wykonujacy iteracje jest sprawny i przetestowany przez dobre kilka lat.
#Sam algorytm jest oddzielony od interakcji z uzytkownikiem.
#Nie korzystam z zadnych wnetrznosci specyficznych dla danej kolekcji, nie wymagam indeksera czy dostepu do losowego elementu. Nie wymaga, zeby argumentem tego indeksera byl int
. W gruncie rzeczy nic nie wymagam, tylko korzystam z abstrakcji dostarczonej przez MS.
- Algorytm, to chyba zbyt wielkie słowo. :) W kuchni korzystasz z przepisu na wrzącą wodę? :)
- KTÓREKOLWIEK części Twojego kodu są atomowe? Co może byc używane ponownie, te 4 linie kodu które napisałeś i nawet nie są ujęte w metodę czy chodzi Ci o kod które Ty nie napisałes czyli
Select
, Range
? Równie dobrze mogę napisać, że "moje rozwiązanie" jest używane w milionach miejc, bo programy korzystają z for
czy i++
. :D
- Ja
for (int i = 0; i < persons.Length; i++)
wymyśliłem wczoraj, a teraz czekam na odpowiedź z biura patentowego, bo to świeży i innowacyjny kod. :P
- Sam "algorytm" działa na stałych, nie ma interakcji z użytkownikiem. Równie dobrze mogę napisać, że "mój algorytm jest oddzielony od bazy danych".
- Korzystasz z
List<T>.ForEach
który nie występuję w innych kolekcjach.
Twoj kod natomiast uzywa prymitywnych rozwiazan rodem z C
Tak, bo one są najodpowiedniejsze w tym momencie.
Jesli chcesz pokazywac zle metodyki kodzenia zaslaniajac sie pustymi frazesami, ktorych nie rozumiesz, to zycze powodzenia w przyszlosci.
Rozwiazanie które zaproponowałeś nie jest krótsze, nie jest czytelniejsze, nie jest wydajniejsze, nie jest w żaden sposób lepsze, a ma wad - trudno je zmienić, rozwinąć. Proszę Ciebie, pokaż KOD gdzie do swojego rozwiązania dodajesz np. wyświetlanie komunikatów lub weryfikację czy dane są prawidłowe.
Odnośnie pustych frazesów to Ty piszesz: "Moj algorytm" (?), "atomowość" (?), "reużywalność" (?), "kolekcji agregujac" (?).
Żeby było jasne, uwielbiam "zgrabny" kod. Taki który jest "intensywny", czyli krótki i korzystając z wszystkich możliwości języka/bibliotek, ale tutaj Twój kod wcale nie jest krótszy, czytelniejszy czy cokolwiek... Nawet nie jest równorzędną alternatywą.