[Python] 2 neo pythonisti che affrontano un orda barbara di javisti - con quasi-rissa finale
Enrico Franchi
enrico.franchi a gmail.com
Ven 1 Apr 2011 09:43:35 CEST
Cesco wrote:
> Non ho grandi esperienze in nessuno dei due linguaggi,
Certo che puoi dire la tua, ma forse, prendendo buono quello che *tu*
scrivi, non sarebbe meglio porre la questione come una *domanda* a chi
sa rispondere invece che come un "problema".
> Un giorno Tizio, che è un programmatore sciatto che non inserisce nemmeno una riga di docstrings, scrive:
>
>
> def gigetto(a, b):
> return a + b
E qui sbaglia. Avrebbe dovuto scrivere qualcosa tipo "Applies the
operator + to two objects". Poi potremmo chiederci se avrebbe dovuto
scrivere quel metodo; potremmo chiederci se non andrebbe licenziato per
la scelta dei nomi peggiorabile solo usando un generatore di stringhe
ascii casuali.
> Il giorno dopo arriva Caio, legge il codice e si domanda cosa fa gigetto. Somma due numeri?
Concatena due stringhe? Si perchè quando Caio prova a passare diversi
parametri ottiene risultati diversi
>
> print(somma(4, 3)) # Restituisce il numero 7
> print(somma("Ajeje", "Brazorv")) # Restituisce "AjejeBrazorv"
Toh, quella cosa che nei linguaggi a tipizzazione statica bisogna
pezzare introducendo il polimorfismo statico o dinamico perche'
altrimenti si fa veramente fatica a campare.
>
> Vero che Tizio avrebbe potuto scrivere due righe di codice in più per verificare i tipi
dei parametri passati a gigetto, però è altrettanto vero che in java un
problema
non si sarebbe posto, perchè tizio avrebbe probabilmente scritto:
>
> public int gigetto(int a, int b) {
> return a + b;
> }
E sarebbe stato ugualmente da licenziare... ;)
Comunque, tornando a noi, dissento. In un programma *normale* quel
codice sarebbe diventato qualcosa tipo:
public Addible gigetto(Addible a, Addible b) {
return a.add(b);
}
e buona fortuna.
> e se Caio ci prova soltanto a scrivere:
>
> System.out.println(gigetto("Ajeje", "Brazorv"))
>
> Java s'incavola chiedendogli cosa diavolo vuole fare:
>
> "method gigetto in class X cannot be applied to given types
> required: int, int
> found: java.lang.String, java.lang.String"
E quindi ti saresti giocato ampiamente un programma valido. Hai insomma
reso il tuo software meno versatile per alcuna ragione.
> Io difatti per risolvere il problema alla radice in python scrivo:
>
> def gigetto(a, b):
> assert isinstance(a, int)
> assert isinstance(b, int)
> return a + b
>
> e questo mi aiuta ad ottenere un comportamento simile a quello di Java.
> Sono io che sbaglio qualcosa o è normale e ci devo fare l'abitudine ?
Sbagli completamente. In particolare se non te la senti di scrivere
codice duck typed, ti consiglio di cambiare linguaggio.
Fare cose del genere in Python va contro la filosofia stessa di Python.
Ma in realta' va un po' contro il concetto di programmazione ad oggetti.
Uno dei fondamenti della programmazione ad oggetti ti dice di
programmare per un'interfaccia, non per un'implementazione. Tu programmi
per un'implementazione: il codice risultante e' poco astratto, ne limiti
il riutilizzo.
Python porta il discorso al passo successivo: dove in Java usi
un'interface per astrarti dall'implementazione, in Python definisci
implicitamente l'interfaccia sulla base di quello che devi fare con gli
oggetti. Di fatto questo tronca alla radice la potenziale proliferazione
di interfacce che potresti avere in Java, e rende il codice molto piu'
estensibile.
--
.
..: -enrico-
Maggiori informazioni sulla lista
Python