Czy Dart ma jakieś przydatne funkcje dla programistów internetowych?

33

http://www.dartlang.org/

Przejrzałem stronę bardzo krótko i zainteresowałem się. Czy są jakieś zalety używania Dart? Czy to tylko zamiennik JavaScript?

Wygląda na prostszą Javę. Pisząc dość dużo C # w pracy, język wydaje się bardzo podobny do tego, do czego jestem przyzwyczajony, więc nauka składni wydaje się dziecinnie prosta. Czy ktoś ma jakieś opinie lub doświadczenia z językiem?

(W porównaniu do CoffeeScript (= nie używam składni Ruby) składnia wygląda mi bardziej znajomo).

marko
źródło
18
Komentarz Douga Crockforda jest zabawny: „Więc długo zastanawiałem się… gdybym mógł wziąć czystą kartkę papieru i napisać nowy język, który zachowuje całą dobroć Javascript… nie wymyśliłbym z czymkolwiek takim jak Dart. ”
MebAlone
2
@MebAlone Ho-ho-ho, jak wnikliwe. Co za machina to Crockford. Wisecracks nad mądrością.
funkybro,
11
@MebAlone Projektanci języka Dart nie próbowali wymyślić nowego języka, który zachowuje wszystkie zalety JavaScript. Próbowali wymyślić oparty na klasach obiektowy język językowy dla przeglądarki.
MarkJ
1
Co Is there any advantages of using Dart?znaczy Przewaga nad czym i mierzona w jaki sposób ? Istnieje wiele języków, które kompilują się w JavaScript. Większość z nich robi coś znacznie lepszego niż Dart. Niektóre robią większość rzeczy lepiej niż Dart. I na przykład, jeśli wykonasz C #, ScriptSharp może być dla Ciebie interesujący. Chociaż wśród wszystkich języków kompilujących się w JavaScript nie byłby to mój pierwszy wybór, dla ciebie byłby to bardzo łatwy sposób przejścia, prawdopodobnie nawet umożliwiający bezbolesne przeniesienie istniejącego kodu.
back2dos
1
@MebAlone Douglas jest trochę w konflikcie. Narzekający programiści nie akceptują nowych pomysłów, ale stwierdzenie, że rzutka jest złe w 2012 r., Kiedy zostało wydane zaledwie 2 dni temu. Ogłosili, że nadejdzie 2 lata temu. Podobnie jak rzutka odnosi się do niektórych rzeczy, z którymi Douglas jest niezadowolony w JS (żaden konstruktor nie działa z prototypem „luźnego zawieszenia”). Zachowując rzeczy, które lubi (np. Zamknięcia). W kilku prezentacjach widziałem, jak chwali prototyp, a potem krytykuje składnię funkcji konstruktora (ma rację). Następnie „rozwiązuje” to, pokazując wzorzec modułu, który całkowicie ignoruje istnienie prototypu.
HMR

Odpowiedzi:

65

Dziękuję za twoje pytanie! Pełne wyłączenie odpowiedzialności, pracuję w zespole Dart.

Prawdopodobnie najlepszą zaletą, jaką Dart ma dzisiaj, jest znajomość języków C #, Java, C ++ i większości programistów JavaScript. Wielu programistów ma zestaw oczekiwań dotyczących swojego języka (oparty na klasach OO, zakres leksykalny, znana składnia) i swoich narzędzi (uzupełnianie kodu, refaktoryzacja, nawigacja kodu, debugowanie), które Dart zamierza spełnić i przekroczyć.

