[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