Article View: pl.comp.objects
Article #12314Re: O, to ta grupa jeszcze istnieje?...
From: Sektor van Skijlen
Date: Sat, 22 Oct 2005 00:43
Date: Sat, 22 Oct 2005 00:43
240 lines
12859 bytes
12859 bytes
Dnia Fri, 21 Oct 2005 23:26:13 +0200, jarekr skrobie: > Sektor van Skijlen napisał: > > 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ś) Ja tylko uzasadniam swoje zdanie. > 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. No jasne i co jeszcze. Patrzysz na to od dupy strony: nie porównuj tego z wzorcami C++, tylko porównaj to z tym, gdybyś sam ręcznie robił to, co generyki robią za ciebie. To znaczy, porównaj z kodem, który byś pisał rzeczywiście obiektowo, bez generyków. > 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) No to ci podałem przecież - możesz sobie użyć is_base_and_derived. Nawet chyba jeszcze jest jedna rzecz, o której zapomniałem - static_assert. Właśnie ma sypiącą się specjalizację dla parametru false. > 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ł). Wiesz, nie wiem, w jakiej firmie pracujesz/pracowałeś, że w ogóle takie rzeczy są możliwe. W mojej obecnej firmie w każdym razie takie coś nie miałoby szans dotrwać nawet do UT. W mojej poprzedniej firmie, w której trzeba przyznać, że panował niemalże totalny bałagan jeśli chodzi o tworzenie kodu, nie było żadnego procesu, planowanie było jedną wielką fikcją (no cóż to jest spóźnić się z release'm o dwa miesiące), pojęcie testowania jednostkowego było dopiero w fazie "a wiecie, mam taki pomysł" - ale przynajmniej była instytucja kierownika, nawet trochę nieformalna. I na przeciążanie operatorów trzeba było napisać specjalne podanie do kierownika (że tak powiem). Nie potrafię sobie wyobrazić, jak pracuje firma, w której każdy może sobie od niechcenia przeciążać operatory jak mu się podoba. > >>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 i bez których najczęściej nie da się napisać czytelnego i zrozumiałego kodu. > Dokładniej: > Makra, Pomińmy preprocesor. Poza koniecznością wykorzystania __FILE__ i __LINE__ (ewentualnie __FUNCTION__ w gcc) nie ma on w C++ prawie żadnych zastosowań. > meta programowanie, Tak jasne! Zastąpmy je znacznie bardziej zawodnym (i znacznie mniej wydajnym) dynamizmem. > operator overloading. No oczywiście, przecież ten poniższy kod jest bardzo czytelny: a.setVal(s.add(b.multiply(x.at(g.subtract(1))).divide(6))) Nie to co C++: a = s + (b * x[g-1])/6; > ( 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ć) Nie strzelaj lepiej, albo najpierw poćwicz trochę, jak chcesz trafiać. Obecnie prawie nikt nie korzysta z metaprogramowania tak naprawdę. Problem jest faktycznie rozdmuchany. Ale mocno korzystają z tego niektóre biblioteki i naprawdę to wszystko do czego powinno to być wykorzystywane. > 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 ... No, może w ogóle to od tego zacznijmy. Ja mam przede wszystkim poważne wątpliwości, czy taki gościu jest w stanie poprawnie używać generyków. Skoro nie będzie w stanie to nie będzie ich używał. Faktem jest, że ja ostatnio - co może nie było konieczne, ale szlag mnie trafia, jak widzę taki kod, zresztą na inspekcji ludzie byli tego samego zdania - poprawiłem takie oto kwiatki: const std::string& name = std::string( "/usr/name/bin" ); i tym podobne. > 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ć). Podejrzewam, że problemy, na które się natknąłeś są java-specific. W przypadku C++ jeśli miałem kiedykolwiek jakiekolwiek problemy z brzydkim kodem w C++, to były one tworzone przez ludzi, którzy albo byli wyślizgani w języku C i wszystko robili na chama, albo byli wyślizgani w Javie i wydawało im się, że w C++ też tak jest dobrze. > 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. Wychodzi jednak na to - jak wspomniałem - że prawdziwym problemem jest nie niebezpieczna potencjalnie właściwość języka, tylko zła organizacja pracy. Wygląda na to więc, że Java jest językiem dedykowanym dla firm typu "krzak", w których nie ma żadnej sensownej organizacji pracy. Z jednej strony to dziwne, skoro dla Javy wymyśla się tyle wypasionych technik zarządzania projektem. Z drugiej strony, to raczej nie dziwi, skoro Java wymusza stosowanie odśmiecacza, który - jak już nieraz zaznaczałem - potrafi skutecznie ukrywać błędy w oprogramowaniu. > > 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. Ja podejrzewam, że głównie te komplikacje wynikają z ograniczeń kompilatorów oraz chęci robienia niestandardowej konfiguracji (np. inne nazwy). Bez wypasionych ficzerów sterowania biblioteką, w najprostszej postaci, myślę że dałoby się to zrobić znacznie prościej. > > 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). No, chyba na tym się kończą podobieństwa. > 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. Zapominasz znów, że to są problemy Java-specific. W przypadku C++ jeśli kod "metowy" jest zły, to się po prostu nie skompiluje. Jak się skompiluje, to najczęściej oznacza, że jest dobry. Natomiast stosowanie metod dynamicznych, co jest bardzo powszeche w Javie, oznacza w praktyce konieczność robienia bardzo rozbudowanych testów jednostkowych zapewniających poprawność. Często też konieczność debugowania tego, czy te instrukcje w runtime poskładały się do kupy tak, jak powinny. > > 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 - Nie bardzo mi się chce wierzyć. Sam miałbym problemy z ich zaimplementowaniem, mając na uwadze dowolny poziom zagnieżdżania kontekstów wewnątrz jednej funkcji. > > 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* ? W każdym. Zużycie pamięci i mocy procesora. > 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). Nie wiem, może Java ma tak badziewne VM, że takie ulepszenie nie zrobiłoby jej róznicy. Ale nie mam pewności. Jeśli różnica w stosie 100 milionów intów to różnica pomiędzy 400 MB i 1.5 GB, to moim zdaniem gra była warta świeczki. > (OK. byłyby duże zmiany w refleksji - ale to jest ( w kontekście > porównania z C++) wewnątrzjavowy problem). No tak właśnie słyszałem, że to był jeden z głównych powodów. Z drugiej strony, ciekaw jestem w takim razie, jak wygląda refleksja w przypadku typu int. -- // _ ___ 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:
<djc203$8n3$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-mailReferences:
<nfhjk1hl02upbbv345glfvo4kc2fun0nfm@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> <djbmdd$i4e$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: Sat, 22 Oct 2005 00:43:47 +0000 (UTC)
Organization: LODMAN - Metropolitan Area Network in LODZ, Poland
Lines: 240
Sender: Michal Malecki <sektor@zly.kis.p.lodz.pl>
Message-ID: <djc203$8n3$1@kujawiak.man.lodz.pl>
References: <nfhjk1hl02upbbv345glfvo4kc2fun0nfm@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> <djbmdd$i4e$1@news.dialog.net.pl>
NNTP-Posting-Host: zly.kis.p.lodz.pl
Mime-Version: 1.0
X-Trace: kujawiak.man.lodz.pl 1129941827 8931 212.191.89.2 (22 Oct 2005 00:43:47 GMT)
X-Complaints-To: abuse@man.lodz.pl
NNTP-Posting-Date: Sat, 22 Oct 2005 00:43:47 +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