Würden Sie als C # -Entwickler Java für Android lernen oder stattdessen MonoDroid verwenden? [geschlossen]

46

Ich würde mich als ziemlich versiert in C # bezeichnen. Momentan ist es meine bevorzugte Sprache, und hier liegt im Grunde meine gesamte Berufserfahrung.

Trotzdem bin ich verwirrt über die Existenz des MonoDroid- Projekts. Ich habe immer verstanden, dass C # und Java sehr nahe beieinander liegen. Wenn Sie eines kennen, können Sie das andere sehr schnell lernen. Als ich überlegte, meine erste Android-App zu entwickeln, ging ich einfach davon aus, dass ich mich mit Java so gut vertraut machen würde, dass ich anfangen und dann einfach lernen könnte, wie ich anfange.

Wäre dies nicht sinnvoller als die Verwendung von MonoDroid, das wahrscheinlich weniger funktionsreich ist als das Java Android SDK, und das ohnehin das Erlernen einer eigenen API (wenn auch einer .NET-API) erfordert? Ich habe einfach das Gefühl, dass es besser ist, eine neue Sprache zu lernen (und zwar eine äußerst beliebte) und Erfahrungen damit zu sammeln - wenn es so nah an dem ist, was Sie ohnehin schon wissen -, als sich an eine Technologie zu halten, die Sie kennen mit, ohne weitere wertvolle Fähigkeiten zu erlangen.

Vielleicht bin ich den durchschnittlichen potenziellen MonoDroid-Benutzer grob falsch dargestellt. Vielleicht ist es eher etwas für Leute, die Erfahrung mit Java und .NET haben und einfach .NET bevorzugen. Oder vielleicht (tatsächlich ist es wahrscheinlich) gibt es andere Faktoren, die ich einfach nicht berücksichtigt habe. Ich frage mich nur, warum sollten Sie MonoDroid verwenden, anstatt nur mit Java für Android zu entwickeln?

Dan Tao
quelle
11
Google die Phrase "ist der neue COBOL" und sehen, welche Sprache Google kommt mit ...
John Reynolds
1
@JohnReynolds Ironic dann, dass das schnellste Wachstum im Moment in Mobile und Android ist, mit "dem neuen COBOL". Unabhängig davon, wie Sie es in Scheiben schneiden, selbst wenn Sie sich für MonoDroid entscheiden, wenn Sie für Android entwickeln, verlassen Sie sich immer noch auf "den neuen COBOL".
Jason S
1
"der neue COBOL" bezieht sich auf die Sprache, nicht auf die VM (sei es JVM oder Dalvik). Daher verlässt sich MonoDroid nicht auf "das neue COBOL" und Scala und Clojure oder eine andere JVM-Sprache auch nicht.
John Reynolds
Auch vom alten COBOL gibt es noch eine Menge.
Alan B
@JohnReynolds Das Ironische ist, dass der größte Teil des Codes, der heute ausgeführt wird, COBOL ist; und am ironischsten ist die Tatsache, dass C # ein Klon von Java ist (und ein armer, da es auch die meisten falschen Dinge geklont hat).
m3th0dman

Antworten:

55

Jeder kompetente C # -Programmierer sollte in der Lage sein, schnell genug Java zu lernen, um ein Android-Programm zu schreiben, aber darum geht es nicht . Es ist eine Frage der Wiederverwendung von Code.

Denken Sie in sechs Monaten darüber nach, wann Ihr Android-Programm beliebt ist und Ihre Benutzer nach einer Version für iPhone und Windows Phone 7 fragen. Wenn Sie MonoDroid verwendet haben, können Sie den größten Teil Ihrer Anwendungslogik mit MonoTouch (Mono für iOS) und wiederverwenden das Windows Phone SDK. Jetzt möchten sie eine webbasierte Version, sodass Sie dieselben Klassenbibliotheken in ein ASP.Net-Projekt einbinden. Desktop-Versionen? Kein Problem, die gleiche Klassenbibliothek funktioniert mit .Net unter Windows oder Mono unter Linux und OS X.

Außer C oder C ++ fallen mir keine anderen Sprachen ein, mit denen Sie denselben Code auf allen diesen Zielen wiederverwenden können.

