Niedawno przelałem kilka godzin na JavaScript, ponieważ chciałem skorzystać z ogromnej bazy użytkowników. W ten sposób zauważyłem wzór, który większość ludzi przypisuje dynamicznym językom. Sprawia, że wszystko działa naprawdę szybko, ale gdy kod osiągnie określony rozmiar, tracisz dużo czasu na błędy związane z pisaniem, pisownią i refaktoryzacją. Błędy, które normalnie oszczędziłby mi kompilator. I nie każ mi szukać błędów w logice, kiedy popełniłem literówkę w innym module.
Biorąc pod uwagę niewiarygodne śledzenie JavaScript i innych dynamicznie pisanych języków, jestem przekonany, że moje podejście jest nie tak. Czy to tylko cena, którą musisz zapłacić?
Mówiąc bardziej zwięźle:
- Jak podchodzisz do projektu JavaScript (lub innego dynamicznego języka w tym przypadku) z ~ 2000 LOC?
- Czy istnieją narzędzia, które zapobiegną popełnianiu tych błędów? Próbowałem przepływu przez Facebook i JSHint, które nieco pomagają, ale nie łapią literówek.
Odpowiedzi:
Mówiąc konkretnie o JavaScript, możesz zamiast tego użyć TypeScript . Oferuje niektóre rzeczy, o których mówisz. Cytując stronę internetową:
Jest to tylko nadzbiór JS, co oznacza, że niektóre z istniejącego kodu będą dobrze działać z TS:
źródło
foo(x) { return x.bar;}
lub coś w tym rodzaju. Ponieważ nie ma informacji o typie, a funkcja jest publiczna (stąd nie możesz znać wszystkich wywołujących), nie możesz dowiedzieć się, czy nazwa paska powinna zostać zmieniona na baz, jeśli zmienisz nazwę klasy.Istnieje kilka metod, które mogą pomóc:
Testów jednostkowych
Napisz testy jednostkowe, jeśli to możliwe. Opieranie się wyłącznie na ręcznym testowaniu lub znajdowaniu błędów w środowisku naturalnym jest metodą „chybić trafił”.
Użyj ram
Zamiast tworzyć własne i ryzykować wprowadzenie błędów, w miarę możliwości używaj ustalonych ram.
Preferuj języki CSS / wysokiego poziomu
Gdzie możesz scedować funkcjonalność na CSS lub inny język wysokiego poziomu, w którym piszesz.
Refaktor
Refaktoryzacja w celu zmniejszenia ilości kodu. Mniej kodu = mniej miejsc na błędy.
Ponowne użycie
Wykorzystaj istniejący kod tam, gdzie możesz. Nawet jeśli kod nie jest dokładnie zgodny, lepiej jest skopiować, wkleić i zmodyfikować niż pisać coś na nowo.
IDE
Współczesne środowiska IDE mają na ogół przynajmniej obsługę Javascript. Niektóre edytory tekstu obsługują również Javascript.
źródło
Jedno narzędzie , które nie zostały jeszcze wymienione jest prosta, plik-lokalny lub całego projektu wyszukiwania tekstu .
Brzmi prosto, ale kiedy dołączasz wyrażenia regularne, możesz wykonać podstawowe lub zaawansowane filtrowanie, np. Wyszukać słowa znajdujące się w dokumentacji lub kodzie źródłowym.
Było to dla mnie skuteczne narzędzie (oprócz analizatorów statycznych), a biorąc pod uwagę rozmiar twojego projektu 2k LOC, który moim zdaniem nie jest szczególnie duży, powinien być cudowny.
źródło
grep
iść w daleką podróż. Chyba że nie robisz zbyt dziwnych dynamicznych rzeczy, to załatwia sprawę. Jednak wydaje się to bardzo ręczne, jeśli jesteś przyzwyczajony do IDE dla języków o typie statycznym.Obecnie refaktoryzuję kilka tysięcy wierszy kodu w dużym projekcie AngularJS. Jednym z największych problemów jest ustalenie dokładnej umowy danej funkcji. Czasami kończyłem czytać dokumentację API, ponieważ elementy surowej odpowiedzi API były przypisywane do zmiennych, które przechodziły przez 6 warstw kodu przed modyfikacją i zwracały przez kolejne 6 warstw kodu.
Moja pierwsza rada to zaprojektowanie na podstawie umowy . Wprowadź określone dane wejściowe, uzyskaj określone wyniki, unikaj efektów ubocznych i udokumentuj te oczekiwania za pomocą TypeScript lub przynajmniej JSDoc.
Moja druga rada to wdrożenie jak największej liczby kontroli. Przestrzegamy standardu AirBnB i używamy eslint na całej naszej bazie kodu. Zatwierdzanie haków weryfikuje, że zawsze przestrzegamy standardu. Oczywiście dysponujemy baterią testów jednostkowych i akceptacyjnych, a wszystkie zatwierdzenia muszą zostać zweryfikowane przez partnera.
Przejście z edytora tekstu (Sublime Text) na odpowiedni IDE (WebStorm) również znacznie ułatwiło pracę z kodem w ogóle. WebStorm użyje JSDoc, aby podpowiedzieć o oczekiwanych typach parametrów i zgłosić błąd, jeśli podasz niewłaściwy typ lub użyjesz wartości zwracanej w niewłaściwy sposób.
W JavaScript nowe funkcje, takie jak symbole i getter / setters, mogą pomóc w egzekwowaniu określonego poziomu jakości poprzez dodanie asercji do przypisania zmiennej (np. Upewnij się, że liczba całkowita znajduje się w zasięgu lub że obiekt danych ma określone atrybuty).
Niestety nie sądzę, aby istniało prawdziwe rozwiązanie zapobiegające dynamicznym błędom językowym, a jedynie szereg środków, które mogą pomóc zmniejszyć ich częstotliwość.
źródło
Moja odpowiedź na pytanie „Jak podchodzisz do projektu JavaScript (lub innego dynamicznego języka w tym przypadku) z ~ 2000 LOC?”
Tworzę aplikacje formularzy PDF. Do mojego projektu rozwoju oprogramowania JavaScript (bez względu na rozmiar kodu źródłowego) podchodzę przy użyciu elementów sieciowych i adnotacji Petri. Metoda nie jest powiązana z żadną konkretną technologią języka programowania. Dlatego można go używać w innych „językach programowania”.
Tworzę schemat logiki aplikacji. Aby utrzymać porządek na schemacie, dodaję większość moich adnotacji do formularza, którego używam ze schematem. Wpisy w formularzu zawierają odniesienia do właściwości lub funkcji. Następnie wypisuję kod źródłowy na podstawie informacji na schemacie i wpisów w formularzu. Metoda jest systematyczna, ponieważ każdy zapisany kod źródłowy jest bezpośrednio mapowany z diagramu i wpisów w formularzu. Kod źródłowy można łatwo sprawdzić, ponieważ podczas pisania kodu przestrzegam również konwencji nazewnictwa i kodowania.
Na przykład wybrałem konwencję, że wszystkie funkcje są prototypami. Jeśli wydajność stanie się problemem, można ją poprawić, deklarując funkcje w konstruktorze. Do niektórych właściwości używam tablic. Ponownie, jeśli wydajność staje się problemem, można ją poprawić, stosując bezpośrednie odniesienia.
Używam również eval. Może to znacznie zmniejszyć rozmiar kodu źródłowego. Z powodu problemów z wydajnością używam eval na początku lub w części inicjalizacji mojej aplikacji; Nigdy nie używam go w „logice środowiska wykonawczego” - to kolejna konwencja kodowania, którą stosuję.
źródło