Czy jako programista C # nauczyłbyś się programowania Java dla Androida, czy zamiast tego używałbyś MonoDroid? [Zamknięte]

46

Uważam się za całkiem dobrze zorientowanego w C #. Obecnie jest to mój wybrany język i tam w zasadzie leży całe moje doświadczenie zawodowe.

Nadal zastanawia mnie istnienie projektu MonoDroid . Rozumiałem zawsze, że C # i Java są bardzo blisko. Na przykład, jeśli znasz jedną, możesz naprawdę szybko nauczyć się drugiej. Tak więc, gdy rozważałem opracowanie mojej pierwszej aplikacji na Androida, po prostu założyłem, że zapoznam się z Javą na tyle, aby zacząć, a potem po prostu uczyć się w miarę, jak idę.

Czy nie miałoby to większego sensu niż używanie MonoDroid, który prawdopodobnie będzie mniej bogaty w funkcje niż Java Android SDK i wymaga nauki własnego API (choć .NET API)? Po prostu wydaje mi się, że lepiej byłoby nauczyć się nowego języka (w tym niezwykle popularnego) i uzyskać w nim trochę doświadczenia - kiedy i tak jest tak blisko tego, co już znasz - zamiast trzymać się technologii, której doświadczasz bez zdobywania cenniejszych umiejętności.

Może rażąco wprowadzam w błąd przeciętnego potencjalnego użytkownika MonoDroid. Może jest to bardziej dla ludzi, którzy mają doświadczenie w Javie i .NET i po prostu wolą .NET. A może (w rzeczywistości jest prawdopodobne) istnieją inne czynniki, których po prostu nie wziąłem pod uwagę. Zastanawiam się tylko, dlaczego miałbyś używać MonoDroid zamiast programowania dla Androida za pomocą Java?

Dan Tao
źródło
11
Google frazę „to nowa COBOL” i zobaczyć, co język google wymyśli ...
John Reynolds
1
@JohnReynolds Ironic to, że najszybszy wzrost w tej chwili dotyczy urządzeń mobilnych i Androida, używając „nowego języka COBOL”. Niezależnie od tego, jak go pokroisz, nawet jeśli wybierzesz MonoDroid, jeśli tworzysz dla Androida, nadal polegasz na „nowym języku COBOL”.
Jason S
1
„nowy COBOL” odnosi się do języka, a nie do maszyny wirtualnej (czy to JVM czy Dalvik). Tak więc MonoDroid nie polega na „nowym języku COBOL”, podobnie jak Scala i Clojure ani żaden inny język JVM.
John Reynolds
Wciąż jest też ogromna ilość starego COBOLA.
Alan B
@JohnReynolds Ironiczną rzeczą jest to, że większość kodu, który działa dzisiaj, to COBOL; a najbardziej ironiczne jest to, że C # jest klonem Java (i biednym, ponieważ sklonował także większość złych rzeczy).
m3th0dman

Odpowiedzi:

55

Każdy kompetentny programista C # powinien być w stanie szybko zebrać wystarczającą ilość Java, aby napisać program dla Androida, ale nie o to chodzi . To kwestia ponownego użycia kodu.

Pomyśl o sześciu miesiącach od teraz, kiedy Twój program na Androida jest popularny, a użytkownicy proszą o wersję na iPhone'a i Windows Phone 7. Jeśli korzystałeś z MonoDroid, możesz ponownie wykorzystać większość logiki aplikacji za pomocą MonoTouch (Mono na iOS) i zestaw Windows Phone SDK. Teraz chcą wersji internetowej, dlatego dołączasz biblioteki tej samej klasy do projektu ASP.Net. Wersje na komputery stacjonarne? Nie ma problemu, ta sama biblioteka klas współpracuje z .Net w systemie Windows lub Mono w systemie Linux i OS X.

Inne niż C lub C ++, nie mogę wymyślić żadnego innego języka, który pozwoliłby ci użyć tego samego kodu na wszystkich tych obiektach docelowych.

