Ale co utrudniają?
Gdy masz potrzebę zamienić to masz wbudowane różne konwersje/rzutowania albo funkcje typu .toString itp. Masz typy wariantowe/dynamic (w różnych językach to się różnie nazywa), masz generyki i wiele innych mechanizmów. Także wydaje mi się, że cokolwiek będziesz potrzebował osiągnąć - osiągniesz w sposób JAWNY a nie podstawiając 25 do zmiennej, która aktualnie posiada wartość "bleblelblebleeee". Jeśli dla kogoś jest problemem to, że nie może nadpisać stringa wartością liczbową to wydaje mi się, że problem leży gdzieś indziej, ma coś źle przemyślane - że w ogóle do takiej sytuacji doszło.
Albo inaczej - możesz podać jakiś realny scenariusz, w którym:
- potrzebny jest taki brak typowania
- nie da się tego zrobić jawnie - poprzez jakaś funkcję konwertującą (czy to wbudowaną, czy własną) ani rzutowanie?
@cerrato: Co znaczy, że się nie da, pewnie większość rzeczy da się napisać we wszystkich sensownych językach, dynamic typing i first class functions (citizens) dają to, że pisze się łatwiej, kod jest bardziej oszczędny, a przez tołatwiejszy do czytania, rozumowania o nim. A przykład, jeśli masz doświadczenie w obu typach języków, to sobie sam znajdziesz, ale dam, napisanie jakiejś nowej abstrakcji, np. szukanie najlepszego wyniku, Java:
Kopiuj
interface Score<T> {
int score(T it);
}
public static <T> T find_the-best(List<T> items, Score<T> scorer) {
T best = null;
int best_score = Integer.MIN_VALUE;
for (T item : items) {
int score = scorer.score(item);
if (score > bestScore) {
best = item;
best_score = score;
}
}
return best;
}
//użycie:
find-the_best(players, player -> player.getPoints());
Python:
Kopiuj
best = max(players, key=lambda p: p.points)
Dzięki wbudowanej max, zachowanie przekazujesz bezpośrenio, zero generyków, interfajsów, boilerplaite.
Strategia, Python:
Kopiuj
def bubble(data):
pass
def quick_sort(data):
pass # TODO
def sort(data, strategy):
strategy(data)
sort(data, quick_sort)
First class functions - bez boilerplaite, jasno i czytelnie; a w Javie, nie chce mi się już pisać, (GPT, albo 20sek internet search da radę :) ) znowu będzie interface, klasy, hierarchia
@KamilAdam
Nawet jeśli statyczny system typów spowalnia development to ułatwia utrzymanie
A jak to system typów ułatwia utrzymanie? Bo ja nie zauważyłem, utrzymanie ułatwia czysty kod i testy, imo.
A większość systemów, jeśli odniesie sukces, będzie utrzymywana. Więc jeśli nie piszemy demo do wyrzucenia to wybór pythonga czy innego języka dynamicznego jest błędem
Czyli w Instagramie, mając praktycznie nieograniczone finansowanie wybrali najgorzy język, ej, no chyba nie.
tutaj chodzi o czasy przed type hintami, gdzie dobry zwyczajem jest pisaniem kodu jak i testu, który sprawdza jak dany kawałek kodu ogarnia różne typy tj. rzuca jakieś czytelne błędy a nie losowe błędy tam gdzie duck typing się wywali
Statyczne typowanie ze sprawdzaniem typów to właśnie takie "testy"
Tego nie rozumiem, bo static typing to nie testy, (jeśli nawet w dynamic języku testów jest więcej - choć nie jestem pewien) static typing sprawdza zgodność danych z kontraktem, sensu biznesowego. Odnośnie duck typing w Pythonie mówisz: akceptuję metodę, która ma read() , zamiast akceptuję typ Stream . Statyczne typy nie powodują, że błędy będą czytelne, tylko, że pewnie błędy nie przejdą etapu kompilacji. Zaś testy łapią cały wszechświat więcej niż typy: serializacja/deserializacja, integracje, bazy, API.