Zwykle myślę w kategoriach funkcji:
Składnia:
Oparte na C lub co masz. Java ma składnię opartą na C. Gorąco polecam wypróbowanie czegoś takiego jak Python lub Ruby, aby oderwać się od składni i zastanowić się bardziej nad podstawami działania danego języka. Uważam, że żadna składnia nie musi być bardziej obszerna niż oparta na C i nie ma żadnych problemów z budową wokół białych znaków.
Skompilowane vs. interpretowane w. Build-Process vs. Interpreted / Console:
Mam bardzo małą wiedzę na temat problemów związanych z czasem kompilacji a środowiskiem wykonawczym, ale rozumiem, że jest tam cała masa problemów, o których rzadko myślę.
Podobnie istnieje wiele interpretowanych języków, które wciąż mają proces kompilacji do działania na maszynie wirtualnej, tak jak Java. Nadal musisz odbudować, aby zobaczyć zmiany.
Jest też JavaScript i Python, które można uruchamiać w locie, polecenie za pomocą polecenia w konsoli w środowisku na żywo. Wszystkie trzy mogą prowadzić do bardzo różnych sposobów pisania kodu.
Pisanie dynamiczne a ścisłe:
Uważam te dwa za kompromisy w projektowaniu. Gdy jesteś na znacznie niższym poziomie, a wydajność ma krytyczne znaczenie, pisanie statyczne ma sens. Nigdy nie rozumiałem pojęcia, że jeden jest „bezpieczniejszy” niż inny, ale wymyśliłem bardzo plastyczny / dynamiczny język, w którym po prostu dowiadujesz się, jak działa system pisania i czego właściwie można się spodziewać. Czcionki typu shenanigans rzadko są dla mnie przedmiotem zainteresowania w JS. Pod pewnymi względami elastyczność może sprawić, że wszystko stanie się bardziej niezawodne, chociaż wprawdzie nieco bardziej tajemne dla twórcy poziomu Jr., jeśli nie wiesz o niektórych dziurach w języku.
Zakres na poziomie bloku vs. zakres funkcji vs.?:
Poziom bloku jest najbardziej powszechny (wszystko pomiędzy {} w większości języków składni opartych na c). Zakres JavaScript jest zbudowany wokół funkcji (które są również używane do budowania obiektów tak skutecznie obiektów). Istnieje również duża różnorodność w tym, jaki rodzaj dostępu masz od zakresu wewnętrznego do zakresu zewnętrznego. Nie znam innych schematów określania zakresu, ale jestem pewien, że istnieją.
Klasyczny OOP vs. prototypowy OOP vs Almost-OOP (struktury w C?) Vs Non-OOP:
Nawet w klasowym OOP istnieje wiele możliwości zmiany. Czy możesz dokonać wielokrotnego dziedziczenia (ew, znacznie w nadmiarze, ew), zdefiniować interfejsy itp.
W JavaScript mamy rodzaj hybrydowego prototypowego OOP, w którym obiekty są znacznie prostsze, wysoce zmienne, ale nadal mamy możliwość oddzielenia interfejsu od wewnętrznych problemów, które IMO jest ważnym aspektem enkapsulacji.
Rzecz w OOP polega na tym, że naprawdę jest wiele rzeczy, które można pobrać, które są zasadniczo zorientowane na OOP, ale technicznie nie są OOP. Oczywiście są puriści, ale pod koniec dnia Wzorce projektowe polegają na osiągnięciu pewnych abstrakcji, które sprawdzają się w określonych sytuacjach. Nie bądź zbyt szybki, aby zakładać, że pomysły z języka opartego na OOP nie mają zastosowania w czymś, co jest bardziej zorientowane proceduralnie. I nie mówię o JavaScript. To wcale nie jest ograniczone przez głupią wersję prototypowego paradygmatu OOP.
Funkcje pierwszej klasy:
Nie mając ich w języku, trudno mi się poddać. Możesz przekazywać funkcje tak, jakby były danymi do wykorzystania w innych kontekstach. To sprawia, że schematy obsługi zdarzeń są szczególnie łatwe do wdrożenia, ale także bardzo łatwo dostosowują język do swoich potrzeb. Jest to, ponad wszystko, co podejrzewam, rzecz, która sprawiła, że JavaScript był sukcesem, pomimo że został zaprojektowany w ciągu dwóch tygodni i otrzymał składnię zbliżoną do Javy jako plan marketingowy.
Zamknięcia:
Nie jestem pewien, gdzie jest debata na temat Javy, ale wiem, że wielu deweloperów Java domagało się tej funkcji rok lub dwa lata temu. W języku, w którym funkcja się nie zamyka, kiedy funkcja się zamyka, wszystko, co jest w stanie w jakiś sposób odwoływać się do rzeczy z wnętrza tej funkcji, nie będzie miało do niej dostępu, ponieważ zostało wyrzucone. W zamknięciu kontekst wykonania jest związany w taki sposób, że jeśli jesteś w stanie odwoływać się do elementów wewnątrz tej zamkniętej funkcji z innego zakresu, np. W zwróconym obiekcie lub funkcji, zasadniczo otrzymujesz te zmienne, jakie były, gdy funkcja była zamknięta. To tak, jakby wcisnąć stopę w drzwi kosza na śmieci, ale podejrzewam, że zaimplementowano ją bardziej jak kopie tych zmienników przekształconych w lokalne zmienne podmiotu odsyłającego.
Sztywne / surowe / bezpieczne vs. daje całą linę, którą chcesz:
Deweloperzy JS i Java nie rozumieją się wcale i myślę, że ma to wiele wspólnego z tymi dwoma językami, które znajdują się po przeciwnych stronach tego konkretnego spektrum projektowego. Nie chcę, żebyś mnie chronił przed sobą lub przed innymi deweloperami z mojego zespołu. Chcę zrobić o wiele więcej przy znacznie mniejszym kodzie i zrobić to wszystko na bardzo różne (ale spójne dla danej domeny) sposoby, w zależności od sytuacji. Oba są absolutnie kompromisowe, a wiele języków ma tendencję do spadania w środku.