Edytuj, aby rozwiązać niektóre wątpliwości w komentarzach: .Net i Mono nie pozwolą napisać kompletnego programu i używać tego samego programu wszędzie. Umożliwiają współdzielenie części kodu i podobnie jak w przypadku wszystkich programów wieloplatformowych ilość udostępnianego kodu zależy od rodzaju pisanych programów oraz od tego, jak dobrze oddzielasz interfejs użytkownika i kod sprzętowy od logiki aplikacji.

Jeśli jednak piszesz aplikację na Androida w Javie, ile z tego można ponownie wykorzystać na iOS lub Windows Phone? Właśnie o to starałem się powiedzieć. Miałem biblioteki C #, które pracowały na Mono dla Androida w znacznie krótszym czasie, niż wymagałoby to ich ponownej implementacji, mimo że znałem już Javę . Mam część kodu, który jest udostępniany - niezmodyfikowany - między witryną internetową, programami komputerowymi i aplikacjami mobilnymi na dwóch różnych platformach mobilnych, dzięki Mono.

Nie chciałem sugerować, nawet pośrednio, że Mono było idealnym narzędziem do każdej sytuacji związanej z programowaniem mobilnym. To kompromis, ale głęboko wierzę, że są sytuacje, w których Mono jest znacznie lepszym wyborem.

Proszę zobaczyć (i pochwalić!) Odpowiedź Jasona S dla innej perspektywy.

Kevin
źródło
12
I pomyślałem, że to Java miała hasło „pisz raz, uruchamiaj wszędzie”!
Luciano
3
@Luciano - te same argumenty mogłyby zostać zastosowane, gdyby PO powiedział, że zna Javę i zastanawia się, czy nauczyć się języka C #. Ważną kwestią jest ponowne użycie kodu, a nie język.
ChrisF
14
Z tego samego powodu wybrano Mono w domu. Musieliśmy zbudować klienta na wielu platformach i wszystkie nowe kodery c #. Teoretycznie był to świetny pomysł. W praktyce jednak zamieniło się to w koszmar. Znaleźliśmy wiele miejsc, w których kod działający na natywnej platformie .NET nie działałby na platformie MacOS, więc musieliśmy zrobić wyjątek; wtedy ten sam kod nie działał w LInux. Ogólnie mono wydawało się zbyt niestabilne. W końcu musieliśmy porzucić ten pomysł i wrócić do pisania natywnego kodu dla docelowego systemu operacyjnego.
Chu,
4
Jednak jedynym kodem, który można ponownie wykorzystać, jest logika biznesowa, a nie kod interfejsu użytkownika lub kod, który wchodzi w interakcje ze sprzętem telefonu. Widzisz, że mam aplikację MonoTouch lub WindowsPhone 7, czy mogę ją przebudować za pomocą Mono na Androida i uruchomić na Androida? w FAQ MonoDroid.
Jason S
2
@JasonS, zaktualizowałem swoją odpowiedź, aby rozwiązać Twój komentarz. Dla przypomnienia, moje jedyne zaangażowanie w Xamarin i Mono to zadowolony użytkownik.
Kevin
18

Jest to rodzaj dodatkowej odpowiedzi, ponieważ jedna z rzeczy, która do tej pory była pomijana w odpowiedziach, dotyczy tego, co faktycznie jest wieloplatformowe. Według samych Xamarin jest to w zasadzie logika biznesowa, a nie interfejs użytkownika ani sterowanie sprzętem, takie jak GPS, audio, książka adresowa i tak dalej. Będą one musiały być napisane specjalnie dla każdej platformy. Zobacz ich wpis w FAQ Mam aplikację MonoTouch lub WindowsPhone 7, czy mogę ją przebudować za pomocą Mono na Androida i na Androida? .

Korzystając z Mono, możesz napisać swój interfejs użytkownika i kod sterujący telefonu za pomocą C #, ale nie będzie on przenośny na żadną platformę. Będziesz musiał napisać interfejs użytkownika i kontrolę telefonu dla każdej platformy, nawet jeśli możesz napisać w C #. Tak czy inaczej, nadal będziesz musiał poznać specyfikę kontrolek interfejsu użytkownika na Androidzie i jak Android obsługuje zasoby telefonu.

