Nemerle – jeden z jezykow .NET’owych, tworzonych btw przez Polakow, zaprezentowal kolejna ciekawa funkcje – Late binding.
Po zastosowaniu slowa kluczowego late, zgodnie z nazwa, “wiazanie” nie jest tworzone w trakcie kompilacji. Mozemy dzieki temu wywolac czesc klasy (wlasciwosc, metode), jezeli jestesmy pewni, ze takowa tam jest.
Najlepiej widac to na przykladzie:
def GetLength(obj : object)
late obj.Length
System.Console.WriteLine(GetLength("String testowy"))
System.Console.WriteLine(GetLength([0, 1, 2, 3]))
Jak widac – nie sa stosowane zadne interface’y, nie sprawdzane jest czy przekazywany obiekt rzeczywiscie posiada wlasciwosc Length – robione jest to dopiero po wywolaniu kodu.
I wszystko ladnie, pieknie – tyle, ze mi to nie pasuje. Minelo troche czasu od kiedy stukalem sobie w pehapie i mialem w nosie wszystko. Teraz [z reszta wtedy tez - tyle, ze mniej i ze to byla z kolei nalecialosc z c++] czyms naturalnym dla mnie jest kontrola typow czy typy same w sobie. Brak tego to ulomnosc, uproszczenie. Przydatne jest to przy pisaniu skryptow, ale w przypadku powazniejszych aplikacji – tym bardziej traci to sens im bardziej skomplikowany i rozrosniety jest projekt. Nie mowiac juz o czynnikach wydajnosciowych.
Late binding, duck typing – to przydatne feature’y, mile, upraszczajace pewne sprawy, w pewnych okolicznosciach. Byle uzywane z glowa, a nie downgrade’ujace jezyk programowania do poziomu jezyka skryptowego. Swoja droga – samodzielne wykonanie takiego late bindingu jest bardzo proste – .NET posiada wszystko co potrzebne, aby wykonac to samemu – wystarczy chociazby metoda InvokeMember z klasy Type [uzyskana dzieki GetType], chociaz sposobow jest kilka.