Chwilowo musiałem zrobić przerwę w blogowaniu z powodu wyjazdu na szkolenie WRS oraz organizacji wydziałowej Wigilii -- z obydwu eventów postaram się niedługo zamieścić chociaż kilka zdjęć. :-)
Tymczasem chciałbym wykorzystać notatkę do wykorzystania ,,natywnej'' funkcji bloga, jaką jest marudzenie. Co mnie do tego zmusza? Ano szablony właśnie.
Nie wiem, jaką myślą kierują się twórcy języków i platform programistycznych, ale starają się jak mogą, aby paradygmat programowania generycznego zmieszać z błotem. C++ jest bardzo potężnym językiem, ale szablony są w nim -- niestety -- doczepione na siłę. W gruncie rzeczy szablony w tym języku to dosyć zaawansowane makra, wymagające za każdym razem kompilacji kodu szablonów pod konkretny typ danych. Rozwiązanie takie ma mnóstwo wad: nie możemy ukryć implementacji typów generycznych, za każdym razem kompilujemy mnóstwo niepotrzebnego kodu, a w dodatku debuggowanie kodu szablonów może stać się mordęgą -- często mały błąd składni powoduje wygenerowanie setek nic nie mówiących błędów -- i to takich błędów prosto z piekieł (libc)! Plusem szablonów w C++ jest ich niezła wydajność (niewielki spadek wydajności w porównaniu z niegeneryczną wersją) oraz dostępność całkiem niezłej biblioteki STL, która potrafi nam uprościć w wielu zastosowaniach życie (póki nie będziemy zastanawiać się nad 5 stronami błędów, które troskliwy kompilator wypluł nam po jednej literówce).
W C# sytuacja teoretycznie powinna być lepsza. Znamienne może być jednak to, że generyczne typy danych wprowadzono dopiero w .NET 2.0. Jeżeli chodzi o implementację, to kilka błędów C++ rozwiązano. Kod szablonów jest kompilowany (do MSIL) tylko raz, a z odpowiednim typem danych wiążemy się w gruncie rzeczy za pomocą refleksji (,,refleksyjne typy danych'' to akurat duży plus C# i Java). I wszystko byłoby fajnie, gdyby nie... No właśnie. Ciężko zmusić szablony do pracy na podstawowych typach danych. O ile możemy wymagać od parametru szablonu konkretnego interfejsu, to -- chociażby -- z numerycznymi typami danych (float, double -- a nie daj roocie jakiś własny Complex) jest już o wiele gorzej. Przykład? Generyczna klasa macierzy.
Chciałbym zacząć podsumowanie słowami M. L. Kinga. ,,Miałem sen...'' Sen o języku, który od podszewki realizuje wspomniany już z wielką pompą paradygmat programowania obiektowego.