Jak radzicie sobie w dużym projekcie z faktem, że Ruby jest dynamicznie typizowany?
Chodzi mi głównie o kwestię dokumentacji interfejsów - w językach statycznie typizowanych w sygnaturach metod mamy dostępną informację o tym, że argumenty są określonego typu lub powinny implementować określony interfejs. Natomiast w Rubim, taka informacja nie jest dostępna. Czy zatem w złożonych projektach zawsze macie do czynienia z świetną dokumentacją, gdzie wszystkie parametry wywołania są odpowiednio opisane? Biblioteka standardowa Rubiego bez odpowiedniej dokumentacji byłaby znacznie trudniejsza do użycia. Ale z drugiej strony zgodnie z metodyką clean code powinno się unikać rozwlekłej dokumentacji, m.in. ze względu na to, że często nie nadąża ona za zmianami w kodzie, przez co przynosi więcej szkód niż pożytków.
Co robicie jeśli nie ma dokumentacji? Zaglądacie do testów jednostkowych, żeby zobaczyć typowy sposób użycia danej klasy? Czy też macie jakąś inną metodę na radzenie sobie z tym problemem?
Apohllo, kopę lat :D. Tak jak napisałeś. Testy, albo przegrepowanie kodu za fragmentem, który używa danego interfejsu. Czasem też pomaga magiczna komenda “$” w pry, żeby podglądnąć źródło klasy/metody, co czasem dużo mówi o tym czego się spodziewa jako parametrów.
Śmiem wątpić by ktokolwiek miał czas na jakąkolwiek dokumentację.
Przy moim ostatnim projekcie w ruby, gdzie kodu bylo bardzo duzo, robilem w ten sposob, ze izolowalem jakies wywolanie w pliku, ktory potem wywolywalem za pomoca rails r - dzieki temu mialem latwosc uruchomienia sprawdzanego kodu. I potem pry i puts. W puts bardzo wygodnym trickiem bylo zrobienie czegos w stylu puts "#{'>' * caller.size} ... " dzieki czemu wiedzialem jak gleboko w stacktrace dana metoda dziala.
PS. Teraz pisze tylko w Go, gdzie nawigacja i czytanie nawet bardzo duzych projektow, jest dziecinnie prosta
Dzięki za link do kontraktów - wygląda bardzo obiecująco. W zasadzie dzięki nim można mocno zwiększyć możliwości Rubiego (pattern matching dla metod pozwala definiować wiele metod o tej samej nazwie). Super sprawa. Używacie tego w jakimś projekcie?
Kilku znajomych używało już tego produkcyjnie. Zero problemów. Jest też flaga która pozwala wyłączyć contracty na jakimś środowisku, ale nie warto raczej bo daje bardzo dobry backtrace. Jak dobrze kod obłożysz kontraktami to debug staje sie bardzo prosty. Na pewno warto.