Oto kilka rzeczy, które lubię w języku:

  1. Opcjonalne typy statyczne. Kiedy prototypuję lub po prostu piszę małe skrypty, nie używam ton typów statycznych. Po prostu ich nie potrzebuję i nie chcę dać się wciągnąć w ceremonię. Jednak niektóre z tych skryptów ewoluują w większe programy. W miarę skalowania skryptów chcę raczej klas i adnotacji typu statycznego.

  2. Uznaje się za niewinnego do czasu udowodnienia winy. Dart stara się zminimalizować sytuacje, które powodują błąd podczas kompilacji. Wiele warunków w Dart to ostrzeżenia, które nie zatrzymują działania programu. Czemu? Zgodnie z modą tworzenia stron internetowych, programiści muszą koniecznie wypróbować trochę kodu, nacisnąć przycisk przeładowania i zobaczyć, co się stanie. Deweloper nie powinien najpierw musieć udowodnić, że cały program jest poprawny, zanim przetestuje tylko fragment kodu.

  3. Zakres leksykalny. To jest niesamowite, jeśli nie jesteś do tego przyzwyczajony. Mówiąc najprościej, widoczność zmiennych, a nawet to , jest określona przez strukturę programu. Eliminuje to klasę łamigłówek w tradycyjnym programowaniu internetowym. Nie trzeba ponownie wiązać funkcji, aby zachować to, co myślisz lub oczekujesz.

  4. Prawdziwe klasy upieczone w języku. Jest oczywiste, że większość programistów chce pracować w klasach, ponieważ większość platform programistycznych oferuje rozwiązanie. Jednak „klasa” z frameworka A nie jest kompatybilna z frameworkiem B w tradycyjnym tworzeniu stron internetowych. Dart używa klas w naturalny sposób.

  5. Funkcje najwyższego poziomu. Jedną z bolesnych części Javy jest to, że wszystko należy umieścić w klasie. Jest to nieco sztuczne, szczególnie gdy chcesz zdefiniować kilka funkcji narzędziowych. W Dart możesz definiować funkcje na najwyższym poziomie, poza dowolną klasą. To sprawia, że ​​skład biblioteki wydaje się bardziej naturalny.

  6. Klasy mają niejawne interfejsy. Eliminacja jawnych interfejsów upraszcza język. Nie musisz już wszędzie definiować IDucka, wystarczy teraz klasowa Kaczka. Ponieważ każda klasa ma niejawny interfejs, możesz utworzyćMockDuck implements Duck

  7. Nazwani konstruktory. Możesz nadać konstruktorom nazwy, co naprawdę poprawia czytelność. Na przykład:var duck = new Duck.fromJson(someJsonString)

  8. Konstruktorzy fabryczni. Wzorzec fabryczny jest dość powszechny i ​​miło jest widzieć, że jest upieczony w języku. Konstruktor fabryki może zwrócić singleton, obiekt z pamięci podręcznej lub obiekt podtypu.

  9. Izoluje Dawno minęły czasy udostępniania stanu zmiennego między wątkami (technika podatna na błędy). Izolat Dart jest izolowaną stertą pamięci, która może działać w osobnym procesie lub wątku. Izoluje komunikację, wysyłając wiadomości przez porty. Izoluje pracę w Dart VM i może się kompilować z pracownikami sieci Web w aplikacjach HTML5.

  10. Dart kompiluje do JavaScript. Jest to niezwykle ważne, ponieważ JavaScript jest lingua franca w sieci. Aplikacje Dart powinny działać w nowoczesnej sieci.

  11. Mocne oprzyrządowanie. Projekt Dart dostarcza również edytor. Znajdziesz uzupełnianie kodu, refaktoryzację, szybkie poprawki, nawigację kodu, debugowanie i wiele innych. Ponadto IntelliJ ma wtyczkę Dart.

  12. Biblioteki. Możesz porządkować kod Dart w bibliotekach, aby ułatwić sobie rozmieszczanie nazw i ponowne użycie. Twój kod może importować bibliotekę, a biblioteki mogą ponownie eksportować.

  13. Interpolacja ciągów. To po prostu fajna funkcja, która ułatwia komponowanie łańcucha:var msg = "Hello $friend!";

  14. noSuchMethod Dart jest dynamicznym językiem i możesz obsługiwać dowolne wywołania metod za pomocą noSuchMethod().

  15. Generics. Powiedzenie „to jest lista jabłek” daje twoim narzędziom znacznie więcej informacji, które pomogą ci wcześnie wykryć potencjalne błędy. Na szczęście, ogólne leki Dart są prostsze niż to, do czego prawdopodobnie jesteś przyzwyczajony.

  16. Przeciążenie operatora. Klasy Dart mogą definiować zachowanie operatorów takich jak +lub -. Na przykład możesz napisać kod podobny do new Point(1,1) + new Point(2,2).

