Wytłumaczcie mi ten "porządek"

Wytłumaczcie mi ten "porządek"
Kerai
  • Rejestracja:ponad 16 lat
  • Ostatnio:ponad 2 lata
  • Lokalizacja:London
3

Ja pieprzę.. dobrze widzę? 4 strony [CIACH!] o tym, że Java jest be, bo nie można w niej pisać zdań zamiast kodu?

@up:

No i teraz pytanie: wolicie zeby taki szef dzialu HR (wasz klient, jakis end user) pisal jawna petle for z licznikami, czy ten przyklad ktory podalem, z mnozeniem stringow?
Wolę, żeby gość z HR nigdy nawet nie patrzył na mój kod i nie próbował go zrozumieć, a tym bardziej coś jeszcze do niego dopisywać. Swoje pierdółki może pisać w specjalnym języku przygotowanym dla humanistów, specjalnie osandboxowanym, żeby nic nie spierdolił... a ja tego jego "kodu" (a raczej zdań) na oczy nie chcę widzieć...

mućka napisał(a)

Tak, Olomogato, wiem ze tam jest petla, ale ja jestem devem, moj tata jest lekarzem, nie wie nic o petlach i go to nie obchodzi, a uzywa tak sprawnie jak ja.
srsly...

Olamagato
  • Rejestracja:ponad 16 lat
  • Ostatnio:około miesiąc
  • Lokalizacja:Polska, Warszawa
  • Postów:1058
0

Nie jestem pewien czy dobrze Cię zrozumiałem, ale najwyraźniej to co cię najbardziej męczy, to zwyczajna składnia. Pokazałem Ci przykład, że w Javie używając równie prostej składni można zrobić to samo co np. Groovy ma "wbudowane w język". To co w Groovym jest esencją składni w Javie jest jedynie cukierkiem składniowym, którego można użyć, albo nie użyć. Zarzuciłeś, że Java ma pewne znaki w składni, które jak uważasz są niepotrzebne. Masz oczywiście prawo mieć taki pogląd, ale weź pod uwagę co się stanie jeżeli w przykładzie, który podałeś zgubisz jeden znak np. plus, cudzysłów lub gwiazdkę, albo co gorsze wpiszesz inny znak. Podstawą dobrej składni jest to żeby prosta pomyłka, głupia literówka od razu sygnalizowała swoją obecność niemożliwością kompilacji. Słaba niejednoznaczna składnia pozwoli na zaakceptowanie takich pomyłek i skompilowanie ich jako kodu działającego niezgodnie z intencjami. A to jest już poważny problem. Są języki, które dają duże możliwości w jak najkrótszym kodzie, ale odwrotnie proporcjonalnie rośnie w nich szansa na to, że pomyłka zostanie zaakceptowana jako prawidłowy kod (np. języki wsadowe - popatrz na płace ludzi piszących w bashu:). Nie tylko w trakcie parsowania go przez analizator, ale co gorsze w trakcie czytania go przez człowieka, który szuka błędu. Im mniejszą szansę na to daje składnia tym lepiej dla wszystkich. I Java ma taką właśnie składnię. Prostą, krótką, łatwą do nauczenia, łatwą do zrozumienia i łatwą do wyłapania błędów.

A co do zapuszczania się w inne języki - dlaczego zakładasz, że w Javie piszą ludzie, którzy nauczyli się tylko tego i nic więcej nie dotknęli? Wybrałem Javę jako swój najlepszy uniwersalny wybór po 20 latach eksperymentów z kilkudziesięcioma językami, wysoko-, średnio- i niskopoziomowymi. Są lepsze języki niskopoziomowe i wysokopoziomowe (których używam), ale na tą chwilę, moim zdaniem, nie ma lepszego uniwersalnego.
Porównujesz języki wysokopoziomowe z Javą. Ale żaden z języków, które tak chwalisz nie wykona pewnych rzeczy, które w Javie są możliwe, nawet łatwe.

Miłego Nowego Roku.


Jeżeli ktoś komuś coś, ewentualnie nikt nikomu nic, to właściwie po co...?
0

