Ostatnio na Stack Overflow pojawiła się grupa Perl-hate, więc pomyślałem, że przyniosę moje pytanie „ Pięć rzeczy, których nienawidzisz w swoim ulubionym języku ” do Stack Overflow. Wybierz swój ulubiony język i powiedz mi pięć rzeczy, których w nim nienawidzisz. Mogą to być rzeczy, które Cię denerwują, przyznają się do wad projektowych, rozpoznanych problemów z wydajnością lub dowolnej innej kategorii. Musisz go tylko nienawidzić, a to musi być twój ulubiony język.
Nie porównuj go do innego języka i nie mów o językach, których już nienawidzisz. Nie mów o tym, co lubisz w swoim ulubionym języku. Chcę tylko usłyszeć rzeczy, których nienawidzisz, ale tolerujesz, abyś mógł używać wszystkich innych rzeczy i chcę usłyszeć o języku, który chciałbyś, aby inni ludzie używali.
Pytam o to, ilekroć ktoś próbuje narzucić mi swój ulubiony język, a czasem jako pytanie do rozmowy kwalifikacyjnej. Jeśli ktoś nie może znaleźć pięciu rzeczy, których nienawidziłby w swoim ulubionym narzędziu, nie zna go wystarczająco dobrze, aby go popierać lub czerpać z niego duże dolary. Nie używał go w wystarczająco różnych sytuacjach, aby w pełni go zbadać. Opowiada się za kulturą lub religią, co oznacza, że jeśli nie wybiorę jego ulubionej technologii, się mylę.
Nie obchodzi mnie, jakiego języka używasz. Nie chcesz używać określonego języka? Więc nie rób tego. Czy dokładasz należytej staranności, aby dokonać świadomego wyboru i nadal go nie używasz? W porządku. Czasami właściwa odpowiedź brzmi: „Masz silny zespół programistów z dobrymi praktykami i dużym doświadczeniem w barze. Zmiana na Foo byłaby głupia”.
To dobre pytanie również dla recenzji kodu. Ludzie, którzy naprawdę znają bazę kodów, będą mieli na nią różne sugestie, a ci, którzy nie znają jej tak dobrze, mają niespecyficzne skargi. Pytam takie rzeczy, jak: „Gdybyś mógł zacząć od nowa w tym projekcie, co zrobiłbyś inaczej?” W tej fantastycznej krainie użytkownicy i programiści mogą narzekać na wszystko i wszystko, czego nie lubią. „Chcę lepszego interfejsu”, „Chcę oddzielić model od widoku”, „Użyłbym tego modułu zamiast tego drugiego”, „Zmieniłbym nazwę tego zestawu metod” lub cokolwiek, co oni naprawdę robią podoba mi się obecna sytuacja. W ten sposób rozumiem, ile konkretny programista wie o bazie kodu. To także wskazówka na temat tego, ile programistów
Nienawiść nie jest jedynym wymiarem, aby dowiedzieć się, ile ludzi wie, ale uważam, że jest całkiem niezły. Rzeczy, których nienawidzą, dają mi również wskazówkę, jak dobrze myślą na ten temat.
źródło
Odpowiedzi:
Pięć rzeczy, których nienawidzę w Javie:
Wiem, że powinienem sprawdzić Scalę.
źródło
Wow, jestem zaskoczony, że SQL jeszcze go nie wymyślił. Zgadnij, co oznacza, że nikt go nie lubi :)
... I kilka dodatkowych powodów, aby go nienawidzić, bez dodatkowych opłat
źródło
JavaScript :
Wszystkie najfajniejsze rzeczy są niesamowicie skomplikowane, ale cały ten chłód jest również zamknięty w tak niewielkiej ilości kodu, że czujesz się głupio, gdy próbujesz go przestrzegać
„+” to absurdalny wybór operatora do konkatenacji w słabo napisanym języku. Czy oni próbowali odstraszyć nooby?
To pole minowe kompatybilności z różnymi przeglądarkami (nieważne, czy jest włączone, czy nie)
Jest to na ogół niezaufane - związane z takimi zabawkami, jak blokowanie przycisku Wstecz, wyskakujące okienka, które nigdy nie umierają itp.
Debugowanie jest prawie niemożliwe, ponieważ istnieje tylko kilka różnych komunikatów o błędach i kilka różnych typów (liczba, ciąg, obiekt itp.)
Gdyby nie jQuery, prawdopodobnie nadal bym go nienawidził tak jak kiedyś :)
źródło
char
s, rzucić wszystko na cokolwiek za pomocą wskaźników void * itp.) Jest wpisywany statycznie zamiast dynamicznie , a także wymaga jawnego pisania zamiast wnioskowanie typu, ale nie są one związane z silnym słabym typowaniem v / s. [Przypadkowe przykłady: Python zawiera ukryte dynamiczne pisanie silne, Haskell (opcjonalnie jawne) statyczne pisanie silne, Java ma wyraźne (głównie statyczne) mocne pisanie, C ma wyraźne pisanie statyczne (stosunkowo słabe).] „Mocne pisanie” i „słabe pisanie „nie są właściwie dobrze zdefiniowane.'3'+'2'='32'
,'3'-'2'=1
.PHP:
1) Zmusza mnie do tworzenia niepotrzebnych zmiennych:
2) Wdrożenie lambdas tak kiepskie, że z grubsza jest równoważne z używaniem
eval()
i tak strasznie złe, że nigdy go nie użyłem (patrz http://www.php.net/create_function ).3) System try / catch, który może wykryć tylko około 80% błędów, które mogą wystąpić.
4) Wsparcie Regex tak samo kiepskie jak wsparcie lambda, ponieważ musi być napisane w regularnych ciągach, co czyni jedno z najtrudniejszych do nauczenia się narzędzi programistycznych około trzy razy trudniejszym. A PHP ma być „łatwym” językiem?!?!?
5) Nie ma sposobu na bezpieczne wyciągnięcie rzeczy z $ _POST bez dwukrotnego napisania lub zbudowania własnej funkcji lub użycia operatora „@”:
6) Dodatkowa odpowiedź: „@”. Jeśli nie możesz niepokoić się poprawnym pisaniem kodu, po prostu dodaj „@”, a szkoda dla każdego, kto będzie później musiał debugować kod.
źródło
C ++
źródło
C # / .NET:
lock
instrukcji - zamiast tego powinieneś mieć określone obiekty blokujące i powinny istnieć metody, takie jakAcquire
które zwracają jednorazowe tokeny blokujące. Następstwo: nie powinno być monitora dla każdego obiektu.GetHashCode()
iEquals()
nie powinno być wSystem.Object
środku - nie wszystko nadaje się do mieszania. Zamiast miećIdentityComparer
który robi to samo, i zachowaćIComparer<T>
,IComparable<T>
,IEqualityComparer<T>
iIEquatable<T>
interfejsy dla niestandardowych porównań.Te były poza moją głową - zapytaj mnie jutro, a wymyślę inną 5 :)
źródło
do
Ręczne radzenie sobie z buforami ciągów jest podatne na błędy. Ponieważ tak dużo obliczeń naprawdę przenosi i modyfikuje ciągi (komputery nie są używane tak często do kruszenia dużych liczb, jak ludzie myśleli, że będą dawno temu), naprawdę fajnie jest móc korzystać z zarządzanych języków lub łańcucha C ++ obiekty do radzenia sobie z nimi. Kiedy muszę to zrobić w prostej linii C, mam wrażenie, że pływam w ruchomych piaskach.
źródło
Co powiesz na pięć rzeczy, których nienawidzę w listach „Rzeczy, których nienawidzę w niektórych językach”? :RE
5- Malowanie pomarańczowej czerwieni nie czyni z niej jabłka.
Podczas projektowania języka projektanci zazwyczaj mają na uwadze to, do czego jest przydatny. Używanie go do czegoś zupełnie innego może działać, ale narzekanie, gdy tak nie jest, jest po prostu głupie. Weź Python. Jestem pewien, że ktoś ma lub ktoś kiedyś stworzy narzędzie do tworzenia plików exe z kodu Python. Dlaczego, na ziemi Bożej, chcesz to zrobić? Byłoby fajnie - nie zrozumcie mnie źle - ale nie ma pożytku. Przestań więc narzekać!
Dobrze zaprojektowany projekt prawdopodobnie zawiera kod z wielu języków. Nie oznacza to, że nie można ukończyć projektu tylko w jednym języku. Niektóre projekty mogą być w zakresie umiejętności dowolnego języka, którego używasz.
4- Czy stoisz na drewnianych nogach?
Platforma może mieć duży wpływ na to, co potrafi język. W dzisiejszych czasach śmieciarze, a nawet paskale wczesna próba „śmieciowania”, mogą pomóc w zanikaniu pamięci (może Malloc więcej pamięci RAM?). Komputery są szybsze i oczywiście oczekujemy więcej od naszych języków. I szczerze mówiąc, prawdopodobnie powinniśmy. Jednak za wygodę kompilatora w tworzeniu tabel mieszających lub ciągów lub za wiele innych koncepcji trzeba zapłacić ogromną cenę. Te rzeczy nie mogą być dziedziczone na platformie, z której są używane. Powiedzieć, że łatwo je dołączyć do języka, po prostu mówi mi, że możesz nie mieć nogi.
3 - Czyja to wina?
Błędy. Wiesz. Uwielbiam robale. Dlaczego kocham błędy. Ponieważ to oznacza, że mogę utrzymać pracę. Bez błędów byłoby wiele zamkniętych sklepów z pizzą. Jednak użytkownicy nie znoszą błędów. Ale tutaj jest odrobina zimnej wody. Każdy błąd jest winą programistów. Nie w języku. Język o tak ścisłej składni, który znacznie zmniejszyłby liczbę możliwych do wygenerowania błędów, byłby całkowicie bezużytecznym językiem. Jego umiejętności można prawdopodobnie policzyć na jednej ręce. Chcesz elastyczności lub mocy? Masz błędy. Dlaczego? Ponieważ nie jesteś doskonały i popełniasz błędy. Weź naprawdę możliwy do zidentyfikowania przykład w C:
Wszyscy wiemy, co się stanie. Jednak niektórzy z nas nie zdają sobie sprawy z tego, że ta funkcjonalność może być bardzo korzystna. W zależności od tego, co robisz. Przepełnienia bufora są kosztem tej funkcjonalności. Ten kod powyżej. Jeśli faktycznie opublikowałem to publicznie. To znowu… powiedz to ze mną… „Moja wina”. Nie C za umożliwienie mi tego.
2- Czy nie powinniśmy tego umieszczać w koszu?
Bardzo łatwo jest wskazać funkcję w języku, którego nie rozumiemy, ponieważ nie używamy jej często i nazywamy głupim. Skarż się, że tam jest itp. Goto zawsze mnie bawi. Ludzie zawsze narzekają na goto w języku. Ale założę się, że twój ostatni program zawierał rodzaj goto. Jeśli kiedykolwiek używałeś przerwy lub kontynuacji, użyłeś goto. To jest to. To prawda, że to „bezpieczne” goto, ale takie właśnie jest. Goto mają swoje zastosowania. Czy używane są „niejawne” gotos, takie jak kontynuacja czy przerwa, czy jawne gotos (użycie rzeczywistego słowa kluczowego „goto” dla dowolnego języka). Nie chodzi o to, że twórcy języków są bezbłędni, ale zazwyczaj ... jeśli funkcjonalność istnieje od zarania dziejów (dla tego języka). Prawdopodobnie aspekt ten określa jakość tego języka. Czyli… to ” jest używany i prawdopodobnie nie kręci się z powodu kompatybilności wstecznej. Jest używany dzisiaj. Tak jak 5 minut temu. I używane prawidłowo. No cóż ... prawdopodobnie ktoś również używa go niewłaściwie, ale to odnosi się do # 3 na mojej liście.
1. - Wszystko jest przedmiotem.
Ok .. ten jest naprawdę podzbiorem # 2. Ale to zdecydowanie najbardziej denerwująca skarga, którą widzę na listach nienawiści. Nie wszystko jest przedmiotem. Istnieje wiele koncepcji, które nie należą ani nie muszą być przedmiotami. Umieszczanie rzeczy tam, gdzie nie należą, jest po prostu brzydkie i może obniżyć wydajność programu. Pewnie. Może niewiele w zależności od języka. Dotyczy to również # 5. Oznacza to ... tak. Globalne są w porządku. Funkcje zastosowane w metodach statycznych są prawidłowe. Łączenie programowania OO z funkcjami globalnymi jest w porządku. Teraz .. to nie znaczy, że wszyscy powinniśmy wyjść i „uwolnić” nasz kod od jego modeli obiektowych. Podczas projektowania sekcji kodu lub całego projektu powinno się zdarzyć to, co dzieje się za kulisaminależy wziąć to pod uwagę przy składaniu. Nie tylko tam, gdzie mieszka ta koncepcja i wiele innych czynników. Po co zawijać funkcje globalne w ramach klas lub pojęć przestrzeni nazw, jeśli nie ma to żadnego sensu? Weź statyczne zmienne składowe. To mnie bardzo bawi, ponieważ ... no cóż ... W zależności od języka i implementacji, oczywiście, ale ogólnie mówiąc, właśnie ogłosiłeś, że jest globalny. Tak, istnieje kilka powodów, by łączyć te koncepcje inne niż OO w opakowania OO. Jednym z nich jest oczywiście samodokumentujący się kod. To może mieć sens. Więc ... jak mówię. Nie wychodź i „uwolnij” swój kod. Ale każdy dobry nowoczesny język będzie miał globalną koncepcję poza jego modelowaniem OO. Tak, w szczególności chcę podkreślić, że język programowania OO bez globalnej koncepcji najprawdopodobniej ma poważną wadę projektową. Znów jednak .. zależy od intencji i projektu języka, więc nie próbuję wybierać żadnego konkretnego języka, a tutaj jest o wiele za dużo do przeanalizowania. W każdym razie, zastanów się, gdzie kod powinien mieszkać i być najbardziej skuteczny. Dodanie zestawu rozszerzeń do czegoś, co nie dodaje funkcjonalności ani wsparcia, po prostu szybciej zużywa klawiaturę. To nikomu nie pomaga. No cóż ... chyba że lubisz punkty brownie od osoby, która prawdopodobnie błędnie nauczyła cię, że wszystko jest przedmiotem.
Krótko mówiąc, programowanie to nie tylko bezmyślne stukanie w klawiaturę. Każdy projekt wymaga wielu rozważań projektowych. Wiem, że to banał, ale musisz na to spojrzeć pod każdym kątem. Nawet w dzisiejszych językach bezpiecznych dla czcionek. Nie tylko wyciskasz kod i oczekujesz, że będzie działał dobrze. Jasne ... to może działać, ale może nie być to właściwa droga. Ogólnie wybierz język i format, który najlepiej pasuje do konkretnego zadania ORAZ środowiska. Ale żaden język nie zabiera za to myśli. Jeśli nie myślisz ... po prostu piszesz.
źródło
Pięć rzeczy, których nienawidzę w Javie (która jest obecnie moim ulubionym językiem) w żadnej kolejności.
źródło
Ruby ma wiele wad związanych z jego szybkością, ale ich nie nienawidzę. Ma też wady, gdy ewangelizacja społeczności przesadza, ale tak naprawdę nie przeszkadza mi to. Oto czego nienawidzę:
Sposób przekazywania bloku do funkcji jest głupi. Nie ma powodu, dla którego bloki powinny być przekazywane poza listę parametrów lub mieć nieparzystą specjalną składnię, aby uzyskać dostęp (wydajność). Uważam, że bloki powinny mieć mniej dwuznaczną składnię (inaczej skróty mogłyby używać różnych separatorów; być może <> zamiast {}), a przekazywanie parametrów do metod powinno być takie samo jak wszystkich innych parametrów.
Te osobliwości, jak blok musi być ostatnim parametrem przekazanym, a przekazanie więcej niż jednego bloku różni się dłuższą składnią, naprawdę mnie denerwuje.
źródło
Perl
Mieszane użycie pieczęci
Na przykład żaden z nich nie jest taki sam:
W
Perl6
nim jest napisane :Brak prawdziwego OO
W
Perl6
nim jest napisane :Źle zaprojektowane funkcje wyrażeń regularnych
W
Perl6
nim jest napisane :Brak wielokrotnej wysyłki
W
Perl6
nim jest napisane :Słabe przeciążenie operatora
W
Perl6
nim jest napisane :źródło
Będę robił PHP tak, jak lubię, a Python będzie wykonywany zbyt wiele.
Brak przestrzeni nazw; wszystko jest w rodzaju bardzo dużej przestrzeni nazw, która jest piekłem w większych środowiskach
Brak standardów, jeśli chodzi o funkcje: funkcje tablicowe biorą igłę jako pierwszy argument, a stóg siana jako drugi (patrz tablica_wyszukiwania ). Funkcje ciągów często biorą najpierw stóg siana, a igły drugie (patrz strpos ). Inne funkcje używają tylko różnych schematów nazewnictwa: bin2hex , strtolower , cal_to_jd
Niektóre funkcje mają dziwne zwracane wartości, poza tym, co jest normalne: To zmusza cię do zadeklarowania znikomej trzeciej zmiennej, podczas gdy PHP może skutecznie interpretować pustą tablicę jako fałszywą za pomocą żonglowania typami. Żadne inne funkcje nie wykonują tego samego.
Język (do PHP6) stara się szanować prawie opóźnioną kompatybilność wsteczną, co powoduje, że niesie ze sobą złe praktyki i funkcje, gdy nie są potrzebne (patrz mysql_escape_string vs. mysql_real_escape_string ).
Język ewoluował od języka szablonowego do pełnego backendu. Oznacza to, że każdy może wysyłać cokolwiek, kiedy chce, i to jest nadużywane. W efekcie powstają silniki szablonów dla języka szablonów ...
Jest do bani przy importowaniu plików. Masz na to 4 różne sposoby (włącz, włącz, włącz, wymagaj, wymagaj), wszystkie są powolne, bardzo wolne. W rzeczywistości cały język jest wolny. Przynajmniej dość wolniej niż python (nawet z frameworkiem) i RoR z tego, co zbieram.
Nadal jednak lubię PHP. To piła łańcuchowa tworzenia stron internetowych: chcesz, aby mała lub średnia strona była wykonywana naprawdę szybko i upewnij się, że każdy może ją hostować (chociaż konfiguracje mogą się różnić)? PHP jest na miejscu i jest tak wszechobecne, że instalacja pełnego stosu LAMP lub WAMP zajmuje tylko 5 minut. Wracam teraz do pracy z Pythonem ...
źródło
Oto kilka rzeczy, których nie lubię w Javie (która nie jest moim ulubionym językiem):
źródło
C ++
Pyton
źródło
Cel C
1) Brak przestrzeni nazw, tylko ręczne konwencje nazewnictwa - nie przeszkadza mi to w kategoriach separacji klas, ale brakuje mi możliwości importowania wszystkich definicji klas w przestrzeni nazw w jednym wierszu (np. Import com.me.somelibrary. *).
2) W bibliotekach nadal są dziury w ważnych obszarach, takich jak obsługa RegEx.
3) Składnia właściwości jest nieco niezdarna i wymaga trzech wierszy (w dwóch osobnych plikach) do zadeklarowania właściwości.
4) Podoba mi się model zachowania / wydania, ale łatwiej jest zwolnić odniesienie, a następnie przypadkowo skorzystać z niego później.
5) Chociaż Xcode nie jest tak naprawdę funkcją językową, jest tak przeplatany za pomocą Objective-C, że nie mogę przestać myśleć o tym aspekcie ... w zasadzie autouzupełnianie jest bardzo niepewne. To bardziej system, który nagradza cię za znalezienie czegoś, co istnieje, a następnie przedstawia to jako wybór. Ale przypuszczam, że nigdy nie lubiłem autouzupełniania silników.
źródło
YES/NO
booleany to zła rzecz? A co ważniejsze, czy mówisz, że Nazwane parametry są złe? Rozumiem boole, ale nazwane parametry są prawdopodobnie jedną z najlepszych cech ObjC (pod względem czytelności).C ++
Smyczki.
Nie są one interoperacyjne z ciągami platformy, więc w połowie przypadków używasz std :: vector. Zasady kopiowania (kopiowanie podczas zapisu lub głębokie kopiowanie) nie są zdefiniowane, więc nie można dać gwarancji wydajności dla prostej składni. Czasami opierają się na algorytmach STL, które nie są zbyt intuicyjne w obsłudze. Zbyt wiele bibliotek tworzy własne, które są niestety wygodniejsze w użyciu. Chyba że musisz je połączyć.
Różnorodne reprezentacje ciągów
Jest to trochę problem z platformą - ale nadal mam nadzieję, że byłoby lepiej, gdyby wcześniej była dostępna mniej uparta standardowa klasa ciągów. Następujące ciągi znaków, których często używam:
Zbuduj model.
Jestem chory na śmierć przez cały czas, grzebiąc w bzdurach z deklaracjami typu „kto-co-co”, optymalizując prekompilowane nagłówki i obejmując utrzymanie co najmniej przyrostowych czasów kompilacji itp. To było świetne w latach osiemdziesiątych, ale teraz? Jest tak wiele przeszkód w pakowaniu fragmentu kodu, aby można go było ponownie wykorzystać, że nawet pies mamy się nudzi, słuchając mnie.
Trudny do przeanalizowania
To sprawia, że zewnętrzne narzędzia są szczególnie trudne do napisania i poprawnego działania. A dzisiaj nam, facetom z C ++, brakuje głównie łańcucha narzędzi. Uwielbiam moje odbicie C # i delegatów, ale mogę żyć bez nich. Bez wielkiego refaktoryzacji nie mogę.
Wątek jest zbyt trudny
Język nawet go nie rozpoznaje (do tej pory), a swobody kompilatora - choć świetne - są bolesne.
Inicjacja statyczna i na żądanie. Technicznie, oszukiwam tutaj: to kolejny element układanki w „pakiecie kodu do ponownego użycia”: Koszmarem jest zainicjowanie czegoś tylko wtedy, gdy jest to potrzebne. Najlepszym rozwiązaniem wszystkich innych problemów redystycznych jest wrzucenie wszystkiego do nagłówków, problem ten mówi „neeener - nie możesz”.
To prawda, że wiele z nich wykracza poza ścisły zakres językowy, ale IMO cały łańcuch narzędzi musi być oceniany i ewoluować.
źródło
std::string
? może przeczytanie dobrej dokumentacji i / lub samouczka na tematstd::vector
(i dlaczego nie powinieneś używaćstd::string
w miejscach, w których nigdy nie został zaprojektowany) może to wyjaśnić.std::string
jeśli nie mogę go używać przez połowę czasu? (C ++ 0x przynajmniej to naprawia, ale wciąż tkwi w dziesiątkach bibliotek, które używają różnych reprezentacji ciągów).but why do we have to bother with them (inclusion guards)
- ponieważ C ++ nie ma modułów.How "standard" is a std::string if I can't use it half of the time?
- Myślę, że to zależy od sposobu, w jaki korzystaszstd::string
. Klasa string umożliwia dostęp do danych ciąguconst char*
poprzez viastd::string::c_str
, co już czyni gostd::string
całkowicie kompatybilnym z każdą klasą / funkcją, która również przyjmujeconst char*
argumenty.JavaScript :
Object
Prototyp może być modyfikowana. Każdy obiekt w twoim programie otrzymuje nowe właściwości i coś prawdopodobnie się psuje.Wszystkie obiekty są mapami skrótu, ale trudno jest bezpiecznie z nich korzystać. W szczególności, jeśli zdarzy się jeden z twoich kluczy
__proto__
, masz kłopoty.Brak zamknięcia obiektu w czasie odniesienia funkcji. W rzeczywistości żadne zamknięcie obiektu nie
this
jest ustawiane - zamiast tego jest ustawiane za każdym razem, gdy funkcja jest wywoływana za pomocą notacji obiektu lubnew
operatora. Powoduje wiele zamieszania, szczególnie podczas tworzenia wywołań zwrotnych zdarzeń, ponieważthis
nie jest ustawiony zgodnie z oczekiwaniami programisty.new
operatora powodujethis
ustawienie wartości równej obiektowi globalnemu, co powoduje znaczne uszkodzenie.Operator dodawania został przeciążony, aby wykonać konkatenację łańcuchów, mimo że dwie operacje są zasadniczo różne. Powoduje ból, gdy oczekiwana wartość będzie liczbą.
==
a!=
operatorzy dokonują przymusu typu. Porównania między różnymi typami obejmują listę zasad, których żaden śmiertelnik nie może w pełni zapamiętać. Jest to ograniczone przez istnienie operatorów===
i!==
.Zarówno
null
iundefined
istnieje, z subtelnie różne, ale zbędnych znaczeń. Dlaczego?Dziwna składnia do konfigurowania łańcuchów prototypów.
parseInt(s)
oczekuje liczby w stylu C, więc traktuje wartości z wiodącymi zerami jako liczby ósemkowe itp. Możesz przynajmniej,parseInt(s, 10)
ale zachowanie domyślne jest mylące.Brak zasięgu bloku.
Może zadeklarować tę samą zmienną więcej niż jeden raz.
Może używać zmiennej bez deklarowania jej, w takim przypadku jest ona globalna i prawdopodobnie psuje twój program.
with { }
.Naprawdę trudne do udokumentowania za pomocą narzędzi podobnych do JavaDoc.
źródło
null
iundefined
: czasami naprawdę chcesz wiedzieć, czy zmiennej przypisano wartość, czy nie. Ponieważ null jest wartością, niezdefiniowany jest jedynym sposobem, aby powiedzieć. To prawda, że jedynym razem, kiedy uznałem to za przydatne, było tworzenie funkcji getter / setter.for
jako nazwy zmiennej."for"
jest ważna jako klucz skrótu.__proto__
nie jest słowem zastrzeżonym. Specjalne wartości ciągów, które nie działają zgodnie z oczekiwaniami, gdy są używane jako klucze skrótu, naruszają uzasadnione oczekiwania dotyczące działania tablic asocjacyjnych w dowolnym języku. Naruszają także specyfikację EcmaScript.newline may or may not end a statement depending on context
jest jednym z moich 5 najlepszych listPyton:
__init__
)__getattr__
które nie są)print
ing do pliku (ale naprawiają to w Pythonie 3)źródło
DO#
Chciałbym móc
switch()
na każdym rodzaju, a tocase
może być dowolny wyraz.Nie można używać składni inicjalizującej obiekty z polami /
private set
autopropami „tylko do odczytu” . Zasadniczo chcę pomocy językowej w tworzeniu niezmiennych typów.Użycie
{}
dla przestrzeni nazw i klasy oraz bloków metod i właściwości / indeksatorów oraz bloków wielu instrukcji i inicjatorów tablic . Trudno jest ustalić, gdzie jesteś, gdy są daleko od siebie lub są niedopasowane.Nienawidzę pisać
(from x in y ... select).Z()
. Nie chcę wracać do składni wywołania metody, ponieważ w składni zapytania brakuje czegoś.Chcę
do
klauzuli dotyczącej składni zapytań, która jest podobnaforeach
. Ale tak naprawdę nie jest to zapytanie.Naprawdę tu docieram. Myślę, że C # jest fantastyczny i trudno jest znaleźć wiele zepsutych.
źródło
PHP
źródło
C (OK, to nie jest moja ulubiona, ale jeszcze tego nie zrobiono).
EDYCJA: Prawdopodobnie mógłbym wymyślić więcej, gdybym sięgnął po więcej kodu bibliotecznego (tak jak zrobiłem z gniazdami, ale te są szczególnie złe), ale już czułem, że oszukuję za wybranie C. Tak wiele języków istnieje tylko po to, aby wziąć dobre części C i zastąp złe, że to trochę jak pokonanie martwego konia.
źródło
Common Lisp:
źródło
BrainF * ck
Najważniejsze jest to, że Turing jest kompletny ?! Mogę zrobić więcej w wyrażeniach regularnych Perla!
Brak przedmiotów. Dalej ludzie! Cześć , cześć ...
Brak bibliotek sieciowych. Chcę tylko zeskrobać stronę internetową, GOSH.
Brak pierwszorzędnych funkcji. Gratulacje - możesz rozmawiać ze znajomymi z Javy.
Nieskończona taśma do przechowywania i nic więcej. Jest to tak pretensjonalne, że równie dobrze moglibyśmy pisać Lisp.
źródło
JavaScript
źródło
PHP:
Niemniej PHP jest (skrypty) język. ;-)
źródło
VB6
źródło
Ruby to mój ulubiony język, oto czego nie lubię:
źródło
Delphi:
źródło
JavaScript
Każdy skrypt jest wykonywany w jednej globalnej „przestrzeni nazw” ... na co trzeba uważać podczas pracy ze skryptami z różnych źródeł
Jeśli zmienna jest używana, ale nie została wcześniej zdefiniowana, jest uważana za zmienną globalną
Dostawcy przeglądarek opracowują standardy według własnego uznania, dzięki czemu kodowanie dla naszych programistów korzystających z tak pięknego języka jest trudniejsze niż powinno być
Rozróżnianie wielkości liter - biorąc pod uwagę, że nie ma przyzwoitego IDE do rozwijania js ze sprawdzaniem czasu kompilacji
Obejścia (takie jak użycie
hasOwnProperty
metody) w celu wykonania niektórych, w przeciwnym razie prostych operacji.źródło
Haskell:
($)
operatora można zmienić, aby niektóre wyrażenia były ładniejsze.Większość z nich nie osiąga poziomu nienawiści, a są ludzie próbujący naprawić lub skonstruować solidne obejścia dla każdego z nich.
Edycja: Było trochę zamieszania w związku z punktem 5. W szczególności niektórzy ludzie myślą, że miałem na myśli kolejność argumentów, a ja nie. Zamiast wyjaśniać, co miałem na myśli, wskażę ludziom następujący link: http://hackage.haskell.org/trac/haskell-prime/wiki/ChangeDollarAssociativity , który dobrze to wyraża.
źródło