Bearbeiten Sie, um einige Bedenken in den Kommentaren auszuräumen: Mit .Net und Mono können Sie kein vollständiges Programm schreiben und überall dasselbe Programm verwenden. Sie lassen Sie teilen einige Code, und wie alle plattformübergreifende Programmierung der Menge an gemeinsam genutztem Code hängt von der Art von Programmen Sie schreiben und wie gut trennen Sie die Benutzeroberfläche und Hardware - Code von der Anwendungslogik.

Wenn Sie jedoch Ihre Android-App in Java schreiben, wie viel davon kann auf iOS oder Windows Phone wiederverwendet werden? Das ist der Punkt, den ich machen wollte. Ich hatte bereits C # -Bibliotheken, die in viel kürzerer Zeit an Mono für Android arbeiteten, als es nötig gewesen wäre, sie erneut zu implementieren, obwohl ich Java bereits kannte . Ich habe einen Code, der dank Mono von einer Website, Desktop-Programmen und mobilen Apps auf zwei verschiedenen mobilen Plattformen gemeinsam genutzt wird - und zwar unverändert.

Ich wollte nicht implizieren, dass Mono das perfekte Werkzeug für jede mobile Entwicklungssituation ist. Es ist ein Kompromiss, aber ich glaube fest daran, dass es Situationen gibt, in denen Mono eine viel bessere Wahl ist.

Bitte sehen Sie (und stimmen Sie zu!) Die Antwort von Jason S. für eine andere Perspektive.

Kevin
quelle
12
Und ich dachte, dass Java derjenige ist, der den Slogan "Write Once Run Anywhere" trägt!
Luciano
3
@ Luciano - die gleichen Argumente könnten angewendet werden, wenn das OP gesagt hätte, dass er Java kenne, und sich fragen würde, ob er C # lernen soll. Das wichtige Bit ist die Wiederverwendung von Code, nicht die Sprache.
ChrisF
14
Mono wurde aus demselben Grund im Haus ausgewählt. Wir mussten einen Client auf mehreren Plattformen erstellen und alle Codierer neu c #. In der Theorie war es eine großartige Idee. In der Praxis hat es sich jedoch zu einem Albtraum entwickelt. Wir fanden viele Stellen, an denen Code, der auf einer nativen .NET-Plattform funktionierte, auf einer MacOS-Plattform nicht funktionierte, sodass wir eine Ausnahme machen mussten. dann funktionierte derselbe Code in LInux nicht. Insgesamt wirkte Mono zu instabil. Am Ende mussten wir die Idee aufgeben und wieder nativen Code für das Zielbetriebssystem schreiben.
Chu
4
Der einzige Code, der wiederverwendbar ist, ist die Geschäftslogik, nicht der UI-Code oder Code, der mit der Telefonhardware interagiert. Wenn ich sehe, dass ich eine MonoTouch- oder WindowsPhone 7-Anwendung habe, kann ich sie einfach mit Mono für Android neu erstellen und auf Android ausrichten? auf der MonoDroid FAQ.
Jason S
2
@JasonS, ich habe meine Antwort aktualisiert, um Ihren Kommentar zu adressieren. Für die Aufzeichnung ist meine einzige Beteiligung an Xamarin und Mono als ein zufriedener Benutzer.
Kevin
18

Dies ist eine Art ergänzende Antwort, da eine Sache, die bisher in den Antworten übersehen wurde, die Frage betrifft, was eigentlich plattformübergreifend ist. Laut Xamarin selbst ist dies im Grunde Ihre Geschäftslogik, nicht Ihre Benutzeroberfläche oder eine Hardware-Steuerung wie GPS, Audio, Adressbuch und so weiter. Diese müssen für jede Plattform spezifisch geschrieben werden. Siehe deren FAQ-Eintrag. Ich habe eine MonoTouch- oder WindowsPhone 7-Anwendung. Kann ich sie einfach mit Mono für Android neu erstellen und auf Android ausrichten? .

Mit Mono können Sie Ihren UI- und Telefonsteuerungscode mit C # schreiben, der jedoch auf keine Plattform portierbar ist. Sie müssen die Benutzeroberfläche und die Telefonsteuerung für jede Plattform schreiben, obwohl Sie sie in C # schreiben können. In beiden Fällen müssen Sie sich noch mit den Besonderheiten der Benutzeroberflächen-Steuerelemente auf Android und dem Umgang mit Telefonressourcen auf Android vertraut machen.

Wenn Sie Mono verwenden, müssen Sie die Mono-API lernen, die die Android-API aufruft. Sie müssen auch warten, bis Mono neue Android-Funktionen implementiert hat, und hoffen, dass alle Android-Funktionen implementiert sind. Auch wenn C # leistungsstärker als Java ist, können Sie nicht mehr tun, als wenn Sie das Android SDK direkt (in Java) verwenden.

Wenn Sie direkt von C # auf Android umsteigen, da C # in seiner Syntax Java ähnelt, wird der größte Teil des Lernens eines C # -Entwicklers für Android das Erlernen der Android-API sein.

Einige Überlegungen ...

C # auf Android

Muss lernen

  • Android API
  • Java API: String, Kalender und Eventhandling etc.

Ich muss nicht lernen

  • Java-Syntax: C # ist sehr ähnlich.

Andere Überlegungen

  • Sie können Code nicht plattformübergreifend wiederverwenden.
  • Sie haben keine Abhängigkeiten zwischen Ihnen und dem Android SDK. Sie erhalten neue Android-Funktionen, sobald sie veröffentlicht werden.
  • Sie werden wahrscheinlich mehr Unterstützung und Beispiele für Android-Code als Mono haben.

C # zu Mono

Muss lernen

  • Android: Sie müssen sich noch mit der Benutzeroberfläche und den Funktionen zur Hardware-Steuerung von Android vertraut machen.
  • Mono-API: Sie müssen lernen, wie Sie die Mono-API aufrufen, um mit der Benutzeroberfläche und der Hardware von Android zu arbeiten.

Ich muss nicht lernen

  • Java API und Syntax: Sie können in C # entwickeln

Andere Überlegungen

  • Wiederverwendungscode: Sie können C # -Code wiederverwenden, der keinen Benutzeroberflächen- oder Hardwaresteuerungscode enthält und daher reine "Geschäftslogik" ist. Obwohl ideal, ist eine so saubere Trennung nicht immer einfach. Sie müssen bewerten, wie viel von Ihrem Code keine Benutzeroberfläche oder Hardware-Steuerung hat.
  • Abhängigkeiten: Sie sind davon abhängig, dass Mono die Android-API implementiert. Es kann zu Verzögerungen bei den Android-API-Versionen kommen, oder einige Android-Funktionen werden möglicherweise nie implementiert.
  • Möglicherweise haben Sie weniger Dokumentation und Beispiele zur Auswahl.
Jason S
quelle
Sie haben vergessen, P / Invoke zu erwähnen. Eine Probe.
Amir Karimi
-1: Was meinst du Learn the Mono API? Wie viel muss man eigentlich wissen, um eine Android-App zu entwickeln? Und haben Sie es tatsächlich mit MonoDroid versucht oder raten Sie?
Jim G.
@JimG. Damit Learn the Mono APImeine ich, dass Sie noch die Android-API lernen müssen, die Mono repliziert, zusätzlich zu den Teilen, die es nicht tut. Wie viel müssen Sie wissen? Kommt auf die App an, kommt auf die Person an - das war eigentlich nicht der Kern des OP. Habe ich MonoDroid benutzt? Nein, ich habe C # -, Java- und Objective C-Erfahrung, also keine Notwendigkeit. Ich habe Mono für die Portabilität in Betracht gezogen. Zu der Zeit, als ich antwortete, hatte niemand die Grenzen der Portabilität erwähnt. Es macht mir nichts aus, wenn Leute mit mir nicht einverstanden sind, aber das allein macht meine Antwort nicht schlecht.
Jason S
13

Ich denke, viel hat mit den verfügbaren Ressourcen zu tun.

Die Syntax in C # und Java ist zwar ähnlich, bietet jedoch sehr unterschiedliche Funktionen. Das Arbeiten mit Datumsangaben mithilfe von Java-Standardbibliotheken ist beispielsweise ein Albtraum, während es in C # recht angenehm ist.