Java ma dla mnie ważną zaletę : JAVA ME. :)
W połączeniu z Netbeans i wtyczką do Javy Me mogę łatwo, wizualnie tworzyć aplikacje na telefon :) :P

szypxx
Android lepszy :)
Sarrus
  • Rejestracja:prawie 14 lat
  • Ostatnio:11 dni
  • Postów:2512
0

Ja javy nie lubię, bo brakuje rzeczy, które polubiłem już pisząc w C++, takich jak przeładowania operatorów (szczególnie pomocne jest []) i brak typów unsigned (sic!). Ma natomiast jedną na pewno fajną rzecz, a mianowicie jawnie deklarowane rzucane wyjątki przez metodę, która ich nie obsłużyła.

Odkąd piszę w C#, to unikam javy, ze względu m. in. na brak udogodnień takich jak właściwości czy wyrażeń lambda i LINQ

0
Olamagato napisał(a)

I Java ma taką właśnie składnię. Prostą, krótką, łatwą do nauczenia, łatwą do zrozumienia i łatwą do wyłapania błędów.

Jestes pewien? Powiedz to temu Panu (java.lang.Enum):
<code=java
public abstract class Enum<E extends Enum<E>>
implements Comparable<E>, Serializable {

Kopiuj
lub temu (java.util.Collections):
```java
public static <T extends Comparable<? super T>> void sort(List<T> list) {

Zrob ankiete i sprawdz ilu jest programistow Javy w tym dziale ktorzy rozumieja co jest grane - wielu ich nie bedzie, a to jest zdaje sie najwieksze forum programistyczne w Polsce. A sa to tylko pierwsze z brzegu przypadki z JDK.
Nie, moja bolaczka nie jest prosta skladnia (nie jest moim zdaniem prosta, ma wiele dziwnych przypadkow i zawilosci), to nie jest wcale moim wymaganiem - jestem devem i to jest miedzy innymi moja praca, aby takie rzeczy rozumiec. Moim pragnieniem jest jezk ktory jest ekspresywny. O Javie tego nie mozna powiedziec.

Olamagato napisał(a)

Porównujesz języki wysokopoziomowe z Javą. Ale żaden z języków, które tak chwalisz nie wykona pewnych rzeczy, które w Javie są możliwe, nawet łatwe.

Chcesz mi powiedziec, ze co jest mozliwe w Javie nie jest mozliwe w Groovy? Chcesz mi powiedziec, ze w Pythonie nie da sie pisac nizej-poziomowych rzeczy (tak jak z Java, liby pisane w np. C).

gość serwisu napisał(a)

Java ma dla mnie ważną zaletę : JAVA ME. :)
W połączeniu z Netbeans i wtyczką do Javy Me mogę łatwo, wizualnie tworzyć aplikacje na telefon :) :P

Brawo. Java ME ma skladnie i liby na poziomie JDK 1.3 albo i starszego. Co za tym idzie, nie ma mozliwosci uzywania innych jezykow, poniewaz to nie wystarcza, platforma jest zbyt ograniczona. Oczywiscie, da sie inaczej - Symbian wspiera w jakimstam topniu Pythona, Android wspiera wiele jezykow ktorych targetem jest JVM, plus Pythona i inne skryptowe. Mysle ze powinienes zaczac sie rozgladac za czyms nowszym niz Midlety.

Sarrus napisał(a)

Ma natomiast jedną na pewno fajną rzecz, a mianowicie jawnie deklarowane rzucane wyjątki przez metodę, która ich nie obsłużyła.

Na ten temat sa wojny religijne, ja akurat jestem zatwardzialym przeciwnikiem ;d Ale nie zaczynajmy tego watku, juz za duzo zostalo na ten temat napisane.

Sarrus napisał(a)

Ja javy nie lubię, bo brakuje rzeczy, które polubiłem już pisząc w C++, takich jak przeładowania operatorów (szczególnie pomocne jest []) i brak typów unsigned (sic!).(...) Odkąd piszę w C#, to unikam javy, ze względu m. in. na brak udogodnień takich jak właściwości czy wyrażeń lambda i LINQ

Dokladnie o takie odogodnienia w jezyku mi chodzi. C# jest tez dosc elastyczny, ale wole F# ;d

Mi nie chodzi o to ze Java jest najgorszym shitem - bo nie jest. Ja jestem sam programista (glownie) Javy i lubie ja jako platforme. Chodzi mi o to ze Java nie jest do wszystkiego, jest zbyt sztywna i ograniczona pod wzgledem skladniowym. Ogranicza ja rowniez kompatybilnosc wsteczna za wszelka cene - chociazby Genericsy. W .NET sa one 'reifiable', czyli w runtimie jest wiadomo jaki typ dany kontener trzyma.
U nas w firmie jest do napisania bardzo duzo rzeczy (o ktorych juz napisalem) ktore sa customizowalne przez uzytkownikow bad support itp. (tak, jesli ktos jeszcze sie nie domyslil taki kod jest rowniez testowany, i jeden z uporem maniaka usiluje mi powiedziec ze skryptow nie da sie osandboxowac, robiac duzy blad) i do tego Java sie po prostu nie nadaje.
Sa cale firmy ktore pisza w 2 dni prototypy skomplikowanych aplikacji webowych w RoR, Grails, Django czy innych - jestesmy jedna z nich. Java nie daje takich mozliwosci. Moj apel jest taki ze kazdy powinien znac jakies inne jezyki programowania, a nie ograniczac sie tylko do jednego. Moze nie ty, Olo, ale w tym watku wypowiada sie wystarczajaco wiele osob ktore znaja tylko jeden paradygmat programowania i jezyki bazujace na blokach w klamrach.

Olamagato napisał(a)

Miłego Nowego Roku.

Wzajemnie.

Kerai
Argumentem dla sort musi być lista, której typ generyczny T implementuje Comparable, którego typ generyczny jest nadklasą T (lub samym T) [edited]
0

No wlansie, komentarz Keraia jest dobra odpowiedzia na jasnosc przejrzystosc i latwosc skladni Java od wersji 5.

Wibowit
  • Rejestracja:około 20 lat
  • Ostatnio:około 2 godziny
0
Kopiuj
public static <T extends Comparable<? super T>> void sort(List<T> list) {

Argumentem dla sort musi być lista, której typ generyczny T implementuje Comparable, którego typ generyczny jest nadklasą T (lub samym T) - trochę bez sensu

No wlansie, komentarz Keraia jest dobra odpowiedzia na jasnosc przejrzystosc i latwosc skladni Java od wersji 5.

Chyba macie dziurę zamiast mózgu. Toż to zwykła metoda generyczna w 100 % poprawna.

Jeżeli mamy dwa typy:
A - wyżej w hierarchii
B - niżej w hierarchii
to Comparator[B] nie może porównać obiektów A, ale Comparator[A] może porównać obiekty typu B. Dlatego w zapisie typu metody generycznej jest Comparable[? super T].

Inaczej mówiąc: jeśli umiem posortować dowolne meble, to umiem posortować też krzesła, ale jak umiem sortować krzesła, to niekoniecznie umiem posortować dowolne meble.

I akurat ten przykład jest bardzo prosty. Polecam przejrzenie biblioteki standardowej Scali czy Haskella, aby sobie zobaczyć ładniejsze typy metod.

Jestem w 100% za statycznym, silnym i elastycznym typowaniem. Pozwala to wyeliminować ogromną ilość błędów już na etapie kompilacji. Oczywiście konieczność pisania rozwlekłych typów w Javie jest męcząca i zwykle zbędna, jednak mamy Scalę, która z powodzeniem inferuje sobie typy w znakomitej większości przypadków. Zresztą kompilatory zwykłej Javy też inferują sobie czasem (rzadko, choć np w Javie 7 jest diamond operator czyli trochę więcej inferencji) typy, chociażby właśnie w przedstawionym przypadku metod generycznych (gdzie przecież zwykle nie parametryzujemy tych metod explicite).


"Programs must be written for people to read, and only incidentally for machines to execute." - Abelson & Sussman, SICP, preface to the first edition
"Ci, co najbardziej pragną planować życie społeczne, gdyby im na to pozwolić, staliby się w najwyższym stopniu niebezpieczni i nietolerancyjni wobec planów życiowych innych ludzi. Często, tchnącego dobrocią i oddanego jakiejś sprawie idealistę, dzieli od fanatyka tylko mały krok."
Demokracja jest fajna, dopóki wygrywa twoja ulubiona partia.
edytowany 3x, ostatnio: Wibowit
0

Gosciu, przeciez jest jasno napisane ze te przyklady sa 100% poprawne, przeciez napisalem skad pochodza (JDK, podalem nawet klasy).
Po co ogladac trudniejsze, jak wiekszosc ludkow tutaj nie umie tego rozszyfrowac - Kerai dal przyklad, on nawet nie widzi sensu tej deklaracji.
Nie wiem po co zaczynasz o statycznym typowaniu, ta dyskusja nie dotyczy tego wcale. A generici da sie zrobic inaczej, zobacz np. na .NET. Sam Odersky na jednym z wykladow na ktorych akurat bylem przeprosil publicznosc za potworki ktore nazywaja sie Java Generics, jako ze maczal w tym palce, poczynajac od Pizza, przez Generic Java, przez to co mamy od Javy 5, az do Scali. Tam lepiej nie jest. A faktem jest natomiast ze niektore definicje sa tak skomplikowane, ze nawet oficjalny Javadoc zostal 'spimpowany' aby normaly user tego nie widzial - poszukaj w necie, poznasz linki i przyklady.

Wibowit
  • Rejestracja:około 20 lat
  • Ostatnio:około 2 godziny
0

Nie rozumiem: ktoś pisze np systemy klasy enterprise, a nie wie kiedy zastosować super zamiast extends?

W CA byłem i widziałem kod bez genericsów, z drabinkami ifów zamiast (enumów i) switchów, z hierarchią interfejsów ze stałymi w środku (w interfejsach w Javie stałe są tylko statyczne, a więc niedziedziczone). Jeśli będziemy się przez kolejne np 50 lat przejmować, że durnie dalej nie wiedzą nawet jak Javę 5 poprawnie zastosować to daleko nie zajdziemy.

Owszem można olać całkowicie statyczne typowanie i zrobić dynamiczne, ale wtedy jest gorzej, bo łatwiej jest z początku, a potem jest znacznie trudniej niż przy dobrym statycznym typowaniu.

A jeśli chodzi o .NET to tam też jest rozróżnienie, tak samo jak w Javie i Scali, na kowariancję i kontrawariancję: http://msdn.microsoft.com/en-us/library/dd799517.aspx
Jeśli chodzi o comparatory to różnica jest taka, że w .NETu kontrawariancja jest zaznaczona w deklaracji comparatora, a nie metody sort (co wydaje się bardziej logiczne, przynajmniej na pierwszy rzut oka).
Kontrawariantnie otypowany comparator w C#: http://msdn.microsoft.com/en-us/library/4d7sx9hd.aspx


"Programs must be written for people to read, and only incidentally for machines to execute." - Abelson & Sussman, SICP, preface to the first edition
"Ci, co najbardziej pragną planować życie społeczne, gdyby im na to pozwolić, staliby się w najwyższym stopniu niebezpieczni i nietolerancyjni wobec planów życiowych innych ludzi. Często, tchnącego dobrocią i oddanego jakiejś sprawie idealistę, dzieli od fanatyka tylko mały krok."
Demokracja jest fajna, dopóki wygrywa twoja ulubiona partia.
edytowany 3x, ostatnio: Wibowit
0

Czekaj, Ty twierdzisz ze ja nie rozumiem tego przykladu? Sory za glupie pytanie, ale nie do konca czaje do kogo pijesz. Jesli do mnie to niepotrzebnie, bo ja doskonale rozumiem ten zapis, jak i wiele innych, bardziej skomplikowanych. Czego nie mozna powiedziec o wielu innych 'PROgramistach', rowniez z tego forum. U mnie w firmie nikt nie czai kiedy extends a kiedy super, kowariancja / kontrawariancja to sa pojecia z Matrixa, niektorzy nawet nie wiedza ze mozna dac super w tym miejscu. Co tylko swiadczy o jednym z dwoch:

  1. Java ma trudna skladnie, co przeczy twierdzeniu Olo.
  2. Jeff Atwood w swoim artykule o FizzBuzz mial racje szacujac ze 99% 'programistow' nie umie programowac. Moze nawet znaja skladnie, ale juz nie umieja jej zastosowac.
Kerai
edit42: nie wiem co chciałem dopisać o tym sensie, tę deklaracją doskonale rozumiem i widzę sens, coś mi się chyba pomyliło.
Wibowit
  • Rejestracja:około 20 lat
  • Ostatnio:około 2 godziny
0

Oczywiście, że do ciebie mam pretensje. Masz nierealne żądania dotyczące stworzenia języka statycznie typowanego, który jest zwięzły i ma trywialną semantykę. To jest niemożliwe. A w każdym razie jeszcze nikt takiego nie wymyślił. Każdy zwięzły język statycznie typowany jest trudny do opanowania i tak już pozostanie. Kropka. To, że inni mają IQ pantofelka nie znaczy, że mam się zniżać do ich poziomu.

Ktoś może wybrać język dynamicznie typowany, bo pozwoli mu to na szybsze stworzenie czegoś skomplikowanego i nie musi tracić np roku czasu na wpojenie sobie trudnej semantyki jakiegoś zwięzłego języka statycznie typowanego, ale po jakimś czasie na tym straci, bo np będzie musiał poświęcić 20 % - 50 % więcej czasu na szukanie błędów, które nie zostały wyłapane na etapie kompilacji. Jeśli np szukanie błędów zajmuje połowę czasu tworzenia aplikacji, to rachunek jest prosty - chodzenie na skróty nie opłaca się.

Genericsy. W .NET sa one 'reifiable', czyli w runtimie jest wiadomo jaki typ dany kontener trzyma.

Hmm, a taki scenariusz:
List<Krzesło> listK = pustaLista;
List<Mebel> listM = listK;
listM.add(new Stolik());
Krzesło coToJest = listK.get(0);
?
Pod Javą się nie skompiluje, jak pod .NETem?


"Programs must be written for people to read, and only incidentally for machines to execute." - Abelson & Sussman, SICP, preface to the first edition
"Ci, co najbardziej pragną planować życie społeczne, gdyby im na to pozwolić, staliby się w najwyższym stopniu niebezpieczni i nietolerancyjni wobec planów życiowych innych ludzi. Często, tchnącego dobrocią i oddanego jakiejś sprawie idealistę, dzieli od fanatyka tylko mały krok."
Demokracja jest fajna, dopóki wygrywa twoja ulubiona partia.
edytowany 2x, ostatnio: Wibowit
iooi
Komentarz: skoro List jest kowariantny w T, a argument List.add - kontrawariantny, a C# ma normalne genericsy, to takiej klasy pewnie nawet nie da się stworzyć. W przeciwnym wypadku C# wcale nie ma takich wspaniałych genericsów. EDIT: Taka klasa rzeczywiście nie istnieje. T w List<T> jest inwariantne i tak samo jak w Javie, nie kompiluje się.
0

Dzieki za komplement co do mojego IQ, nigdy nie myslalem ze mam az tyle co pantofelek - you made my day. Nie wiem co ma skladnia i statyczne typowanie do DSL i tego o czym byla mowa. Nie wiem rowniez dlaczego to do mnie pretensje i to ja jestem glupi ... wroc... madry jak pantofelek, skoro ja tylko podalem przyklad na to ze skladnia Javy nie jest prosta. Ale ok, jakos bede z tym zyl.
W .NET sie nie skompiluje.
Tak tak, edytowac komentarze ktore zdradzaja ze sie malo wie aby zatrzec slady jest latwo. Juz wiem dlaczego wszyscy sie rejestruja.

Wibowit
  • Rejestracja:około 20 lat
  • Ostatnio:około 2 godziny
0

Czytaj ze zrozumieniem - nigdzie nie napisałem o twoim IQ.

DSL to był raczej OT w tym wątku, dlaczego mam się tylko do tego odnosić?

Tak tak, edytowac komentarze ktore zdradzaja ze sie malo wie aby zatrzec slady jest latwo. Juz wiem dlaczego wszyscy sie rejestruja.

Edytuję, bo nie mam kompilatora w głowie. Chyba proste, nie?

Ludzie się rejestrują po to, aby żaden baran się pod nich nie podszywał. Widocznie za krótko na tym forum jesteś i nikt ci tak nie zrobił.


"Programs must be written for people to read, and only incidentally for machines to execute." - Abelson & Sussman, SICP, preface to the first edition
"Ci, co najbardziej pragną planować życie społeczne, gdyby im na to pozwolić, staliby się w najwyższym stopniu niebezpieczni i nietolerancyjni wobec planów życiowych innych ludzi. Często, tchnącego dobrocią i oddanego jakiejś sprawie idealistę, dzieli od fanatyka tylko mały krok."
Demokracja jest fajna, dopóki wygrywa twoja ulubiona partia.
0

Akurat o tym edytowaniu nie bylo do Ciebie tylko Keraia - on edytowal swoj komentarz w ktorym twierdzil ze deklaracja Collections.sort jest 'troche bez sensu'. Tekst o tym ze tylko po to wiara sie rejestruje byl zarcikiem, wrzuc na luz, nowy rok sie zaczal, a Ty juz taki zestresowany.
Na forum jestem od kilku lat, aktualnie jako mućka, i jeszcze pare innych by sie od czasu do czasu znalazlo. W nosie mam czy sie ktos pode mnie podszywa - zawsze moge sobie wymyslic nowy nick tymczasowy i pisac dalej.

Olamagato
  • Rejestracja:ponad 16 lat
  • Ostatnio:około miesiąc
  • Lokalizacja:Polska, Warszawa
  • Postów:1058
0
mućka napisał(a)

Jestes pewien? Powiedz to temu Panu (java.lang.Enum):
<code=java
public abstract class Enum<E extends Enum<E>>
implements Comparable<E>, Serializable {

Kopiuj

**A wiesz jak wygląda próba zdefiniowania typu int za pomocą C? Albo jak wygląda próba zdefiniowania odpowiednika enum w Groovy?**
Próbowałeś kiedykolwiek podejść do czegoś takiego? Nie sądzę.
Projektanci Javy 1.5 akurat w tym przypadku spróbowali. I choć bardzo zawile, to jednak coś w ten sposób osiągnęli.
Choć moim skromnym zdaniem jest to bez sensu bo podstawowe interfejsy języka tak jak wszystkie inne elementy języka jako takiego powinny być zdefiniowane w jego specyfikacji, a nie w czymś co jest niby "pre-biblioteką" biblioteki standardowej. Typy enum powinny być w całości w jego specyfikacji tak samo jak enum w Groovy czy tablice w Javie.
Podałeś więc wyjątkowo niemiarodajny przykład jako argument bo jedyne czego on dowodzi, to tego, że teoretycznie można spróbować zdefiniować sporą część Javy w Javie. Coś co w wielu językach jest niemożliwe z definicji.


> 
```java
public static <T extends Comparable<? super T>> void sort(List<T> list) {

Kod parametryzowany w żadnym języku nie wygląda zbyt ładnie, ani zbyt treściwie. Parametry w Javie w ogóle nie miały być w projekcie języka bo miał je zastąpić ty Object. Nic więc dziwnego, że składnia pochodząca z C++ oraz ograniczenia związane ze zgodnością w dół dały to co dały. Java jak każdy długo istniejący ma spory narzut czasu, który odbija się w składni.
Można zrobić nową Javę, która nie będzie miała żadnych narzutów z przeszłości. Być może ktoś się o to kiedyś pokusi. Na razie jednak miliony wierszy kodu jakie powstały żeby pracować na więcej niż setce zupełnie różnych procesorów i więcej niż tysiącach różnych urządzeń nie pójdą do kosza bo komuś nie chce się utrzymać zgodności z nim.

Niestety muszę kończyć, więc może później coś dopiszę jeszcze w jakimś innym poście odnośnie tego co chciałem, a nie mogę teraz. :)


Jeżeli ktoś komuś coś, ewentualnie nikt nikomu nic, to właściwie po co...?
0

Juz nie dopisuj, ja wymiekam.
Nie wiem dlaczego tylko zakladasz ze nie pisalem tego w C ani tamtego w Groovy, ale niech bedzie. Wygrales.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.