En tant que développeur C #, voudriez-vous apprendre à Java à développer pour Android ou à utiliser MonoDroid à la place? [fermé]

46

Je me considère plutôt bien versé en C #. C'est ma langue de choix au moment, et il est là essentiellement tous mes mensonges d'expérience professionnelle.

Malgré tout, je suis perplexe devant l'existence du projet MonoDroid . D'après ce que j'ai compris, C # et Java sont très proches. Par exemple, si vous en connaissez un, vous pouvez apprendre l’autre très rapidement. Alors, lorsque j'ai envisagé de développer ma première application Android, j'ai juste supposé que je me familiariserais suffisamment avec Java pour pouvoir démarrer et ensuite apprendre en quelque sorte au fur et à mesure.

Cela n’aurait-il pas plus de sens que d’utiliser MonoDroid, qui est probablement moins riche en fonctionnalités que le SDK Java Android, et nécessite de toute façon l’apprentissage de sa propre API (bien qu’une API .NET)? Je pense simplement qu'il serait préférable d'apprendre une nouvelle langue (et extrêmement populaire) et d'acquérir de l'expérience - quand c'est si proche de ce que vous savez déjà de toute façon - plutôt que de rester avec une technologie que vous avez expérimentée avec, sans acquérir plus de compétences précieuses.

Peut-être que je me trompe énormément quant à l'utilisateur potentiel moyen de MonoDroid. Peut-être est-ce davantage pour les personnes expérimentées dans Java et .NET et qui préfèrent simplement .NET. Ou peut-être (en fait, c'est probable) il y a d'autres facteurs que je n'ai tout simplement pas pris en compte. Je me demandais simplement pourquoi utiliser MonoDroid au lieu de simplement développer pour Android avec Java?

Dan Tao
la source
11
Google la phrase "est le nouveau COBOL" et voir quelle langue google propose ...
John Reynolds
1
@JohnReynolds Ironic a alors déclaré que la croissance la plus rapide en ce moment concerne le mobile et Android, utilisant "le nouveau COBOL". Quelle que soit la méthode utilisée, même si vous choisissez MonoDroid, si vous développez pour Android, vous vous basez toujours sur "le nouveau COBOL".
Jason S
1
"Le nouveau COBOL" fait référence au langage, pas à la VM (que ce soit la JVM ou Dalvik). Donc, MonoDroid ne repose pas sur "le nouveau COBOL", ni Scala et Clojure, ni aucun autre langage JVM.
John Reynolds
Il y a encore beaucoup de vieux COBOL dans les parages.
Alan B
@JohnReynolds Ce qui est ironique, c'est que la majeure partie du code en cours d'exécution est COBOL; et le plus ironique est le fait que C # est un clone de Java (et un pauvre puisqu'il a également cloné la plupart des mauvaises choses).
m3th0dman

Réponses:

55

Tout programmeur C # compétent devrait être en mesure de prendre rapidement assez de Java pour écrire un programme Android, mais ce n’est pas la raison . C'est une question de réutilisation de code.

Pensez à six mois à partir de maintenant, lorsque votre programme Android sera populaire et que vos utilisateurs demanderont une version pour iPhone et Windows Phone 7. Si vous aviez utilisé MonoDroid, vous pouvez réutiliser la majeure partie de la logique de votre application avec MonoTouch (Mono pour iOS) et le kit de développement logiciel Windows Phone. Maintenant, ils veulent une version Web, vous devez donc inclure les mêmes bibliothèques de classes dans un projet ASP.Net. Versions de bureau? Aucun problème, cette même bibliothèque de classes fonctionne avec .Net sous Windows ou Mono sous Linux et OS X.

À part le C ou le C ++, je ne vois aucun autre langage qui vous permettrait de réutiliser le même code sur toutes ces cibles.

Modifier pour répondre aux préoccupations exprimées dans les commentaires: .Net et Mono ne vous laisseront pas écrire un programme complet et utiliseront le même programme partout. Ils vous permettront de partager du code. Comme pour toute programmation multiplate-forme, la quantité de code partagé dépend du type de programme que vous écrivez et de votre capacité à séparer le code de l'interface utilisateur et du matériel de la logique de l'application.

Toutefois, si vous écrivez votre application Android en Java, quelle part de celle-ci est réutilisable sur iOS ou Windows Phone? C'est ce que j'essayais de dire. J'avais des bibliothèques C # existantes qui travaillaient sur Mono pour Android en moins de temps qu'il aurait fallu pour les réimplémenter, même si je connaissais déjà Java . J'ai un code partagé - non modifié - entre un site Web, des programmes pour ordinateur et des applications mobiles sur deux plates-formes mobiles différentes, grâce à Mono.

Je ne voulais pas dire, même indirectement, que Mono était l'outil idéal pour chaque situation de développement mobile. C'est un compromis, mais je crois fermement qu'il existe des situations dans lesquelles Mono est un bien meilleur choix.

S'il vous plaît voir (et upvote!) La réponse de Jason S pour une autre perspective.

