Nadal są ludzie na świecie, którzy nie używają jave generics w „zwykłym kodowaniu”. Mogę w to uwierzyć za pomocą szablonów C ++, ale ogólne? Nie są nawet trudne do nauczenia / używania. Poważnie najlepsze funkcje Java i C ++ to odpowiednio ogólne i szablony.
Najlepszym sposobem, aby przekonać ludzi do rzeczy, jest przekonujący argument, nie grożenie i racja.
Dopóki nie robisz czegoś takiego jak używanie szablonów jako języka programowania, parametryczny polimorfizm (generyczne / szablony) jest prawie na pewno dobry.
1. Unika kopiowania kodu.
To oczywiste, ale kod polimorficzny jest kodem ogólnym. Dlatego nazywa się to lekami generycznymi.
2. Obsługuje lepsze sprawdzanie statyczne.
Bez polimorfizm parametryczny skończyć pisanie takich rzeczy public Object clone()
lub public boolean equals(object b)
które są nie tylko obrzydliwości, mają typy, które nie dostarczają informacji o tym, co robią, i zawsze kończy się wyrzucanie wyjątków w każdym miejscu. Alternatywa dla parametrycznego polimorfizmu jest rzucana wszędzie
3. Nieparametryczny polimorfizm OOP zasadniczo nie jest w stanie poprawnie obsługiwać „metod binarnych”.
Używasz ich często.
4. To najlepsza praktyka
W Javie stosowanie ogólnych jest uważane za najlepszą praktykę (patrz Efektywna Java autorstwa Josh Bloch). Główni myśliciele C ++, tacy jak Sutter i Alexandrescu, również zachęcają do korzystania z szablonów do rozwiązywania różnych problemów.
5. Pasuje do paradygmatu OO.
Ludzie często tego nie zauważają, ale kombinacja podtypów i rodzajów generuje system DUŻO bardziej wyrazisty i zorientowany obiektowo niż jakikolwiek inny system z jednym z nich.
Rozważ miksy Scali. Są to miłe funkcje, które pozwalają łączyć obiekty z części składowych. Ogólne i szablony mogą symulować niektóre z tych korzyści. Załóżmy na przykład, że jeden z twoich obiektów korzysta z bazy danych. Dobry projekt pozwoliłby ci wydzielić dostęp do bazy danych do osobnej klasy. Jeśli zrobisz to dobrze, nie tylko pozwala to na wyśmiewanie magazynu danych (klucz do testowalności), ale także oznacza, że możesz dodawać alternatywne implementacje, takie jak ta nowa baza danych bez sql. Tutaj jednak możesz mieć problem, bez względu na to, z której implementacji korzystasz, uzyskasz różne możliwości obiektu biznesowego.
Generics na ratunek!
public class Business<S extends Datastore>{
private S store; ...
}
Teraz możesz zacząć statycznie różnicować swoje Business
obiekty w oparciu o możliwość korzystania z funkcji specyficznych dla bazy danych. Nadal potrzebujesz sprawdzania czasu wykonywania i przesyłania, ale możesz zacząć budować DUŻO lepszy kod.
i
6. Normalny kod nie istnieje.
Istnieją tylko trzy rzeczy we wszechświecie programowania:
- biblioteki,
- konfiguracje i
- zły kod.
Jeśli nie myślisz o swoim kodzie, jakby był biblioteką, masz poważne kłopoty, gdy zmieniają się wymagania dotyczące twojego projektu. Architektura jest (prawdopodobnie) sztuką projektowania dobrych interfejsów API.
Uważam to podejście za oszałamiające. Po przyzwyczajeniu się do programowania z typami sparametryzowanymi, nieużywanie ich sprawia, że wszystko jest uciążliwe. I Java i C ++ mają kilka trudnych miejsc, które pomagają naprawić.