Mimo to istnieje wiele innych bibliotek JavaScript.

Osobiście uważam, że w Internecie jest miejsce dla wielu języków. Jeśli aplikacja jest niesamowita i działa w większości nowoczesnych przeglądarek, nie dbam o to, w jakim języku jest napisana. Tak długo, jak Ty, programista, jesteś szczęśliwy, produktywny i uruchamiasz się w Internecie, to znaczy co ma znaczenie! :)

Seth Ladd
źródło
Wiele współczesnych języków programowania (Ruby, Scala, Python) zawiera mechanizm wielokrotnego dziedziczenia, który pojawia się w JDK8. Czy to jest planowane dla Dart?
MebAlone
4
+1 w punkcie nr 1 - dynamiczne pisanie jest wystarczające w przypadku małych skryptów (tj. Poziom „sprawdzania poprawności formularza”). Wszystko poza tym i uważam, że sieć bezpieczeństwa pisania statycznego jest niezbędna.
funkybro,
2
@MebAlone Oczekuję, że w najbliższej przyszłości zobaczymy miksy.
Seth Ladd,
Zaskoczony Snap-shotting nie został wspomniany - IMO to jedna z najlepszych funkcji Dart.
mythz
@mythz Nie wspomniałem o migawkach, ponieważ nie zostały jeszcze wdrożone do końca. Ale tak, są fajne!
Seth Ladd,
11

Pisząc dużo C # w pracy, język jest bardzo podobny do tego, do czego jestem przyzwyczajony

To jeden punkt dotyczący Dart. JavaScript jest uważany za niezręczny język z kilkoma ogólnymi idiomami. W języku takim jak Java często istnieje naturalny sposób na rozwiązanie problemu. Na przykład, jeśli prowadzisz spis tabel, w Javie lub C # utworzysz tabelę klas.

JavaScript nie ma klas, możesz chcieć używać prototypów, ale czują się niezręcznie i nie zapewniają tak silnej struktury i narzędzi do enkapsulacji. (Przynajmniej nie robiąc żadnych wyczynów). Dziedzictwo, kompozycja itp. Jest niewygodne w przypadku prototypów Javascript. Dlatego większość ludzi używa zwykłych map skrótów do przechowywania danych. Lub używają bibliotek innych firm, takich jak prototyp, co zapewnia klasowe wrażenia.

Tak więc wygoda to jedno, a struktura drugie. JavaScript po prostu nie skaluje się dobrze, ponieważ nie ma standardowego sposobu strukturyzacji dużych aplikacji. Jednak obecnie takie liby stron trzecich stają się bardzo popularne. (Jak backbone.js)

Dart jest rozwiązaniem tego problemu. Jest tam, aby zapewnić ci strukturalną wygodę Java, a ponadto nie ma wszystkich tych niezręcznych funkcji JS. (Większość z nich dotyczy słabego pisania).

Tak więc odpowiedź brzmi: tak, klasy, dziedziczenie, ...: „tradycyjny OOP”. (Większość webowych aplikacji JS w prawdziwym świecie używa opartej na wywołaniu zwrotnym jQuery jako głównej struktury.) I ma luźną formę pisania statycznego, ale to nie jest kluczowa zaleta.

BTW: możesz przeczytać tę „wewnętrzną” korespondencję Google z 2010 roku: Future of Javascript

JavaScript ma fundamentalne wady, których nie można naprawić jedynie poprzez ewolucję języka. Przyjmiemy dwutorową strategię dotyczącą przyszłości Javascript ... Opracuj nowy język (o nazwie Dash), który ma na celu utrzymanie dynamicznej natury Javascript, ale ma lepszy profil wydajności i jest podatny na narzędzia do dużych projektów. .

Philip
źródło
5
Nie wszyscy uważają Javascript za „niezręczny język”. Często istnieje naturalny sposób na rozwiązanie problemu. Zbyt często wymaga to technik (programowanie funkcjonalne, przeciążanie operatora, miksy, programowanie ogólne), które nie są obsługiwane przez Javę. Dziedziczenie, kompozycja itp. Nie jest niewygodne w przypadku prototypów Javascript. Po prostu różni się od Java i C #, ale jest podobny do Ruby, LUA i Perl.
kevin cline,
1
Mmm ... pierwszy raz słyszę coś dobrego o prototypach. Ale w jaki sposób widzisz prototypy JS podobne do Ruby?
Philip
1
musisz częściej wychodzić (ze świata Java). Spójrz na metaprogramowanie Ruby ( ruby-doc.org/docs/ProgrammingRuby/html/ext_ruby.html ), a zobaczysz, że rozpoznawanie nazw członków Ruby jest podobne (ale IMO bardziej skomplikowane niż) rozpoznawanie nazw członków Javascript.
kevin cline,
jQuery w żaden sposób nie kształtuje ani nie promuje oddzwaniania bardziej niż interfejs API DOM (który w zasadzie owija) lub samo jądro JS lub Dart. Prototypy są mechanizmem dziedziczenia, który pozwala nam robić rzeczy, których klasy nie potrafią. Porównaj klasy z konstruktorami funkcji, które dobrze zamykają wewnętrzne zmienne instancji, a nie prototypy. Nie chodzi o to, że Twój średni poziom talentu do generowania spamu w programach Java lub C # dev ma najmniejsze pojęcie o tym, dla czego enkapsulacja jest dobra, lub przeciętny programista Google ma najmniejsze pojęcie o tym, jak pisać JavaScript.
Erik Reppen,
@ErikReppen: jeśli używasz jQuery wyłącznie do manipulacji DOM, możesz napisać kod, który prawie nie potrzebuje żadnych wywołań zwrotnych, w przypadku połączenia go z innymi frameworkami, takimi jak backbone.js. Powiązanie zdarzeń z jQuery bardzo promuje (anonimowe) wywołania zwrotne. backbone.js ma bardziej uporządkowane podejście IMHO.
Philip,
5

Daje mi to szansę na lepszą strukturę kodu niż JavaScript z zakresem i klasami.

Jest podobny do Java i JavaScript, a dzięki edytorowi Dart miałem prawie zerową adaptację. Zacząłem kodować od razu.

var ws = new [Moz]WebSocketirytujące są różne przeglądarki. Dart kompiluje do kodu JavaScript kompatybilnego z popularnymi przeglądarkami.

Moim wyzwaniem jest głównie połączenie z kodem JavaScript. W jakiś sposób znajduję sposoby na obejście tego, ale byłoby lepiej, gdyby był częścią Dart.

Abiola
źródło
Uzgodnione, @Abiola, Dart potrzebuje lepszej obsługi JavaScript. To bardzo zależy od radaru, nie mogę się doczekać, co wymyśli zespół.
Seth Ladd,
0

Podejście Java / C # jest zdecydowanie stronnicze w pukaniu JS od początku web 2.0. Jest tak z powodu sztucznego (lub bardzo rzeczywistego i koniecznego) rozróżnienia między językiem po stronie klienta a językiem po stronie serwera. Myślę, że jest to tak, że język po stronie serwera może pozostawać w „kontroli” nad głównymi problematycznymi domenami aplikacji internetowych i oddzielić mniej poważny kod (kod interfejsu użytkownika) od kodu biznesowego (po stronie serwera). Także Java, myślę, że uwielbia pozostać jądrem po stronie serwera, ponieważ przegrał wojnę GUI z apletami głównie z powodu Flasha i HTML 5. Teraz masz RedTamarin - projekt AS3 w stylu NodeJS nawiązujący do pluralistycznej mieszanej przyszłości ujednoliconych paradygmatów front i backend .

Vodbro
źródło