Korzystając z Mono, musisz nauczyć się interfejsu Mono API, który wywołuje interfejs API Androida. Musisz także poczekać, aż Mono wdroży nowe funkcje Androida i mieć nadzieję, że wdrożą wszystkie funkcje Androida. Nawet jeśli C # ma większą moc niż Java, nie będziesz w stanie zrobić więcej, niż jeśli korzystasz bezpośrednio z zestawu SDK systemu Android (w Javie).

Jeśli przechodzisz prosto z C # na Androida, ponieważ C # jest tak składniowo podobny do Javy, wówczas większość nauki dla programistów C # dla Androida będzie uczyć się interfejsu API Androida.

Kilka uwag ...

C # na Androida

Trzeba się nauczyć

  • Android API
  • Java API: obsługa ciągów, kalendarza i zdarzeń itp.

Nie musisz się uczyć

  • Składnia Java: C # jest bardzo podobną składnią.

Inne uwagi

  • Nie będzie można ponownie użyć kodu na różnych platformach.
  • Nie będziesz mieć żadnych zależności między tobą a zestawem SDK systemu Android. Otrzymasz nowe funkcje Androida po ich wydaniu.
  • Prawdopodobnie będziesz mieć większe wsparcie i przykłady kodu Androida niż Mono.

C # do Mono

Trzeba się nauczyć

  • Android: nadal musisz nauczyć się interfejsu użytkownika Androida i funkcji kontroli sprzętu.
  • Mono API: Musisz nauczyć się dzwonić do Mono API, aby robić rzeczy z interfejsem użytkownika i sprzętem Androida.

Nie musisz się uczyć

  • Java API i składnia: Możesz rozwijać w C #

Inne uwagi

  • Użyj ponownie kodu: Możesz ponownie użyć kodu C #, który jest pozbawiony jakiegokolwiek interfejsu użytkownika lub kodu kontroli sprzętu, a więc jest czystą „logiką biznesową”. Chociaż idealna, taka czysta separacja nie zawsze jest łatwa. Będziesz musiał ocenić, ile twojego kodu nie będzie miało interfejsu użytkownika ani kontroli sprzętowej.
  • Zależności: Jesteś zależny od Mono implementującego Android API. Wersje API Androida mogą być opóźnione lub niektóre funkcje Androida mogą nigdy nie zostać zaimplementowane.
  • Możesz mieć mniej dokumentacji i przykładów do wyboru.
Jason S.
źródło
Zapomniałeś wspomnieć o P / Invoke. Próbka.
Amir Karimi
-1: Co masz na myśli Learn the Mono API? Ile naprawdę musisz wiedzieć, aby opracować aplikację na Androida? Czy próbowałeś MonoDroida, czy zgadujesz?
Jim G.
@JimG. Przez Learn the Mono API, to znaczy, że trzeba jeszcze nauczyć Android API, które powtórzenia Mono, oprócz części nie. Ile musisz wiedzieć? Zależy od aplikacji, zależy od osoby - to nie była istota OP. Czy korzystałem z MonoDroid? Nie. Mam doświadczenie w C #, Java i Objective C, więc nie ma takiej potrzeby. Rozważałem Mono pod kątem przenośności. W tym czasie odpowiedziałem, że nikt nie wspominał o limitach przenośności. Nie mam nic przeciwko ludziom, którzy się ze mną nie zgadzają, ale to samo w sobie nie czyni mojej odpowiedzi kiepską.
Jason S
13

Myślę, że wiele z tego ma związek z dostępnymi zasobami.

Składni w C # i Java mogą być podobne, ale oferują bardzo różne rzeczy. Na przykład praca z datami przy użyciu standardowych bibliotek Java jest koszmarem, podczas gdy w języku C # jest całkiem przyjemna.

Corey
źródło
2
Ciekawe - dlatego odwołanie dotyczy bardziej dostępu do bibliotek .NET. Czy wiesz, czy platforma .NET oferuje wiele wygodnych funkcji związanych z systemem Android, które są trudniejsze do osiągnięcia dzięki interfejsom API Java Android?
Dan Tao
19
+1 - Pochodzę z C #, java jest ... w najlepszym razie idiosynkratyczny ...
Oded
4
Uważam, że podobieństwa między C # i Javą nie są zaletą przy przełączaniu między nimi. Mogę przełączać się między C # a Python, Ruby lub Lua bez mrugnięcia okiem, ale ostatnim razem, gdy próbowałem napisać kodowanie Java, skończyło się na tym, że zgrzytałem zębami i kręciłem kółkami.
Adam Crossland
1
@Dan Tao: odwołanie nie dotyczy bardziej dostępu do standardowego .Net. Chodzi zarówno o to, jak i o ponowne użycie. Korzyści z ponownego użycia powinny być oczywiste. Jeśli chodzi o dostęp do .Net, patrzę na to w ten sposób. Użyłem, powiedzmy, XDocument 1000 i 1 razy. Jeśli muszę napisać aplikację mobilną, która integruje dane XML z usługi, piszę to z prędkością myślenia. Jeśli uczę się języka Java, mogę z łatwością zająć od 4 do 8 razy więcej (lub 10 lub 12, kto wie), podskakując między kodowaniem a czytaniem dokumentów. Jeśli jest to użyteczne dla biznesu, nieodpowiedzialne jest wykonanie projektu podczas nauki języka.
quentin-starin
9

Wygląda to na świetną okazję do nauki nowego języka , którego nie sądzę, że powinieneś przegapić.

Przejście z C # na Javę jest dziecinnie proste, ponieważ bazują na tych samych koncepcjach. Java jest jak podzbiór języka C #, więc będziesz musiał oduczyć się niektórych rzeczy (takich jak właściwości i zestawy) i przyzwyczaić się do nowych konwencji, ale w większości przypadków nie powinno to oznaczać żadnych problemów.

Martin Wickman
źródło
10
I znajdź różnice między tym, jak działają leki generyczne, i zastanawiaj się, dlaczego właściwości nie istnieją, a wydarzenia i ...
Oded
5
Drobne różnice. To nie tak, że musi się uczyć Haskella.
Martin Wickman
1
+1 Bez szkody dla znajomości kilku różnych języków i posiadania projektu z prawdziwego świata jest świetnym sposobem na zrozumienie jednego, jeśli jest to podobny język do tych, które już znasz.
glenatron
Lepiej upewnij się, że osoba płacąca jest w porządku płacąc za naukę.
quentin-starin
1
@qes - Uczenie się czegoś, co jest zbędne, nie jest wystarczającym powodem uzasadnienia kosztów w większości przypadków, ale rozwój złożonej aplikacji w jej natywnym środowisku będzie przebiegał płynniej przez większość czasu, a to może sprawić, że uczenie się będzie miało więcej długoterminowe redukcje kosztów.
Morgan Herlocker
3

Szybka lekcja historii - MonoDroid wyrósł z MonoTouch. Miał wtedy sens. Niestety Novell został sprzedany i cały zespół Mono został zwolniony. Dobrą wiadomością jest to, że Miguel de Icaza uzyskał fundusze i rozpoczął nowy strój, aby odbudować to, co było MonoTouch / MonoDroid. Więc jesteś trochę w zawieszeniu, dopóki naprawdę się nie uruchomią.

Aktualizacja z lipca 2011 r .: strój Miguela odzyskał prawa do całego stosu Mono *. Zdobądź go, dopóki nie będzie.

Wyatt Barnett
źródło
Dobrze słyszeć (aktualizacja z lipca 2011 r.). Próbowałem już wcześniej Mono i było to trochę rozczarowujące. Spróbuję jeszcze raz!
Brian Knoblauch,