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-

_______________________________________________
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python

Rispondere a