ogólne programowanie, jak często jest używane w przemyśle

11

Obecnie zajmuję się programowaniem w środowisku akademickim, więc mogę korzystać z wszystkiego, co chcę. Korzystam z biblioteki grafów boost do kilku rzeczy i zastanawiam się, czy warto zainwestować w głębsze zrozumienie GP.

Jestem ciekawy - czy programowanie ogólne (GP) jest często używane w przemyśle? Domyślam się, że większość programistów jest znacznie wygodniejsza w OOP lub używa języków, które nie podkreślają ani nie obsługują GP, więc poza wywoływaniem struktur / funkcji danych STL w C ++, mam wrażenie, że GP nie jest często używana w praktyce. Ale będąc obecnie poza przemysłem, miło byłoby usłyszeć od praktyków na ten temat.

(pisząc to, widzę, że programowanie ogólne nie jest nawet prawidłowym znacznikiem!)

bd1
źródło
Dystrybucja znaczników na StackOverflow jest prawdopodobnie znacznie bardziej użyteczna jako dowód statystyczny niż ten tutaj. Zobacz stackoverflow.com/questions/tagged/generic-programming , stackoverflow.com/questions/tagged/generics
Péter Török

Odpowiedzi:

7

Jestem ciekawy - czy programowanie ogólne (GP) jest często używane w przemyśle?

Jest to bardzo szeroko zależne od kontekstu zespołu i projektu.

Na przykład w grach wideo kod jest często „najprostszy” z możliwych (a czasem nawet zbyt prosty), ale w dużych architekturach. Wynika to z faktu, że twórcy gier mają wiele problemów do rozwiązania i nie chcą zawracać sobie głowy meta programowaniem (jest to osobny, bardzo abstrakcyjny i trudny do zrozumienia język wewnątrz C ++).

Jednocześnie podstawowe użycie szablonów jest powszechne nawet w tych sklepach, a niektóre optymalizacje oparte na szablonach można zobaczyć w niektórych bardzo specyficznych funkcjach niektórych silników.

Ale w twórcach gier większość osób po prostu uniknie metaprogramowania.

Teraz, z drugiej strony, niektóre naprawdę złożone lub ciężkie aplikacje przetwarzania, które nie są powszechne, wymagają pewnego rodzaju ciężkiego metaprogramowania ze względu na wymagania dotyczące wydajności i elastyczności (w czasie kompilacji), które nie są powszechne. Pracuję teraz w jednym.

To nie jest powszechne, ale istnieje, a niektóre domeny niszowe (w niektórych osadzonych kontekstach naukowych lub krakujących numery) wymagają od ludzi dużej wiedzy na temat metaprogramowania lub chęci uczenia się.

Pośrodku większość ludzi po prostu użyje metaprogramowania jako „klient”, a nie jako „projektant”. Większość metaprogramowania jest zawarta w bibliotekach, ponieważ biblioteki są narzędziami do kodu i co jest lepszego niż biblioteka, która może dostosować się do niestandardowych typów, z którymi pracujesz do tej pory?

