🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: pl.comp.objects
Article #12310

Re: O, to ta grupa jeszcze istnieje?...

#12310
From: Sektor van Skijlen
Date: Fri, 21 Oct 2005 19:52
112 lines
7188 bytes
Dnia Thu, 20 Oct 2005 20:04:11 +0200, jarekr skrobie:
> > class_requires<is_base_and_derived<T,MyInterface>::value>();
> > class_requires<is_base_and_derived<U,My2<Y>>::value>();

> O znowu się czegoś dowiedziałem o C++ od Ciebie - dzięki (przyda mi się).
> Za czasów kiedy pisałem w C++ nijak na tak ładne rozwiązanie nie wpadłem 
> i nie znalazłem w sieci tego rozwiązania (wtedy boost jako "standard" 
> sie chyba dopiero rodził)

Nie no to jest tak wymyślone "naprędce". To całe is_base_and_derived to nawet
jest w boost::type_traits, ale class_requires to trzeba se zrobić samemu w
taki sposób, żeby się sypało podczas kompilacji gdy ...::value jest false.

> Jest tylko jedne kłopot - sądząc po googlu... to nie jest za często 
> stosowane.

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.

> 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.

> 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.

> 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.

> >>4) brainfuck
> > To chyba to, co brałeś przed napisaniem tego postu.
> To było odnosnie lukru syntaktycznego - brainfuck to język, który w 
> zasadzie nie ma lukru syntaktycznego.

No jak to - przecież wszystko jest na operatorach, nie ma w ogóle słów
kluczowych ;)))))

> Sorry, ale ten zarzut jest naprawde absurdalny dla mnie - bo akurat
> zaczynałem programowanie od assemblera i makroassemblera i długo (z pięknym
> uporem) C/C++ widziałem tylko jako mały lukier syntaktyczny :-)
> (kilkaset kilo makr do (dobrego) makroassemblera tworzy język cholernie 
> podobny do C (wizualnie).
> A jak pamiętam kiedyś zdobyłem piękny zestaw makr do C, które robiły 
> "prawie" C++.
>   (prawie (w obu przypadkach) to znaczy z dużymi problemami w 
> dziedzinach tak istotnych jak kontrola typów.. ale przynajmniej wizualne 
> podobieństwo dało się uzyskać)).

I chyba destruktorów, których nie jesteś w stanie zasymulować w C w żaden
sposób. A jest to bardzo istotny element C++.

> Konkretnie:
> To że genericsy javowe generują kod wynikowy taki jaki się daje uzyskać 
> bez ich stosowania to nie znaczy, ze jest to tylko lukier syntaktyczny.
> Wprowadzja dodatkową kontrole typów na poziomie kompilacji (po to je 
> wprowadzono) więc ten twój argument - zbijam.

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
właśnie "polimorfizm statyczny". W Javie nie ma żadnego statycznego
polimorfizmu; jest to dynamiczny polimorfizm z drobnym wsparciem statycznym.

-- 
//  _    ___         Michal "Sektor" Malecki <sektor(whirl)kis.p.lodz.pl>
\\ L_ |/ `|  /^\ ,()                         <ethourhs(O)wp.pl>
// \_ |\  \/ \_/ /\ C++ bez cholesterolu: http://www.intercon.pl/~sektor/cbx
"I am allergic to Java because programming in Java reminds me casting spells"
Technical Details
Message-ID: <djbgur$nua$1@kujawiak.man.lodz.pl>
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!mat.uni.torun.pl!news.man.torun.pl!newsfeed.pionier.net.pl!news.man.lodz.pl!not-for-mail
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>

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.man.lodz.pl!not-for-mail
From: Sektor van Skijlen <ethouris@pl.wp.spamu.lubie.nie.invalid>
Newsgroups: pl.comp.objects
Subject: Re: O, to ta grupa jeszcze istnieje?...
Date: Fri, 21 Oct 2005 19:52:59 +0000 (UTC)
Organization: LODMAN - Metropolitan Area Network in LODZ, Poland
Lines: 112
Sender: Michal Malecki <sektor@zly.kis.p.lodz.pl>
Message-ID: <djbgur$nua$1@kujawiak.man.lodz.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>
NNTP-Posting-Host: zly.kis.p.lodz.pl
Mime-Version: 1.0
X-Trace: kujawiak.man.lodz.pl 1129924379 24522 212.191.89.2 (21 Oct 2005 19:52:59 GMT)
X-Complaints-To: abuse@man.lodz.pl
NNTP-Posting-Date: Fri, 21 Oct 2005 19:52:59 +0000 (UTC)
User-Agent: tin/1.6.2-20030910 ("Pabbay") (UNIX) (SunOS/5.9 (sun4u))
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit