Pracowałem nad dużą aplikacją Rails, w której korzystanie z funkcji zwrotnych ActiveRecord było powszechne i wstrząsające. Zapisanie rekordu często miało nieoczekiwane skutki uboczne i uzasadnienie systemu było wyzwaniem.
Jednocześnie widziałem, jak haczyki przynoszą dobre efekty w ramach dziedziczenia (np. Klasa nadrzędna używa metody szablonowej, aby umożliwić podklasom dodawanie wyspecjalizowanych zachowań bez konieczności znajomości wewnętrznych elementów nadrzędnych) oraz wtyczek (np. tryb emacs uruchamiający hak, gdy jest aktywowany, umożliwiając użytkownikom dodawanie niestandardowych zachowań wokół tego trybu).
Zdaję sobie sprawę, że aplikacja Rails i interpreter Lisp to bardzo różne systemy, ale jestem ciekawy, czy istnieją jakieś dobrze znane kryteria, na które ludzie zwracają uwagę przy podejmowaniu decyzji, czy haki są właściwym wyborem projektowym dla napotkanego problemu.
Wyskakuje na mnie temat przewidywalności. Niewłaściwe użycie haków wydaje się prowadzić do upiornej akcji na odległość i zaskakującego zachowania, podczas gdy dobre użycie może prowadzić do struktury, która jest przewidywalna bez ścisłego połączenia.
Ponieważ jestem jeszcze zaledwie kilka lat w mojej karierze programistycznej, pod wieloma względami uważam się za nooba i podejrzewam, że ludzie w tym temacie poświęcili wiele uwagi. Jakie wytyczne mogą pokierować tą decyzją?