Pourquoi C # a-t-il beaucoup plus de fonctionnalités que Java? [fermé]

14

Veuillez noter qu'il ne s'agit pas d'un argument Java vs C #. Je suis un programmeur Java sans expérience en C #, demandant juste par curiosité.

J'ai fait quelques lectures sur C #, et il semble qu'il ait beaucoup plus de fonctionnalités que Java. Quelques exemples:

  • Inférence de type.
  • dynamic mot-clé.
  • Délégués.
  • Paramètres facultatifs.
  • Lambda et LINQ (je n'ai en fait aucune idée de ce que c'est).
  • Propriétés.

Cependant, Java ne propose pas vraiment tout ce que C # n'a pas.

Ma question est: pourquoi C # a-t-il beaucoup plus de fonctionnalités natives que Java? Et pourquoi Java n'a-t-il pas ajouté certains de ces éléments au fil des ans, par exemple Propriétés ou inférence de type? Les concepteurs du langage Java adoptent-ils une approche plus simpliste? Quelle est la raison pour ça?

Aviv Cohn
la source
2
@Patrick - Est-ce une fonctionnalité - ou un détail d'implémentation?
Pete
14
Réponse biaisée: parce que l'équipe de conception C # sait ce qu'elle fait. Réponse plus raisonnable: C # a été conçu avec la connaissance des échecs de Java et sans le dogmatique "seulement pur OO" (qu'ils n'ont même pas tout à fait touché). La moitié de ces fonctionnalités ont été importées en masse de Lisp et Haskell, deux langages dont Java a fermement refusé de s'inspirer jusqu'à Java 8, et les autres sont des améliorations d'intégrité rendues aveuglément évidentes par le manque de Java.
Phoshi
4
Parce que C # est venu plus tard et était initialement une arnaque flagrante de Java, puis a eu l'occasion d'ajouter tout ce qui s'est avéré utile en plus, tandis que Java était entravé par des objectifs de compatibilité descendante très stricts.
Kilian Foth du
2
@ Clockwork-Muse mais C # a deux implémentations d'exécution - CLR et Mono. Il y a aussi Xamarin. Je n'ai pas entendu parler d'une seule solution pour construire des projets croisés iOS / Android / WinPhone en utilisant Java.
Den
4
@KilianFoth: En fait, C # était initialement une arnaque battante de Delphi , réécrite pour ressembler à Java. Microsoft a même braconné l'architecte du projet Delphi loin de Borland pour le créer.
Mason Wheeler

Réponses:

22

Plusieurs raisons:

  1. C # est venu plus tard que Java; la version 1 était une arnaque flagrante de Java 1.4, donc elle avait à peu près tout ce que Java avait à ce moment-là.
  2. Mais C # s'est ensuite développé beaucoup plus rapidement que Java, car il s'agissait d'une nouvelle plate-forme passionnante (et avait un pilote tout à fait brillant à Anders Hejlsberg, le père de Turbo Pascal). Cela leur a permis d'éviter toutes les erreurs de Java qui étaient devenues évidentes, tout en ajoutant tout ce que les praticiens de Java souhaitaient avoir.
  3. Pendant ce temps, Java était entravé par des objectifs de compatibilité descendante très stricts et par un rythme de développement un peu plus lent, en partie parce qu'il tentait désespérément de se faire la réputation d'être la solution standard, professionnelle, fiable et non surprenante pour 95% des non-génies. programmeurs. À cela, ils ont réussi, peut-être un peu trop bien.

Le résultat est que Java a maintenant un peu de manque de fonctionnalités. Il a d'énormes plans pour l'avenir, mais comme d'habitude avec ce genre de chose, tout prend un peu plus de temps que prévu.