Kevin
la source
12
Et je pensais que Java était celui avec le slogan "écrire une fois couru partout"!
Luciano
3
@ Luciano - les mêmes arguments pourraient être appliqués si l'OP avait déclaré connaître Java, car il se demandait s'il devait apprendre le C #. Le bit important est la réutilisation du code, pas la langue.
ChrisF
14
Mono a été choisi en interne pour cette même raison. Nous devions créer un client sur plusieurs plates-formes et tous les nouveaux codeurs c #. En théorie, c'était une bonne idée. Dans la pratique cependant, cela s'est transformé en cauchemar. Nous avons trouvé de nombreux endroits où le code fonctionnant sur une plate-forme native .NET ne fonctionnait pas sur une plate-forme MacOS. Nous avons donc dû créer une exception. alors ce même code ne fonctionnait pas sous Linux. Dans l’ensemble, le mono semblait trop instable. À la fin, nous avons dû abandonner l'idée et recommencer à écrire du code natif pour le système d'exploitation ciblé.
Chu
4
Néanmoins, le seul code réutilisable est la logique métier, et non le code de l'interface utilisateur ou le code qui interagit avec le matériel du téléphone. Voir J'ai une application MonoTouch ou WindowsPhone 7, puis-je la reconstruire avec Mono pour Android et Android? sur la FAQ MonoDroid.
Jason S
2
@JasonS, j'ai mis à jour ma réponse pour répondre à votre commentaire. Pour rappel, ma seule implication avec Xamarin et Mono est d’être un utilisateur satisfait.
Kevin
18

C’est une sorte de réponse supplémentaire, puisqu’une chose qui semble avoir été négligée dans les réponses jusqu’à présent concerne ce qui est en réalité multiplate-forme. Selon Xamarin eux-mêmes, il s’agit essentiellement de votre logique d’affaires, et non de votre interface utilisateur ou de tout contrôle matériel tel que le GPS, l’audio, le carnet d’adresses, etc. Ceux-ci devront être écrits spécifiquement pour chaque plate-forme. Voir leur entrée de FAQ J'ai une application MonoTouch ou WindowsPhone 7, puis-je la reconstruire avec Mono pour Android et Android? .

Avec Mono, vous pouvez écrire votre code de contrôle d’interface utilisateur et de téléphone en C # mais il ne sera pas portable sur aucune plate-forme. Vous devrez écrire l'interface utilisateur et le contrôle du téléphone pour chaque plate-forme, même si vous pouvez l'écrire en C #. Quoi qu'il en soit, vous devrez toujours apprendre les spécificités des commandes de l'interface utilisateur sous Android et savoir comment Android gère les ressources du téléphone.

Avec Mono, vous devez apprendre l'API Mono, qui appelle l'API Android. Vous devrez également attendre que Mono mette en œuvre les nouvelles fonctionnalités Android et espérez qu’elles implémenteront toutes les fonctionnalités Android. Même si C # est plus puissant que Java, vous ne pourrez pas faire plus que si vous utilisez directement le SDK Android (en Java).

Si vous passez directement de C # à Android, étant donné que la syntaxe de C # est si semblable à celle de Java, l'essentiel de l'apprentissage d'un développeur C # pour Android consistera à apprendre l'API Android.

Quelques considérations ...

C # à Android

Besoin d'apprendre

  • API Android
  • API Java: chaîne, gestion du calendrier et des événements, etc.

Pas besoin d'apprendre

  • Syntaxe Java: C # est une syntaxe très similaire.

Autres considérations

  • Vous ne pourrez pas réutiliser du code sur toutes les plateformes.
  • Vous n'aurez aucune dépendance entre vous et le SDK Android. Vous obtiendrez de nouvelles fonctionnalités Android au fur et à mesure de leur publication.
  • Vous aurez probablement un meilleur support et des exemples de code Android que Mono.

C # à Mono

Besoin d'apprendre

  • Android: Vous devez encore apprendre les fonctions de contrôle de l'interface utilisateur et du matériel Android.
  • API Mono: Vous devez apprendre à appeler l'API Mono pour créer des éléments avec l'interface utilisateur et le matériel Android.

Pas besoin d'apprendre

  • API Java et syntaxe: vous pouvez développer en C #

Autres considérations

  • Code de réutilisation: vous pouvez réutiliser un code C # dépourvu de tout code de contrôle de l'interface utilisateur ou du matériel, et donc de la "logique métier" pure. Bien qu'idéal, une séparation aussi nette n'est pas toujours facile. Vous devrez évaluer dans quelle mesure votre code ne bénéficiera d'aucun contrôle de l'interface utilisateur ou du matériel.
  • Dépendances: vous dépendez de Mono pour implémenter l'API Android. Il peut y avoir un décalage par rapport aux versions de l'API Android ou certaines fonctionnalités Android peuvent ne jamais être mises en œuvre.
  • Vous aurez peut-être moins de documentation et d’exemples à choisir.