Boost (http://boost.org) to zestaw bibliotek, niektóre z nich są wykonane z ciężkiej czarnej metaprogramowania czarnej magii i są używane w wielu sklepach C ++ jako „STL ++”, rozszerzenie STL (i tak jest). Nie każdy sklep korzysta z niego z kilku powodów, takich jak kompatybilność z kompilatorem (niektóre biblioteki rozszerzeń mogą sprawić, że Twój kompilator będzie błagał o wybaczenie za każdym razem, gdy zranił twoje odczucia ...) i częściej, ponieważ niektórzy programiści nie lubią nie być w stanie zrozumieć jak działa narzędzie w środku (spróbuj zrozumieć Boost.Spirit ...)

Niezależnie od tego, dla jakich firm będziesz pracować, niektórzy wykorzystają ten paradygmat, inni będą mniej lub wcale, a nawet ich zabraniają.

Nie ma zgody, ponieważ nikt nie ma takich samych potrzeb, kontekstu lub zespołu.

Ale nadal, oczywiście, jest używany. Może zapytasz, kto używa boosta na swojej liście mailowej, aby mieć więcej przykładów z prawdziwego świata?

Klaim
źródło
1
+1 dla klienta kontra projektanta. Z mojego doświadczenia wynika, wystarczająco kilku deweloperów zrozumieć ich realizacji, że nie ma sensu tworzyć nowego kodu rodzajowe we wniosku, chyba że robi dużą poprawę w konserwacji. Biblioteki zaprojektowane do szerokiego ponownego użycia podlegają tym warunkom znacznie częściej niż poszczególne aplikacje.
Karl Bielefeldt,
Dziękuję za szczegółową odpowiedź. Sam jestem fanem Boost i zastanawiam się, czy zagłębić się w BGL, który wymaga znacznie większej wiedzy GP niż inne biblioteki Boost, co skłoniło mnie do tego. Twój komentarz na temat świata tworzenia gier jest dość intrygujący. Jestem zdumiony osiągnięciami rozwojowymi współczesnych gier i ciekawe jest, że prawdopodobnie są one izolowane od nowszych metod programowania, a nie na ich czele.
bd1
Cóż, twórcy gier zarządzają wysokim stopniem złożoności, po prostu tworząc architekturę koncepcji gier. Dodanie meta instrukcji tylko komplikuje wszystko, więc musi być naprawdę dobrze uzasadnione. Drugą rzeczą jest to, że wiele twórców gier działa na konsolach, które są bardzo specyficznym sprzętem z bardzo specyficznymi kompilatorami, które nie pozwalają na wszystko, co próbuje ulepszyć (na przykład, bez wyjątku lub braku wielokrotnego dziedziczenia lub nie działa poprawnie z dokumentu kompilator (prawdziwa historia). Są więc dobre powody.
Klaim
5

Jestem ciekawy - czy programowanie ogólne (GP) jest często używane w przemyśle?

Programowanie ogólne, nazywane naukowo polimorfizmem parametrycznym , jest bardzo często stosowane w terenie. W mojej firmie używamy go głównie do tworzenia niezależnych edytorów danych, niezależnie od ich rodzaju. Po prostu nie potrzebujesz go tak często, jak innych funkcji, ale jest to zdecydowanie funkcja, której nie chciałbym przegapić. Używasz go, gdy zachowanie pasuje do dużej liczby typów. Jest to wyraźny znak, że potrzebujesz leków ogólnych, gdy wielokrotnie piszesz ten sam kod dla różnych typów.

Domyślam się, że większość programistów jest znacznie wygodniejsza w OOP lub używa języków, które nie podkreślają ani nie obsługują GP, więc poza wywoływaniem struktur / funkcji danych STL w C ++, mam wrażenie, że GP nie jest często używana w praktyce.

Przynajmniej z mojego doświadczenia twój punkt widzenia jest błędny. OOP i programowanie ogólne nie wykluczają się wzajemnie. W rzeczywistości powinieneś wykorzystać efekty synergii, łącząc je. Jak wspomniałem wcześniej, powodem, dla którego nie widzisz go tak często jak innych technik, jest to, że nie potrzebujesz go tak często. Ale jest to silna cecha, która ma, i bardzo pomaga w utrzymaniu SUCHEGO kodu . Które języki tak naprawdę nie podkreślają wsparcia GP w programowaniu wysokiego poziomu? 3 z 5 języków Tiobe Top 5 obsługuje ogólne / szablony. PHP jest dynamicznie wpisywane, więc tak naprawdę ich nie potrzebuje. Więc co?

Sokół
źródło
punkt, nie miałem na myśli sugerowania, że ​​OOP i GP są wyborem / albo. Jednak wiele projektów, które widziałem, wydają się być ściśle związane z OOP w Javie. Myślę, że nowsze wersje Java obsługują GP, ale jaka część programistów Java naprawdę korzysta z tej funkcjonalności? Jak powiedziałem, nie pracuję w przemyśle, a moja perspektywa może być wypaczona, dlatego zadałem pytanie.
bd1
@ bd1: Starsze aplikacje, które zostały napisane przed wersjami ogólnymi obsługiwanymi przez Javę lub przed określonym zestawem narzędzi obsługiwanych, że wersja Java nie będzie zawierała generycznych wersji, a programiści mogą nadal unikać generycznych wersji tego konkretnego projektu, aby zachować spójność kodu. Widziałem to i różni się w zależności od projektu i deweloperów. Wszelkie projekty, które widziałem, a które rozpoczęły się po wsparciu dla generycznych programów Java, były szeroko rozpowszechnione i często z nich korzystano, w stosownych przypadkach.
FrustratedWithFormsDesigner
@FrustratedWithFormsDesigner: Ogólne w Javie są całkowicie różne od szablonów C ++. Generics Java to 100% czysty cukier syntaktyczny i nie obsługują metaprogramowania.
kevin cline
„OOP i programowanie ogólne nie wykluczają się wzajemnie.”: Rzeczywiście, oba są formami polimorfizmu, odpowiednio ad-hoc i polimorfizmu parametrycznego. Są to więc dwa różne narzędzia do różnych rodzajów polimorfizmu.
Giorgio
4

Szablony C ++ są szeroko stosowane do rzeczy innych niż kontenery - przynajmniej w mojej dziedzinie problemów (finanse ilościowe). Zaryzykowałbym nawet stwierdzenie, że czasami jest on zbyt często wykorzystywany do celów, w których wystarczyłyby zwykłe stare funkcje wirtualne (i nie wydłużyłoby to zbytnio czasu kompilacji).

Ludzie używają go, aby uniknąć powielania kodu i osiągnąć polimorfizm w czasie kompilacji (bez wirtualnej wysyłki).

quant_dev
źródło