Java >> Tutoriel Java >  >> Java

Dump Java :la vie est juste meilleure en Python

Si vous avez passé du temps avec moi, vous savez que j'aime Python. C'est une langue dont je suis tombé amoureux en 2017, et je suis devenu accro depuis. En conséquence, j'ai pensé que j'écrirais un article pour mes étudiants qui cherchent à se diversifier au-delà du Java que nous enseignons en classe. Pour moi, Python est un bon endroit où aller.

L'avantage du contexte

Dans ma vie de tous les jours, je passe beaucoup de temps à enseigner Java aux étudiants. Actuellement, je passe environ deux heures par jour à enseigner Java sous une forme ou une autre. Le plus souvent, je dirige une paire de conférences et de laboratoires où nous couvrons des sujets allant de la syntaxe Java aux structures de données en passant par les interfaces graphiques.

Même si j'aime mon travail, Java n'est pas très amusant à enseigner, et il y a de nombreuses raisons à cela. Bien sûr, si vous n'avez jamais utilisé que Java, il peut être difficile de comprendre pourquoi. C'est pourquoi j'ai pensé qu'il serait amusant de parler de certains des aspects les plus frustrants de Java à travers l'objectif de Python, un langage beaucoup moins pénible à utiliser.

Pour le contexte, j'utilise Python à divers titres depuis 2017. C'est environ la moitié du temps que j'utilise Java, que j'ai appris pour la première fois en 2012. Cela dit, si je pouvais recommander un langage à n'importe qui, il aurait être Python. Il y a tellement de choses qu'il fait mieux que Java qui font de l'enseignement de Java une véritable douleur.

Pour plus de contexte, ma connaissance de Java est limitée à la version 8. Par conséquent, je ne suis pas très au courant des dernières et meilleures fonctionnalités de Java. Cela dit, avec l'existence de langages comme C# et Kotlin, je soupçonne que Java a fait très peu pour s'améliorer. Et malheureusement, je ne trouve pas beaucoup de ressources sur l'utilisation de Java moderne, il est donc difficile de dire s'il a de nouvelles fonctionnalités à considérer. Cependant, cette ressource semblait assez utile. Quoi qu'il en soit, je continue à convertir autant de personnes que possible en Python. Parlons-en !

Atouts de Python par rapport à Java

Il y a probablement des dizaines de raisons pour lesquelles je recommanderais Python plutôt que Java pour la programmation à usage général, mais voici les principales du point de vue d'un éducateur.

Les nombres Python n'ont pas de limites

Lorsque vous utilisez de nombreux langages courants comme Java, vous devez faire face à des "types primitifs" qui ont des limites basées sur les bits. Par exemple, en Java, l'entier par défaut est 32 bits. Cela signifie que vous êtes limité à environ 4 000 000 000 de valeurs.

En Python, les nombres n'ont aucune restriction liée à la plage, vous pouvez donc définir n'importe quel nombre de n'importe quelle taille :

num = 12304927493401

Et au cas où la taille de ce nombre ne serait pas extrêmement évidente, voici le même nombre avec les milliers séparés :

num = 12_304_927_493_401

Et si cela ne vous suffit pas, voici un exposant massif :

>>> 2 ** 1001
21430172143725346418968500981200036211228096234110672148875007767407021022498722449863967576313917162551893458351062936503742905713846280871969155149397149607869135549648461970842149210124742283755908364306092949967163882534797535118331087892154125829142392955373084335320859663305248773674411336138752

C'est vrai! Parce qu'il n'y a pas de limite sur les nombres en Python, il n'y a pas de débordement. Bonne chance pour faire cela en Java natif (oui, je sais que des objets existent pour faire ce genre de chose).

Les listes Python ne sont pas limitées par leur taille

Dans le même ordre d'idées que les limites numériques, les listes Python ne sont pas non plus limitées en taille. Si vous connaissez la syntaxe Java pour les tableaux, vous saurez que vous devez choisir une taille pour eux à partir de l'initialisation. Si vous souhaitez utiliser quelque chose de plus flexible, vous devez importer une collection comme ArrayList.

En Python, les listes de tableaux sont la liste par défaut. Par conséquent, vous pouvez créer des listes aussi facilement que :

nums = [4, 1, 2, 3]

Naturellement, vous bénéficiez de tous les avantages d'un tableau avec l'avantage supplémentaire de pouvoir modifier sa taille :

nums.append(5) # [4, 1, 2, 3, 5]
nums += [3, 4]  # [4, 1, 2, 3, 5, 3, 4] 

Les listes en Python sont si polyvalentes que vous pouvez essentiellement les utiliser comme n'importe quelle structure de données de séquence. Par exemple, des méthodes comme pop() et insert() peut être utilisé au besoin.

Le code Python est essentiellement un pseudocode

En général, Python fait un bon travail en limitant les types de symboles impliqués dans le code (cependant, cela a changé plus récemment). Au lieu de cela, la langue se concentre sur l'utilisation de l'anglais là où cela a du sens. Par exemple, tous les principaux opérateurs booléens sont écrits en anglais simple par opposition aux symboles. Voici à quoi cela ressemble en Java :

&&  // and
||  // or
!   // not

Pendant ce temps, en Python, nous avons ceci :

and
or
not

De même, si vous voulez savoir si une séquence contient une valeur, vous pouvez utiliser in directement :

 7 in [2, 3, 4]  # False