Jason S
la source
Vous avez oublié de mentionner P / Invoke. Un échantillon.
Amir Karimi
-1: Que voulez-vous dire Learn the Mono API? Combien avez-vous réellement besoin de savoir pour développer une application Android? Et avez-vous réellement essayé MonoDroid ou devinez-vous?
Jim G.
@ JimG. Par Learn the Mono API, je veux dire que vous devez encore apprendre l’API Android que Mono réplique, en plus des éléments qu’elle ne contient pas. Combien avez-vous besoin de savoir? Dépend de l'application, dépend de la personne - ce n'était pas vraiment l'essentiel du PO. Ai-je utilisé MonoDroid? Non, j'ai de l'expérience en C #, Java et Objective C, donc pas besoin. J'ai considéré Mono pour la portabilité. À l'époque, j'ai répondu que personne n'avait mentionné les limites de la portabilité. Les gens ne sont pas en désaccord avec moi, mais cela ne rend pas ma réponse médiocre.
Jason S
13

Je pense que cela dépend en grande partie des ressources disponibles.

La syntaxe en C # et Java peut être similaire, mais ils offrent des choses très différentes. Par exemple, travailler avec des dates à l'aide de bibliothèques Java standard est un cauchemar, alors qu'en C #, c'est plutôt agréable.

Corey
la source
2
Intéressant. L’appel consiste donc davantage à accéder aux bibliothèques .NET. Savez-vous si .NET offre beaucoup de fonctionnalités pratiques, relatives à Android, plus difficiles à obtenir avec les API Java Android?
Dan Tao
19
+1 - En venant de C #, je trouve que java est ... idiosyncratique au mieux ...
Oded
4
Je trouve que les similitudes entre C # et Java ne constituent pas un avantage lors du basculement entre elles. Je peux basculer entre C # et Python, Ruby ou Lua sans un clin d'œil, mais la dernière fois que j'ai essayé de coder en Java, j'ai fini par grincer des dents et faire tourner mes roues.
Adam Crossland
1
@Dan Tao: l'appel n'est pas plus axé sur l'accès au standard .Net. C'est à la fois ça et la réutilisation. L'avantage de la réutilisation devrait être évident. En ce qui concerne l’accès à .Net, j’envisage la situation de la sorte. J'ai utilisé, par exemple, XDocument 1000 et 1 fois. Si j'ai besoin d'écrire une application mobile qui intègre les données XML d'un service, je l'écris à la vitesse de la pensée. Si j'apprends Java, je pourrais facilement prendre 4 à 8 fois plus de temps (ou 10 ou 12 ans, qui sait) en alternance entre le codage et la lecture de documents. Si l'utilisation est pour les affaires, il est irresponsable de faire un projet tout en apprenant une langue.
Quentin-Starin
9

Cela semble être une excellente occasion d’apprendre une nouvelle langue , et je pense que vous ne devriez pas le laisser passer.

Passer de C # à Java est un jeu d'enfant, car ils sont basés sur les mêmes concepts. Java est comme un sous-ensemble de C #, vous devrez donc désapprendre certaines choses (telles que les propriétés et les assemblages) et vous habituer à de nouvelles conventions, mais la plupart du temps, cela devrait être une évidence.

Martin Wickman
la source
10
Et déterminez les différences entre le fonctionnement des génériques dans chacun d’entre eux et demandez-vous pourquoi les propriétés n’existent pas, et les événements et ...
Oded, le
5
Différences mineures. Ce n'est pas comme s'il devait apprendre Haskell.
Martin Wickman
1
+1 Rien de mal à connaître quelques langues différentes et à travailler sur un projet concret est un excellent moyen d'en maîtriser une si c'est un type de langage similaire à celui que vous connaissez déjà.
Glenatron
Mieux vaut s’assurer que la personne qui paie paie bien pour une expérience d’apprentissage.
Quentin-Starin
1
@qes - Apprendre quelque chose qui est redondant n'est pas une raison suffisante pour en justifier le coût dans la plupart des cas, mais le développement d'une application complexe dans son environnement natif se déroulera plus facilement la plupart du temps, ce qui pourrait rendre l'apprentissage plus utile. réduction des coûts à long terme.
Morgan Herlocker
3

Leçon d'histoire rapide - MonoDroid est issu de MonoTouch. Fait beaucoup de sens à l'époque. Malheureusement, Novell a été vendu et toute l'équipe de Mono a été mise à pied. La bonne nouvelle est que Miguel de Icaza a obtenu un financement et a lancé une nouvelle équipe pour reconstruire ce qui était MonoTouch / MonoDroid. Donc, vous êtes en quelque sorte dans les limbes jusqu'à ce qu'ils se lancent vraiment.

Mise à jour de juillet 2011: la tenue de Miguel a repris les droits sur l'ensemble de la pile Mono *. Obtenez-le pendant qu'il est hawt.

Wyatt Barnett
la source
Bon à entendre (mise à jour de juillet 2011). J'avais déjà essayé Mono et je l'avais trouvé un peu décevant. Je vais faire un autre essai!
Brian Knoblauch