Corey
quelle
2
Interessant - der Reiz liegt also eher darin, Zugriff auf die .NET-Bibliotheken zu erhalten. Wissen Sie zufällig, ob .NET viele praktische Funktionen für Android bietet, die mit den Java-Android-APIs schwieriger zu erreichen sind?
Dan Tao
19
+1 - Ich komme aus C # und finde Java im besten Fall ... eigenwillig ...
Oded
4
Ich finde, dass die Ähnlichkeiten zwischen C # und Java kein Vorteil sind, wenn man zwischen ihnen wechselt. Ich kann ohne zu blinken zwischen C # und Python, Ruby oder Lua wechseln, aber als ich das letzte Mal versucht habe, Java-Code zu schreiben, habe ich mir die Zähne zusammengebissen und die Räder gedreht.
Adam Crossland
1
@ Dan Tao: Der Appell bezieht sich nicht mehr auf den Zugang zu Standard-.Net. Es geht um beides und Wiederverwendung. Der Nutzen der Wiederverwendung sollte offensichtlich sein. Was den Zugang zu .Net angeht, sehe ich das so. Ich habe beispielsweise XDocument 1000 und 1 Mal verwendet. Wenn ich eine mobile App schreiben muss, die XML-Daten von einem Dienst integriert, schreibe ich sie mit der Geschwindigkeit des Denkens. Wenn ich Java lerne , kann ich leicht 4- bis 8-mal so lange brauchen (oder 10 oder 12, wer weiß), um zwischen dem Codieren und Lesen von Dokumenten hin und her zu springen. Wenn der Gebrauch für Unternehmen ist, ist es unverantwortlich, ein Projekt zu machen, während Sie eine Sprache lernen.
Quentin-Starin
9

Es sieht nach einer großartigen Gelegenheit aus, eine neue Sprache zu lernen , die Sie meines Erachtens nicht verpassen sollten.

Der Wechsel von C # nach Java ist ein Kinderspiel, da sie auf denselben Konzepten basieren. Java ist wie eine Teilmenge von C #, so dass Sie einige Dinge (wie Eigenschaften und Assemblys) verlernen und sich an einige neue Konventionen gewöhnen müssen, aber meistens sollte es ein Kinderspiel sein.

Martin Wickman
quelle
10
Finden Sie heraus, welche Unterschiede zwischen der Funktionsweise von Generika bestehen, und fragen Sie sich, warum es keine Eigenschaften gibt, sowie nach Ereignissen und ...
Oded
5
Kleinere Unterschiede. Es ist nicht so, dass er Haskell lernen muss.
Martin Wickman
1
+1 Es schadet nichts, ein paar verschiedene Sprachen zu beherrschen und ein reales Projekt zu haben, an dem man arbeiten kann. Dies ist eine großartige Möglichkeit, den Dreh raus zu bekommen, wenn es sich um eine Sprache handelt, die derjenigen ähnelt, die Sie bereits kennen.
Glenatron
Stellen Sie sicher, dass die bezahlende Person für eine Lernerfahrung bezahlt.
Quentin-Starin
1
@qes - Etwas zu lernen, das überflüssig ist, ist in den meisten Fällen kein ausreichender Grund, um die Kosten zu rechtfertigen, aber die Entwicklung einer komplexen App in der nativen Umgebung wird die meiste Zeit reibungsloser verlaufen und das Lernen könnte sich weiter entwickeln langfristige Kostensenkungen.
Morgan Herlocker
3

Schnelle Geschichtsstunde - MonoDroid ist aus MonoTouch erwachsen geworden. Zu der Zeit viel Sinn gemacht. Leider wurde Novell verkauft und das gesamte Mono-Team entlassen. Die gute Nachricht ist, dass Miguel de Icaza sich die Finanzierung gesichert und ein neues Outfit gestartet hat, um das, was MonoTouch / MonoDroid war, wieder aufzubauen. Sie sind also irgendwie in der Schwebe, bis sie wirklich starten.

Update Juli 2011: Miguels Outfit hat die Rechte für den gesamten Mono * -Stack wiedererlangt. Holen Sie sich, während es hawt ist.

Wyatt Barnett
quelle
Gut zu hören (Juli 2011 Update). Ich hatte Mono schon einmal ausprobiert und fand es ein bisschen enttäuschend. Ich werde es noch einmal versuchen!
Brian Knoblauch