En parlant de symboles, Java utilise beaucoup de symboles pour désigner des blocs et des expressions. Par conséquent, vous pouvez vous retrouver de temps en temps dans un fouillis de parenthèses et d'accolades :

if (...) {
  while (...) {
    if (...) {
    } else {
    }
  }
}

Lors de l'écriture de pseudocode, vous désignez généralement des blocs à l'aide d'une indentation. C'est exactement comme ça que Python fonctionne :

if ...:
  while ...:
    if ...:
    else ...:

Compte tenu de ces avantages, j'ai tendance à trouver que le code Python est en moyenne plus facile à lire. En d'autres termes, s'il est possible d'écrire du mauvais code Python, je trouve beaucoup plus facile d'écrire du mauvais code Java (et C++).

Le code Python est nettement moins détaillé

Écoutez, je serai un fan de typage statique jusqu'au jour de ma mort, mais avez-vous déjà pensé à quel point il est absurde de devoir spécifier des types des deux côtés d'une déclaration de variable en Java. Dès que nous voulons une sorte de flexibilité de type, nous devons introduire des génériques qui explosent très rapidement les définitions de variables et les en-têtes de méthode. Regardez cette ligne de code ridicule :

Map<String, String> m = new Map<>();

Cela fait 36 ​​caractères pour créer une variable, et il n'y a rien dedans ! Que diriez-vous de cette ligne :

public static void duplicate(ArrayList<Integer> nums) { ... }

Comme vous pouvez probablement l'imaginer, si jamais vous avez besoin d'imbriquer des types génériques, la partie est terminée.

D'un autre côté, si vous souhaitez créer une définition de variable similaire en Python, cela pourrait ressembler à ceci :

m = {}

De même, si vous souhaitez transmettre une carte à une fonction, voici à quoi cela pourrait ressembler :

def duplicate(m): pass

Et si vous voulez vraiment être clair sur vos types, vous pouvez les spécifier :

def duplicate(m: dict[str, str]): pass

Je ne peux pas commencer à vous dire à quel point il est pénible de sortir un tableau effaçable à sec ou un autre outil pour écrire du code pour un étudiant, seulement pour manquer d'espace horizontal juste pour définir un objet. Il n'est probablement pas surprenant que les personnes qui utilisent des linters se retrouvent avec des définitions variables qui s'étendent sur plusieurs lignes (damn ces limites de ligne embêtantes).

Python a des fonctionnalités de programmation fonctionnelle natives

L'un des aspects les plus frustrants de Java est le manque de fonctionnalités de programmation fonctionnelles. Bien que les lambdas existent techniquement, ils sont un peu maladroits. Et si vous avez déjà utilisé Swing, vous savez à quel point il est ennuyeux de lier des fonctions à des boutons.

En Python, en revanche, les fonctions sont des données. Par conséquent, nous pouvons les stocker dans des variables et des structures de données :

nums = [2, 5, 3, 1]
funcs = [min, max]
results = [func(nums) for func in funcs]  # stores [1, 5]

Maintenant, ce code a probablement l'air un peu sauvage. Fondamentalement, nous créons une liste de nombres. Nous créons également une liste de fonctions. Dans ce cas, j'ai choisi min() et max() . Ensuite, nous utilisons une compréhension de liste pour parcourir la liste des fonctions et passer notre liste de nombres à chacune d'elles. Le résultat est un tableau contenant les valeurs minimum et maximum de la liste.

Pouvoir transmettre des fonctions comme celle-ci est incroyablement pratique dans certains contextes. Pour moi, il y a eu plusieurs fois où j'ai voulu pouvoir transmettre des fonctions en Java uniquement pour être obligé de créer un objet pour imiter quelque peu le comportement que je veux. Ce n'est certainement pas idéal. Quoi qu'il en soit, les choses ont peut-être été améliorées côté Java depuis la version 8. Cela dit, je suis toujours méfiant.

Java est toujours un bon langage

Même si je parle de Java, c'est toujours un excellent langage. En fait, j'ai écrit en plaisantant à ce sujet contre d'autres langues plus tôt cette année. Il a réussi à se classer au 11e rang sur 28 langages, il est donc définitivement dans la moitié supérieure des langages de programmation. Bien sûr, cela ne veut pas dire grand-chose lorsque des langages comme C # et Kotlin occupent respectivement les 2e et 3e positions.

Et bien sûr, je dois jeter un peu d'amour à Java car c'était mon premier langage de programmation. C'est aussi la langue sur laquelle j'ai commencé à écrire sur ce site. Enfin, comme pour tout ce que j'écris, prenez tout avec des pincettes. Nous avons tous nos préjugés, et je ne fais pas exception. Utilisez l'outil qui vous convient !

Cela dit, merci encore d'avoir vérifié mon travail. Je vous en suis reconnaissant. Si vous souhaitez en savoir plus, consultez l'un des articles connexes suivants :

  • Comment échanger des types de référence Java dans une méthode
  • Méfiez-vous de la division par zéro en Java
  • Comparer Java à Python :un mappage de syntaxe

Vous voyez, j'écris encore sur Java ! J'ai des élèves qui ont besoin de ce genre de choses, et je continuerai à écrire à ce sujet jusqu'à ce qu'on me demande d'enseigner autre chose.

Si ces articles ne vous suffisent pas, pensez à consulter ma liste de moyens de développer le site. Vous y trouverez des liens vers diverses ressources telles que mon Patreon, ma chaîne YouTube et ma newsletter. Merci d'avoir passé du temps !


Balise Java