Como desarrollador de C #, ¿aprendería Java a desarrollar para Android o utilizaría MonoDroid en su lugar? [cerrado]

46

Me consideraría bastante versado en C #. Es mi idioma de elección en este momento, y es donde básicamente reside toda mi experiencia profesional.

Aún así, estoy desconcertado por la existencia del proyecto MonoDroid . Siempre he entendido que C # y Java están muy cerca. Por ejemplo, si conoces uno, puedes aprender el otro muy rápido. Entonces, como he considerado desarrollar mi primera aplicación de Android, asumí que me familiarizaría con Java lo suficiente como para comenzar y luego aprendería sobre la marcha.

¿No tendría más sentido que usar MonoDroid, que probablemente tenga menos funciones que el SDK de Android de Java, y de todos modos requiere aprender su propia API (aunque sea una API .NET)? Siento que sería mejor aprender un nuevo idioma (y uno extremadamente popular) y obtener algo de experiencia en él, cuando esté tan cerca de lo que ya sabes de todos modos, en lugar de seguir con una tecnología que tienes experiencia con, sin adquirir más habilidades valiosas.

Tal vez estoy tergiversando groseramente al usuario potencial promedio de MonoDroid. Tal vez sea más para personas con experiencia en Java y .NET y que simplemente prefieren .NET. O tal vez (de hecho es probable) hay otros factores que simplemente no he considerado. Me pregunto, ¿por qué usarías MonoDroid en lugar de solo desarrollar para Android con Java?

Dan Tao
fuente
11
Busque en Google la frase "es el nuevo COBOL" y vea qué idioma inventa Google ...
John Reynolds
1
@JohnReynolds Ironic entonces que el crecimiento más rápido en este momento está en dispositivos móviles y Android, usando "el nuevo COBOL". De cualquier manera que lo corte, incluso si elige MonoDroid, si está desarrollando para Android, todavía depende de "el nuevo COBOL".
Jason S
1
"el nuevo COBOL" se refiere al lenguaje, no a la VM (ya sea JVM o Dalvik). Por lo tanto, MonoDroid no se basa en "el nuevo COBOL" y tampoco Scala y Clojure ni ningún otro lenguaje JVM.
John Reynolds
También hay una gran cantidad del viejo COBOL.
Alan B
@JohnReynolds Lo irónico es que la mayor parte del código que se ejecuta hoy es COBOL; y lo más irónico es el hecho de que C # es un clon de Java (y uno pobre ya que también clonó la mayoría de las cosas incorrectas).
m3th0dman

Respuestas:

55

Cualquier programador competente de C # debería poder recoger rápidamente suficiente Java para escribir un programa de Android, pero ese no es el punto . Es una cuestión de reutilización de código.

Piense en seis meses a partir de ahora, cuando su programa de Android sea popular y sus usuarios soliciten una versión para iPhone y Windows Phone 7. Si hubiera utilizado MonoDroid, puede reutilizar la mayoría de la lógica de su aplicación con MonoTouch (Mono para iOS) y el SDK de Windows Phone. Ahora quieren una versión basada en la web, por lo que incluye las mismas bibliotecas de clases en un proyecto ASP.Net. Versiones de escritorio? No hay problema, esa misma biblioteca de clases funciona con .Net en Windows o Mono en Linux y OS X.

Aparte de C o C ++, no puedo pensar en ningún otro lenguaje que le permita reutilizar el mismo código en todos esos objetivos.

Edite para abordar algunas inquietudes en los comentarios: .Net y Mono no le permitirán escribir un programa completo y usar ese mismo programa en todas partes. Le permitirán compartir algo de código y, como toda programación multiplataforma, la cantidad de código compartido depende del tipo de programas que esté escribiendo y de qué tan bien separe la interfaz de usuario y el código de hardware de la lógica de la aplicación.

Sin embargo, si escribe su aplicación de Android en Java, ¿cuánto de eso es reutilizable en iOS o Windows Phone? Ese es el punto que estaba tratando de hacer. Tenía las bibliotecas C # existentes que funcionaban en Mono para Android en mucho menos tiempo del que me hubiera llevado implementarlas de nuevo, aunque ya conocía Java . Tengo un código que se comparte, sin modificar, entre un sitio web, programas de escritorio y aplicaciones móviles en dos plataformas móviles diferentes, gracias a Mono.

No quise dar a entender, ni siquiera indirectamente, que Mono era la herramienta perfecta para cada situación de desarrollo móvil. Es una compensación, pero creo firmemente que hay situaciones en las que Mono es una opción mucho mejor.

Por favor, vea (¡y vote!) La respuesta de Jason S para otra perspectiva.

Kevin
fuente
12
¡Y pensé que Java era el que tenía el eslogan "escribir una vez que se ejecuta en todas partes"!
Luciano
3
@Luciano: los mismos argumentos se podrían aplicar si el OP hubiera dicho que conocía Java y se preguntaba si aprender C #. Lo importante es la reutilización del código, no el idioma.
ChrisF
14
Mono fue elegido en casa por esta misma razón. Necesitábamos construir un cliente en múltiples plataformas y todos los codificadores nuevos c #. En teoría, fue una gran idea. En la práctica, sin embargo, se ha convertido en una pesadilla. Encontramos muchos lugares donde el código que funcionaba en una plataforma nativa .NET no funcionaría en una plataforma MacOS, por lo que tuvimos que hacer una excepción; entonces ese mismo código no funcionó en Linux. En general, mono parecía demasiado inestable. Al final, tuvimos que abandonar la idea y volver a escribir código nativo para el sistema operativo objetivo.
Chu
44
Aún así, el único código que es reutilizable es la lógica de negocios, no el código UI o el código que interactúa con el hardware del teléfono. Vea que tengo una aplicación MonoTouch o WindowsPhone 7, ¿puedo reconstruirla con Mono para Android y apuntar a Android? en las preguntas frecuentes de MonoDroid.
Jason S
2
@JasonS, he actualizado mi respuesta para abordar su comentario. Para el registro, mi única participación con Xamarin y Mono es como un usuario satisfecho.
Kevin
18

Este es un tipo de respuesta complementaria, ya que una cosa que parece haberse pasado por alto en las respuestas hasta ahora, se refiere a lo que en realidad es multiplataforma. Según Xamarin, esa es básicamente su lógica de negocio, no su interfaz de usuario ni ningún control de hardware como GPS, audio, libreta de direcciones, etc. Deberán escribirse específicamente para cada plataforma. Consulte su entrada de preguntas frecuentes. Tengo una aplicación MonoTouch o WindowsPhone 7, ¿puedo reconstruirla con Mono para Android y apuntar a Android? .

Con Mono, puede escribir su UI y el código de control del teléfono usando C #, pero no será portátil en ninguna plataforma. Tendrá que escribir la interfaz de usuario y el control del teléfono para cada plataforma, aunque puede escribirlo en C #. De cualquier manera, aún tendrá que aprender los detalles de los controles de la interfaz de usuario en Android y cómo Android maneja los recursos del teléfono.

Con Mono, tendrá que aprender la API de Mono, que llama a la API de Android. También tendrá que esperar a que Mono implemente nuevas funciones de Android y esperar que implementen todas las funciones de Android. Incluso si C # es más poderoso que Java, no podrá hacer más que si usa el SDK de Android directamente (en Java).

Si va directamente de C # a Android, ya que C # es tan sintácticamente similar a Java, entonces la mayoría del aprendizaje de un desarrollador de C # para Android aprenderá la API de Android.

Algunas consideraciones ...

C # para Android

Necesitar aprender

  • API de Android
  • API de Java: cadena, calendario y manejo de eventos, etc.

No necesito aprender

  • Sintaxis Java: C # es una sintaxis muy similar.

Otras Consideraciones

  • No podrá reutilizar el código en todas las plataformas.
  • No tendrá dependencias entre usted y el SDK de Android. Obtendrá nuevas características de Android a medida que se lanzan.
  • Es probable que tenga un mayor soporte y ejemplos para el código de Android que Mono.

C # a Mono

Necesitar aprender

  • Android: aún debe aprender la interfaz de usuario de Android y las funciones de control de hardware.
  • API de Mono: debe aprender a llamar a la API de Mono para hacer cosas con la interfaz de usuario y el hardware de Android.

No necesito aprender

  • Java API y sintaxis: puede desarrollar en C #

Otras Consideraciones

  • Reutilice el código: puede reutilizar el código C # que carece de cualquier código de interfaz de usuario o control de hardware y, por lo tanto, es pura "lógica de negocios". Aunque es ideal, tener una separación tan limpia no siempre es fácil. Tendrá que evaluar cuánto de su código no tendrá ninguna interfaz de usuario o control de hardware.
  • Dependencias: depende de que Mono implemente la API de Android. Es posible que haya algunos retrasos en las versiones de la API de Android o que algunas funciones de Android nunca se implementen.
  • Es posible que tenga menos documentación y ejemplos para elegir.
Jason S
fuente
Has olvidado mencionar P / Invoke. Una muestra.
Amir Karimi
-1: ¿Qué quieres decir Learn the Mono API? ¿Cuánto necesitas saber para desarrollar una aplicación de Android? ¿Y realmente has probado MonoDroid o estás adivinando?
Jim G.
@JimG. Por Learn the Mono API, quiero decir que todavía necesita aprender la API de Android que Mono replica, además de las partes que no. ¿Cuánto necesitas saber? Depende de la aplicación, depende de la persona, esa no era realmente la esencia del OP. ¿He usado MonoDroid? No. Tengo experiencia en C #, Java y Objective C, así que no es necesario. Considere Mono para la portabilidad. En el momento en que respondí, nadie había mencionado los límites de portabilidad. No me importa que las personas no estén de acuerdo conmigo, pero eso en sí mismo no hace que mi respuesta sea pobre.
Jason S
13

Creo que mucho tiene que ver con los recursos disponibles.

La sintaxis en C # y Java puede ser similar, pero ofrecen cosas muy diferentes. Por ejemplo, trabajar con fechas usando bibliotecas estándar de Java es una pesadilla, mientras que en C # es bastante agradable.

Corey
fuente
2
Interesante, por lo que el atractivo es más sobre obtener acceso a las bibliotecas .NET. ¿Sabes si .NET ofrece muchas funciones convenientes, relevantes para Android, que es más difícil de lograr con las API de Android Java?
Dan Tao
19
1 - Viniendo de C #, Java me parece que sea ... idiosincrásico en el mejor ...
Oded
44
Encuentro que las similitudes entre C # y Java no son una ventaja al cambiar entre ellas. Puedo cambiar entre C # y Python, Ruby o Lua sin pestañear, pero la última vez que intenté hacer algo de codificación Java, terminé apretando los dientes y girando las ruedas.
Adam Crossland
1
@Dan Tao: el atractivo no es más sobre el acceso a .Net estándar. Se trata tanto de eso como de reutilización. El beneficio de la reutilización debería ser obvio. En cuanto al acceso a .Net, lo veo de esta manera. He usado, digamos, XDocument 1000 y 1 veces. Si necesito escribir una aplicación móvil que integre datos XML de un servicio, la escribo a la velocidad del pensamiento. Si estoy aprendiendo Java, fácilmente podría tomar de 4 a 8 veces más tiempo (o 10 o 12, quién sabe) rebotando entre codificación y lectura de documentos. Si el uso es para negocios, es irresponsable hacer un proyecto mientras se aprende un idioma.
quentin-starin
9

Parece una gran oportunidad para aprender un nuevo idioma , que no creo que debas dejar pasar.

Pasar de C # a Java es muy sencillo, ya que se basan en los mismos conceptos. Java es como un subconjunto de C #, por lo que tendrá que desaprender algunas cosas (como propiedades y ensamblajes) y acostumbrarse a algunas convenciones nuevas, pero sobre todo debería ser obvio.

Martin Wickman
fuente
10
Y averiguar las diferencias entre cómo los genéricos funcionan en cada uno, y se preguntan por qué no existen propiedades y eventos y ...
Oded
55
Diferencias menores No es como si tuviera que aprender Haskell.
Martin Wickman el
1
+1 No hay daño en conocer algunos idiomas diferentes y tener un proyecto del mundo real en el que trabajar es una excelente manera de dominar uno si es un tipo de lenguaje similar al que ya conoces.
glenatron 01 de
Mejor asegúrese de que la persona que paga está bien pagando por una experiencia de aprendizaje.
quentin-starin
1
@qes: aprender algo que es redundante no es razón suficiente para justificar el costo en la mayoría de los casos, pero el desarrollo de una aplicación compleja en su entorno nativo será más fácil la mayor parte del tiempo, y eso podría hacer que el aprendizaje tenga más reducciones de costos a largo plazo.
Morgan Herlocker
3

Lección de historia rápida: MonoDroid surgió de MonoTouch. Tenía mucho sentido en ese momento. Desafortunadamente, Novell fue vendido y todo el equipo de Mono fue despedido. La buena noticia es que Miguel de Icaza obtuvo fondos y ha comenzado un nuevo equipo para reconstruir lo que era MonoTouch / MonoDroid. Así que estás en el limbo hasta que realmente se lancen.

Actualización de julio de 2011: el atuendo de Miguel ha recuperado los derechos de toda la pila Mono *. Consíguelo mientras está hawt.

Wyatt Barnett
fuente
Es bueno saberlo (actualización de julio de 2011). Había probado Mono antes y me pareció un poco decepcionante. ¡Lo intentaré de nuevo!
Brian Knoblauch el