Kilian Foth
la source
7
Je ne suis pas sûr d'être d'accord avec cela. Je veux dire que tout est vrai, mais je soupçonne que la raison a plus à voir avec la politique autour de l'effondrement de Sun. Java avait essentiellement plus de 5 ans ou plus où il n'y avait pas d'organisation / de leadership - donc il n'y avait pas de nouvelles fonctionnalités.
Telastyn
7
C # 1 avait des types de valeur. Quelque chose que Java n'aura jamais. Donc pas seulement une "arnaque flagrante".
Den
1
@Telastyn - Je pense que c'est la raison la plus importante ici. Surtout quand vous ajoutez "et ensuite vous vous faites acquérir par l'oracle" à la fin de l'effondrement du Soleil.
Wyatt Barnett
7
D'accord avec @Den. Je pense que la principale raison pour laquelle C # se développe plus rapidement (et dans la bonne direction) est le leadership d'Anders Hejlsberg. Lui et son équipe ont ajouté les meilleures fonctionnalités d'autres langages et ont réussi à les intégrer de manière transparente dans C #. Le résultat est que C # a des fonctionnalités de langage très soignées sans se sentir encombré ou désordonné.
David Kirkland du
1
@WesleyWiser - mis à niveau vers "pourrait avoir à l'avenir".
Den
4

J'ajouterais à la réponse de Kilian qu'une grande différence entre Java et C # est que les concepteurs C # contrôlent non seulement le langage, mais aussi l'IDE standard.

L'ajout de quelque chose comme des méthodes d'extension et des classes partielles pourrait être un cauchemar dans le développement / contrôle des versions si les IDE ne le supportaient pas correctement.

Comme vous êtes censé être capable de compiler Java avec la plate-forme de votre choix (Eclipse, Netbeans, vi + Ant), ajouter des fonctionnalités qui cassent le code (et les utiliser pour développer des extensions supplémentaires comme LINQ) est beaucoup plus compliqué que de simplement dire " comme IntelliSense traitera ces cas, nous ne devons pas nous inquiéter ".

De plus, il convient parfois de noter la valeur des fonctionnalités au lieu de leur nombre. Par exemple, les propriétés automatiques sont agréables et je souhaite certainement que Java le prenne en charge, mais au final cela signifie seulement que vous devez écrire quelques lignes de code supplémentaires en Java. De même, je trouve qu'appeler "Events" une fonctionnalité est un peu impropre, car ils ne sont guère plus que des délégués spécialement étiquetés, et juste une copie raffinée du modèle Observer déjà utilisé par Java (là encore, en Java, il a besoin de plus explicite codage)

Ne vous méprenez pas, je pense que C # a introduit plusieurs innovations notables, et je souhaite qu'un jour les grands patrons Oracle se réveillent et lancent un vrai "Java 2" pour inclure certains d'entre eux, mais l'écart n'est pas aussi évident que votre points d'interrogation.

SJuan76
la source
2
Les neuf lignes nécessaires pour une définition de propriété simple (déclaration + get / set + espace blanc) totalisent rapidement plus de "quelques-unes".
kevin cline le
@kevincline et moi documentons également correctement les setters et les getters. Mais au final, même si je n'utilise pas ma génération automatique de code IDE pour l'accesseur, je n'utilise pas de temps notable avec ceux-ci, lorsque vous tenez compte du temps passé dans la logique métier, les tests, la conception de code (en fait Je pense surtout à ceux-ci même en tapant les accesseurs). Donc, bien que ce soit agréable, ce n'est pas quelque chose qui fait une grande différence au final ...
SJuan76
3
Ce n'est pas le moment de les écrire. C'est le moment de les lire et de les ignorer, encore et encore et encore et encore, pendant que vous êtes en route vers les parties intéressantes.
kevin cline le
@kevincline Je suis d'accord, c'est une lisibilité abiut et le code est propre. C'est pourquoi j'apprécie des choses comme les événements, qui ne sont qu'un modèle d'observateur intégré, mais qui rendent les choses beaucoup plus propres si vous deviez les écrire vous
Aviv Cohn
@AvivCohn Le truc, c'est que "intégré" est l'élément clé. Vous pouvez avoir une répartition dynamique dans l'assemblage, vous pouvez avoir des fonctions d'ordre supérieur en C, chaque fonctionnalité de langage unique que vous pouvez avoir est possible dans l'assemblage - évidemment, car à un moment donné, il fonctionne toujours sur votre processeur x86. Vous avez rarement besoin d'implémenter le modèle de commande en C #, car vous avez des délégués. La même chose avec Observer et les événements, et bien d'autres. Java a eu des méthodes anonymes pendant un certain temps, mais vous avez dû créer un type anonyme complet . Toutes ces choses sont minuscules, mais elles s'additionnent.
Luaan