Article View: pl.comp.objects
Article #12313Re: O, to ta grupa jeszcze istnieje?...
From: jarekr
Date: Fri, 21 Oct 2005 21:26
Date: Fri, 21 Oct 2005 21:26
148 lines
9047 bytes
9047 bytes
Sektor van Skijlen napisał: > Oczywiście, bo jest to znacznie mniej potrzebne, niż się ludziom wydaje. > Co więcej, jest to też często zabójcze! Nałożenie dowolnego ograniczenia na > typ-parametr powoduje od razu bardzo możliwe ograniczenia użycia takiego > wzorca. Przykładowo, pamiętam jak jakaś klasa używała własnego type-traita do > sprawdzenia, czy dany typ jest integer. A ja sobie zrobię np. własny typ > integer i co? Wiem, że powinienem się w takim przypadku "dopisać do listy" i > to rozwiązuje problem, ale z drugiej strony to może spowodować, że mój typ > będzier traktowany jak całkowity nawet jeśli spełnia "nie wszystkie" warunki. > > Jeśli już, to powinno się definiować w miarę możliwości osobne definicje dla > różnych kwalifikacji typów. > > W istocie w Javie to ograniczanie typów (tak samo zresztą jak w C#) bierze się > wcale nie stąd, że "ludzie potrzebują ograniczania typów", tylko stąd, że tego > wymaga runtime języka (inaczej: język nie będzie działał bez tych ograniczeń). > W przypadku Javy jest to bardzo proste przełożenie: jeśli używany typ nie ma > ograniczeń, to będzie implementowany przez Object; jeśli ma ograniczenie na > bycie wyprowadzonym z określonej klasy/interfejsu - wtedy będzie > implementowany przez referencję do tej właśnie klasy/interfejsu. Generyki > zapewniają ci tylko tyle, że zrobią za ciebie rzutowanie. Sektor ! To jest naprawdę wspaniałe jak mnie uczysz jak działają generyki w javie :-). (fakt, że przynajmniej technicznie trochę prawdy napisałeś) Ale "filozoficznie" - absolutnie sie nie zgadzam. Jeśli robię jakiś framework z użyciem generics i narzucam, ze jakiś tam typ X można konkretyzować tylko klasami które np. dziedziczą z jakiejś mojej klasy Y, implementują jakiś interfejs.. daje mi to konkretną kontrolę i możliwość w miarę bezpiecznej ewolucji frameworku. Mam pewność, ze jeśli ktoś czegoś tam nie odziedziczy to mu się kod nie skompiluje ( kontrola na zasadzie: akurat przypadkiem klasa Z ma metodę setValue() którą wywołuje to jak dla mnie nie jest szczęśliwe rozwiązanie) W przypadku C++ kilka razy się potknąłem o ten problem, fakt, głownie z powodu przeciążania operatorów. Zaskakująco dużo istotnych typów potrafi mieć przypadkiem pokryty operator + , -> czy inne takie. Niekoniecznie w sposób zgodny z tym jaki twórca generycznego kodu w którym się tego użyje przewidywał). >>Absolutnie źle mnie zrozumiałeś. W javie (genericsy) nie ma >>metaprogramowania ani trochę. > > > Aha, jeśli tak to się zgodzę. Nie sprecyzowałeś po prostu. > > >>I to jest zaleta. Przynajmniej patrząc na to co pamiętam z C++. > > > No nie wiem. Jak słyszę takie rzeczy, że w Javie czegoś brakuje, co ma C++ i > że to jest zaleta, to mnie dosłownie pusty śmiech ogarnia. Jeszcze większy, > jak się po jakimś czasie okazuje, że to zostało częściowo potem dodane, tak > jak było z generykami. Widzisz bo to właśnie był sens Javy (i obecna moja tendencja do unikania C++). Wyrypanie tych pięknych ficzerów: - bez których da się spokojnie żyć, - i z których umiejętnie korzystać potrafi 1% programistów, - i z których korzysta 50% reszty programistów absolutnie wypaczając sens Dokładniej: Makra, meta programowanie, operator overloading. ( strzelam, że obecnie mnóstwo ludzi korzysta z meta programowania do rozwijania prostych pętli ... co jak się nieumiejętnie robi (nie sprawdza) zabija wydajność zamiast poprawiać) Powiem więcej - mimo, że w mniejszych projektach nie mam oporów z korzystaniem z java generics... to przy większych projektach zespołowych w javie... prawdopodobnie optowałbym za nie korzystaniem z genericsów (w sensie tworzenia własnych typów). Czytelność i prostota kodu to jest element, którego nie można pominąć, a nie wiem czy chciałbym oglądać "generyczny" kod stworzony przez człowieka, który właśnie w swoim kraju przeszedł kurs "learn java in 21 hours". ( w zasadzie to w ogóle nie chciałbym pracować z żadnym kodem tworzonym przez takiego gościa ... niestety jakoś ciągle mnie i wszystkich znajomych ten problem spotyka i dotychczasową zaletą javy było to, że przynajmniej dawało się taki kod fragmentami zrozumieć i na szybkiego załatać). Operator overloading - już raz płakałem, że tego nie mam w Javie - ale zaraz zrozumiałem, że miałby to wtedy także konkretny, (absolutnie niegłupi, tylko bardzo *kreatywny* ) pan X. >>Poza tym, boost::mpl stracił w moich oczach dawno temu - jak niechcący >>zaglądnąłem do źródeł i zobaczyłem ile konstrukcji jest "sficzerowanych" >>chamskimi makrami. Prawda, że na oko 95% tych makr (a może troche więcej >>-ale na pewno nie wszystkie) to poprawki na problemy z kompilatorami >>(wyjątkowo często na msvc). > > > Nie masz się czym przejmować; boostowcy przesadzają z komplikowaniem kodu. To > jeszcze niczego nie oznacza. Jeśli to jest ta piękna biblioteka, która ma uratować C++ (standaryzacja) .. to wiele znaczy. >>To, że z C++ da sie zasymulować prawie dowolny język korzystając z makr >>i derektyw typu #pragma to fakt. Ale tak się składa, że w praktyce to >>może nie być zaleta :-). > > > Ale tu nie chodzi o makra; te są używane wyłącznie instrumentalnie. Da się to > wszystko napisać zupełnie bez makr, a nawet prościej. W metaprogramowaniu > chodzi głównie o wykonywanie operacji na wartościach i typach podczas > kompilacji. To nie wymaga jakichś specjalnych sztuczek, ani nie jest wcale tak > często stosowane. > > Ale mimo niewielu zastosowań jego istnienie jest nieocenione! Tym bardziej > zatem nie rozumiem, dlaczego jego brak w języku miałby być zaletą, skoro w > niczym nie przeszkadza. Zależy jak się na to patrzy. W Javie jest coś takiego jak instrumentacja, refleksja, generowanie kodu w runtime... załatwia się tym podobną klasę problemów co meta programowaniem w C++ (czyli dość specyficzne, mocno technologiczne problemy). Niestety, w praktyce załatwia się też całą masę problemów, które można zrobić zwyczajnie (korzystając z podstawowych własności każdego języka "obiektowego"). Taka, kurde.... moda. A potem kod się kompiluje pięknie tylko trzeba debugować, żeby odkryć czegoż to jeszcze nie dodaliśmy do naszej klasy, co akurat niejawnie używane jest w bibliotece XY. > > I chyba destruktorów, których nie jesteś w stanie zasymulować w C w żaden > sposób. A jest to bardzo istotny element C++. z tego co pamiętam destruktory miałem - ale nie ja pisałem te makra więc 100% pewności nie mam jak to było zrobione (musiałbym sie bardzo umotywować, żeby to teraz na starej amidze odnaleźć :-) ) > > Eeee tam. No dobrze - dodają statyczną weryfikację poprawności typu. Ale to > wszystko. > > Istotnym elementem wzorców w C++ jest ich "efficiency". Dlatego jest to Ale w jakim sensie *efficiency* ? To oczywiście była wielka kłótnia przy wprowadzaniu java generics jak to ma być kompilowane. W praktyce gdyby przyjęto model z C++ - kompilowaniem nowego kodu dla każdej konkretyzacji... to niewiele by się zmieniło (poza rozmiarami programów wynikowych). (OK. byłyby duże zmiany w refleksji - ale to jest ( w kontekście porównania z C++) wewnątrzjavowy problem). -- http://www.99-bottles-of-beer.net/language-java-866.html
Technical Details
Message-ID:
<djbmdd$i4e$1@news.dialog.net.pl>Path:
mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!mat.uni.torun.pl!news.man.torun.pl!newsfeed.pionier.net.pl!news.dialog.net.pl!not-for-mailReferences:
<nfhjk1hl02upbbv345glfvo4kc2fun0nfm@4ax.com> <dihb0j$pq6$1@kujawiak.man.lodz.pl> <rqutk1d9rjme4n7he8n4no5oqndc9kqgtj@4ax.com> <dj0v87$cv5$1@nemesis.news.tpi.pl> <03d8l1pfp4nnodpg9a6cseej1rk5obc6pp@4ax.com> <dj38jh$ot4$1@nemesis.news.tpi.pl> <65bal15agggp87dn5i76d97ahr0gbtpi5u@4ax.com> <dj3frf$q3u$1@atlantis.news.tpi.pl> <dj3tvl$e7f$1@kujawiak.man.lodz.pl> <1129820347.23956@kwintesencja.lan.mareon.com.pl> <dj8hca$1k7$1@kujawiak.man.lodz.pl> <dj8m6j$hc6$1@news.dialog.net.pl> <djbgur$nua$1@kujawiak.man.lodz.pl>Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!mat.uni.torun.pl!news.man.torun.pl!newsfeed.pionier.net.pl!news.dialog.net.pl!not-for-mail From: jarekr <jhratajski@popraw.literowki.pzcota.otne.pl> Newsgroups: pl.comp.objects Subject: Re: O, to ta grupa jeszcze istnieje?... Date: Fri, 21 Oct 2005 23:26:13 +0200 Organization: Dialog Net Lines: 148 Message-ID: <djbmdd$i4e$1@news.dialog.net.pl> References: <nfhjk1hl02upbbv345glfvo4kc2fun0nfm@4ax.com> <dihb0j$pq6$1@kujawiak.man.lodz.pl> <rqutk1d9rjme4n7he8n4no5oqndc9kqgtj@4ax.com> <dj0v87$cv5$1@nemesis.news.tpi.pl> <03d8l1pfp4nnodpg9a6cseej1rk5obc6pp@4ax.com> <dj38jh$ot4$1@nemesis.news.tpi.pl> <65bal15agggp87dn5i76d97ahr0gbtpi5u@4ax.com> <dj3frf$q3u$1@atlantis.news.tpi.pl> <dj3tvl$e7f$1@kujawiak.man.lodz.pl> <1129820347.23956@kwintesencja.lan.mareon.com.pl> <dj8hca$1k7$1@kujawiak.man.lodz.pl> <dj8m6j$hc6$1@news.dialog.net.pl> <djbgur$nua$1@kujawiak.man.lodz.pl> NNTP-Posting-Host: xdsl-7312.wroclaw.dialog.net.pl Mime-Version: 1.0 X-Trace: news.dialog.net.pl 1129929966 18574 84.40.137.144 (21 Oct 2005 21:26:06 GMT) X-Complaints-To: abuse@dialog.net.pl NNTP-Posting-Date: Fri, 21 Oct 2005 21:26:06 +0000 (UTC) User-Agent: Mozilla Thunderbird 1.0 (Windows/20041206) X-Accept-Language: pl, en-us, en In-Reply-To: <djbgur$nua$1@kujawiak.man.lodz.pl> Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit