Будучи разработчиком на C #, научитесь ли вы разрабатывать Java для Android или использовать вместо этого MonoDroid? [закрыто]

46

Я считаю себя довольно хорошо разбирающимся в C #. Это мой любимый язык на данный момент, и в этом весь мой профессиональный опыт.

Тем не менее, я озадачен существованием проекта MonoDroid . Я всегда понимал, что C # и Java очень близки. Мол, если вы знаете одно, вы можете выучить другое очень быстро. Итак, поскольку я думал о разработке своего первого приложения для Android, я просто предполагал, что достаточно познакомлюсь с Java, чтобы начать, а затем просто учусь на ходу.

Разве это не имеет больше смысла, чем использование MonoDroid, который, вероятно, будет менее многофункциональным, чем Java Android SDK, и в любом случае требует изучения своего собственного API (хотя и .NET API)? Я просто чувствую, что было бы лучше выучить новый язык (и в то же время чрезвычайно популярный) и получить в нем некоторый опыт - когда он все равно настолько близок к тому, что вы уже знаете, - чем придерживаться технологии, которую вы испытали с, без получения каких-либо более ценных навыков.

Возможно я сильно искажаю средний потенциальный пользователь MonoDroid. Может быть, это больше для людей, которые имеют опыт работы с Java и .NET и просто предпочитают .NET. Или, может быть (на самом деле это вероятно), есть и другие факторы, которые я просто не учел. Мне просто интересно, почему бы вам использовать MonoDroid вместо просто разработки для Android с использованием Java?

Дэн Тао
источник
11
Гугл фразу «это новый Кобол» и посмотри, на каком языке придумывает гугл ...
Джон Рейнольдс
1
@JohnReynolds Ironic тогда, что самый быстрый рост в настоящее время в мобильных и Android, используя «новый COBOL». Каким бы способом вы ни нарезали его, даже если вы выбираете MonoDroid, если вы разрабатываете для Android, вы все равно полагаетесь на «новый COBOL».
Джейсон С
1
«новый COBOL» относится к языку, а не к виртуальной машине (будь то JVM или Dalvik). Таким образом, MonoDroid не полагается на «новый COBOL», равно как и Scala, Clojure или любой другой язык JVM.
Джон Рейнольдс
Там еще огромное количество старого КОБОЛА.
Алан Б.
@JohnReynolds Ирония заключается в том, что большая часть кода, который выполняется сегодня, - это COBOL; и самым ироничным является тот факт, что C # является клоном Java (и плохим, поскольку он также клонировал большинство неправильных вещей).
m3th0dman

Ответы:

55

Любой компетентный программист на C # должен быстро освоить Java, чтобы написать программу для Android, но это не главное . Это вопрос повторного использования кода.

Подумайте о том, что через шесть месяцев ваша Android-программа станет популярной, и ваши пользователи будут запрашивать версию для iPhone и Windows Phone 7. Если вы использовали MonoDroid, вы можете повторно использовать большую часть логики приложения с помощью MonoTouch (Mono для iOS) и Windows Phone SDK. Теперь им нужна веб-версия, поэтому вы включаете те же библиотеки классов в проект ASP.Net. Настольные версии? Нет проблем, эта же библиотека классов работает с .Net под Windows или Mono на Linux и OS X.

Кроме C или C ++, я не могу представить ни одного другого языка, который позволил бы вам повторно использовать один и тот же код для всех этих целей.

Отредактируйте, чтобы устранить некоторые проблемы в комментариях: .Net и Mono не позволят вам написать законченную программу и использовать эту программу везде. Они позволят вам поделиться некоторым кодом, и, как и во всех кроссплатформенных программах, объем общего кода зависит от типа программ, которые вы пишете, и от того, насколько хорошо вы отделяете пользовательский интерфейс и программный код от логики приложения.

Однако, если вы напишите свое приложение для Android на Java, сколько из этого можно будет повторно использовать на iOS или Windows Phone? Это то, что я пытался сделать. У меня были существующие библиотеки C #, которые работали над Mono для Android гораздо быстрее, чем потребовалось бы для их переопределения, хотя я уже знал Java . Благодаря Mono у меня есть некоторый код, который разделяется - не изменяется - между веб-сайтом, настольными программами и мобильными приложениями на двух разных мобильных платформах.

Я не хотел подразумевать, даже косвенно, что Mono был идеальным инструментом для любой мобильной разработки. Это компромисс, но я твердо верю, что бывают ситуации, когда Mono - лучший выбор.

Пожалуйста, посмотрите (и возразите!) Ответ Джейсона С. для другого взгляда.

Kevin
источник
12
И я подумал, что на языке Java был лозунг «пиши, беги, везде беги»!
Лучано
3
@Luciano - те же аргументы могут быть применены, если OP сказал, что он знает Java, как интересно, изучать ли C #. Важным моментом является повторное использование кода, а не язык.
ChrisF
14
Моно был выбран в доме по той же причине. Нам нужно было создать клиент на нескольких платформах и всех новых кодеров c #. В теории это была отличная идея. Однако на практике это превратилось в настоящий кошмар. Мы нашли много мест, где код, работающий на собственной платформе .NET, не будет работать на платформе MacOS, поэтому нам пришлось сделать исключение; тогда тот же самый код не работал в LInux. В целом, моно показалось слишком нестабильным. В конце концов, нам пришлось отказаться от этой идеи и вернуться к написанию собственного кода для целевой ОС.
Чу
4
Тем не менее, единственным кодом, который можно использовать повторно, является бизнес-логика, а не код пользовательского интерфейса или код, взаимодействующий с аппаратным обеспечением телефона. Посмотрите, у меня есть приложение MonoTouch или WindowsPhone 7, могу ли я просто перестроить его с помощью Mono для Android и целевого Android? на FAQ по MonoDroid.
Джейсон С.
2
@JasonS, я обновил свой ответ на ваш комментарий. Для справки, мое единственное участие в Xamarin и Mono - это как довольный пользователь.
Кевин
18

Это своего рода дополнительный ответ, поскольку одна вещь, которая, кажется, до сих пор игнорировалась в ответах, касается того, что на самом деле является кроссплатформенным. Согласно самим Xamarin, это в основном ваша бизнес-логика, а не ваш пользовательский интерфейс или какой-либо аппаратный элемент управления, такой как GPS, аудио, адресная книга и так далее. Они должны быть написаны специально для каждой платформы. См. Их раздел часто задаваемых вопросов У меня есть приложение MonoTouch или WindowsPhone 7, могу ли я просто перестроить его с помощью Mono для Android и целевого Android? ,

Используя Mono, вы можете написать свой пользовательский интерфейс и код управления телефоном, используя C #, но он не будет переносимым на любую платформу. Вам придется написать пользовательский интерфейс и управление телефоном для каждой платформы, даже если вы можете написать это на C #. В любом случае вам все равно придется изучить особенности элементов управления пользовательского интерфейса на Android и то, как Android обрабатывает ресурсы телефона.

Используя Mono, вы должны изучить Mono API, который вызывает Android API. Вам также придется подождать, пока Mono внедрит новые функции Android, и надеюсь, что они реализуют все функции Android. Даже если C # более мощный, чем Java, вы не сможете сделать больше, чем если бы вы использовали Android SDK напрямую (в Java).

Если вы переходите прямо с C # на Android, так как C # очень синтаксически похож на Java, то большая часть обучения C # для разработчиков будет изучать Android API.

Некоторые соображения ...

C # для Android

Нужно учиться

  • Android API
  • Java API: обработка строк, календаря, событий и т. Д.

Не нужно учиться

  • Синтаксис Java: C # очень похож синтаксис.

Другие соображения

  • Вы не сможете повторно использовать код на разных платформах.
  • У вас не будет никаких зависимостей между вами и Android SDK. Вы получите новые функции Android по мере их выхода.
  • Скорее всего, вы получите большую поддержку и примеры кода Android, чем Mono.

C # в моно

Нужно учиться

  • Android: Вам все еще нужно изучить пользовательский интерфейс Android и функции управления оборудованием.
  • Mono API: Вы должны научиться вызывать API Mono, чтобы работать с пользовательским интерфейсом и оборудованием Android.

Не нужно учиться

  • Java API и синтаксис: вы можете разрабатывать в C #

Другие соображения

  • Повторное использование кода. Вы можете повторно использовать код C #, который не содержит никакого пользовательского интерфейса или аппаратного управляющего кода и поэтому является чистой «бизнес-логикой». Хотя это идеально, иметь такое чистое разделение не всегда легко. Вам придется оценить, какая часть вашего кода не будет иметь никакого пользовательского интерфейса или аппаратного контроля.
  • Зависимости: вы зависите от Mono, реализующего Android API. В версиях Android API могут быть некоторые задержки или некоторые функции Android могут никогда не быть реализованы.
  • У вас может быть меньше документации и примеров на выбор.
Джейсон С
источник
Вы забыли упомянуть P / Invoke. Образец.
Амир Карими
-1: что ты имеешь ввиду Learn the Mono API? Сколько вам на самом деле нужно знать, чтобы разработать приложение для Android? А ты на самом деле пробовал MonoDroid или угадаешь?
Джим Дж
@JimG. К Learn the Mono API, я имею в виду , что вам все еще нужно выучить Android API , что Mono повторности, в дополнение к частям он не делает. Сколько вам нужно знать? Зависит от приложения, зависит от человека - это не было суть ОП. Я использовал MonoDroid? У меня есть C #, Java и Objective C, так что нет необходимости. Я рассматривал Mono для мобильности. В то время, когда я отвечал, никто не упомянул ограничения на мобильность. Я не против людей, не согласных со мной, но это само по себе не делает мой ответ бедным.
Джейсон С
13

Я думаю, что многое из этого связано с доступными ресурсами.

Синтаксис в C # и Java может быть похож, но они предлагают очень разные вещи. Например, работа с датами с использованием стандартных библиотек Java - это кошмар, а в C # это довольно приятно.

Corey
источник
2
Интересно - поэтому обращение больше касается получения доступа к библиотекам .NET. Вы случайно не знаете, предлагает ли .NET множество удобных функций, относящихся к Android, которых труднее достичь с помощью API Java Android?
Дан Тао
19
+1 - Исходя из C #, я считаю, что Java ... в лучшем случае уникальна ...
Одед
4
Я считаю, что сходство между C # и Java не является преимуществом при переключении между ними. Я могу без промедления переключаться между C # и Python, Ruby или Lua, но в последний раз, когда я пытался написать код на Java, я в итоге сжал зубы и начал крутить колеса.
Адам Кроссленд
1
@Dan Тао: призыв не более о доступе к стандартному .Net. Это как об этом, так и о повторном использовании. Преимущество повторного использования должно быть очевидным. Что касается доступа к .Net, я смотрю на это так. Я использовал, скажем, XDocument 1000 и 1 раз. Если мне нужно написать мобильное приложение, которое интегрирует данные XML из службы, я пишу это со скоростью мысли. Если бы я изучал Java, я мог бы легко взять 4-8 раз больше (или 10 или 12, кто знает), отскакивая назад и вперед между кодированием и чтением документов. Если использование для бизнеса, безответственно делать проект во время изучения языка.
Квентин-старин
9

Похоже, это отличная возможность для изучения нового языка , который я не думаю, что вы должны упустить.

Переход с C # на Java очень прост, поскольку они основаны на одних и тех же концепциях. Java похожа на подмножество C #, поэтому вам придется отучиться от некоторых вещей (например, свойств и сборок) и привыкнуть к некоторым новым соглашениям, но в основном это должно быть просто.

Мартин Викман
источник
10
И выяснить разницу между тем, как работают дженерики в каждом, и удивляться, почему свойства не существуют, и событиями и ...
Одед
5
Незначительные различия Не то чтобы он изучал Хаскелл.
Мартин Уикман,
1
+1 Нет вреда в знании нескольких разных языков и в работе над реальным проектом - отличный способ освоить один, если он похож на тот, который вы уже знаете.
Гленатрон
Лучше удостовериться, что человек, платящий хорошо, платит за опыт обучения.
Квентин Старин
1
@qes - Изучение чего-то избыточного недостаточно в большинстве случаев для оправдания затрат, но в большинстве случаев разработка сложного приложения в его собственной среде будет проходить более гладко, и это может сделать обучение более долгосрочные сокращения затрат.
Морган Херлокер
3

Краткий урок истории - MonoDroid вырос из MonoTouch. Сделано много смысла в то время. К сожалению, Novell была продана, и вся команда Mono была уволена. Хорошая новость заключается в том, что Мигель де Икаса получил финансирование и начал новое оборудование для восстановления того, что было MonoTouch / MonoDroid. Так что вы находитесь в подвешенном состоянии, пока они действительно не запустятся.

Обновление за июль 2011 года: наряд Мигеля восстановил права на весь стек Mono *. Получи это, пока оно есть.

Уайетт Барнетт
источник
Рад слышать (июль 2011 Обновление). Я попробовал Mono раньше и нашел это немного разочаровывающим. Я попробую еще раз!
Брайан Кноблаух