[#12]
Re: Ruby 1.9.0 dla MorphOS-a
@Grzegorz Kraszewski,
post #1
Chodzi o to aby dać możliwość zrobienia jak najwięcej i uczynić pracę projektanta/programisty jak najwygodniejszą. Sprowadza się to między innymi do tezy iż im mniej kodu należy napisać tym lepiej. Te mechanizmy, o których wspominasz nie są po to żeby używać ich na siłe tylko po to żeby użyć ich gdy to jest potrzebne i przynosi wymierne korzyści. Wtedy przeważnie nie wpływają negatywnie na strukturę i czytelność programu. Dobrze zaprojektowany program ma tendencję do tego że pewne cechy wynikają w nim nie z kodu a z samego projektu a kolejne rozszerzenia, które dodajemy naturalnie się do niego wpasowują. Program to nie monolit a kolejne warstwy, które korzystają z siebie tworząc dla każdej następnej środowisko w którym działa. Mechanizm GC jest również elementem odciążającym programistę, w bardziej złożonym programie zwolnienie wszystkich zasobów jest bardzo kosztowne, nie tylko jeśli chodzi o ilość czasu potrzebny do wyśledzenia w kodzie zależności i ustalenia kto będzie w danym momencie właścicielem obiektu ale również jest to koszt w trakcie wykonywania potrzebny na każdy warunek sprawdzajacy czy to co mamy zwolnić w ogole zostało zaalokowane. W pewnych sytuacjach z prostej funkcji mającej 3 linijki robi się mało czytelny potworek długi na 15 - w C++ musimy uwzględnić, że w zasadzie w każdym miejscu możemy dostać exception a niestety - i tu jeden z nielicznych ale minus tego języka - w C++ nie ma finally.
I jeszcze jedna rzecz na koniec. Może Cię to zdziwi ale technika z której korzystasz przy pisaniu klas MUI czyli BOOPSI daje takie możliwości, które jak napisałeś powyżej niepodobają Ci się. Jeżeli dispatchera zamiast na switchu zrobisz na mapie i dasz możliwość modyfikacji tego mapa to pojawia się możliwość dodawania a nawet usuwania dynamicznie metod dla całej klasy lub dla pojedynczych obiektów. Podobnie można też zorganizować atrybuty co umożliwi ich dynamiczne modyfikowanie. Mozna tez bez problemu wyobrazić sobie zastosowanie takich konstrukcji. Zamiast dziedziczyc i tworzyć 10 różnych klas gdy część funkcjonalności musi być osiągalna przez wywołąnie metody klasy potomnej z klasy bazowej, tworzymy obiekty jednej klasy i ustawiamy im odpowiednie metody - 1 linijka kontra zrobienie klasy i dopisanie gdzies przy starcie wywolania jej tworzenia. Wykonalismy mniej pracy (mniej linijek kodu), uzyskany efekt robi to samo a rozwiazanie to jest czytelniejsze i mnej podatne na bledy. W jednym miejscu widzimy co sie dzieje i nie musimy analizować co robi 10 klas gdy wrócimy do tego kodu po kilku miesiącach.