Bir C # geliştiricisi olarak, Java'yı Android için geliştirmeyi mi yoksa bunun yerine MonoDroid'i mi kullanmayı öğrenirsiniz? [kapalı]


46

Kendimi C # konusunda oldukça iyi düşünürdüm Şu an benim tercihim dili ve temelde tüm mesleki tecrübelerimin yattığı yer.

Yine de MonoDroid projesinin varlığından şaşırmıştım . Anladığım kadarıyla her zaman C # ve Java çok yakın oldu. Mesela bir tanesini tanıyorsan, diğerini çok çabuk öğrenebilirsin. Bu yüzden, ilk Android uygulamamı geliştirmeyi düşündüğüm gibi, Java'yı başlatacak kadar tanıyacağımı ve daha sonra ilerledikçe öğreneceğimi düşündüm.

Java Android SDK'sından daha az özellik bakımından zengin olan ve kendi API'sini (.NET API'siyle de olsa) öğrenmeyi gerektiren MonoDroid'i kullanmaktan daha anlamlı olmaz mıydı? Yeni bir dil öğrenmenin (ve bu konuda oldukça popüler) bir dil öğrenmenin ve deneyimlediğiniz teknolojiye bağlı kalmaktansa, zaten zaten bildiklerinize çok yakın olduğunda, biraz tecrübe edinmenin daha iyi olacağını hissediyorum. ile daha değerli beceriler kazanmadan.

Belki de ortalama potansiyel MonoDroid kullanıcısını fena halde yanlış sunuyorum. Belki Java ve .NET'te deneyimli insanlar için daha fazla ve sadece .NET'i tercih ediyor. Ya da belki (aslında muhtemeldir) henüz düşünmediğim başka faktörler de var. Sadece merak ediyorum, neden sadece Java kullanarak Android için geliştirmek yerine MonoDroid kullanıyorsunuz?


11
Google, "yeni COBOL" ifadesidir ve google'ın hangi dilde geldiğini görün ...
John Reynolds

1
@JohnReynolds İronik, şu anda en hızlı büyümenin mobil ve Android'de "yeni COBOL" kullanarak yapıldığını gösteriyor. Her ne şekilde keserseniz, MonoDroid'i seçseniz bile, Android için geliştiriyorsanız, hala "yeni COBOL" e güveniyorsunuz.
Jason S

1
"yeni COBOL" dili değil, VM'yi ifade eder (JVM veya Dalvik olsun). Bu yüzden MonoDroid "yeni COBOL" e dayanmaz ve Scala ve Clojure ya da başka bir JVM dili yoktur.
John Reynolds,

Hala etrafında çok sayıda eski COBOL var.
Alan B,

@JohnReynolds İronik olan şey, bugün çalışan kodun çoğunun COBOL olmasıdır; ve en ironik olanı C # 'nın bir Java klonu (ve çoğu yanlış şeyin çoğunu klonladığından beri fakir) olmasıdır.
m3th0dman

Yanıtlar:


55

Yetkili herhangi bir C # programcısı, bir Android programı yazmak için Java'yı hızlı bir şekilde toplayabilmelidir, ancak mesele bu değil . Bu bir kod yeniden kullanımı meselesi.

Altı ay sonra düşünün, Android programınız popüler olduğunda ve kullanıcılarınız iPhone ve Windows Phone 7 için bir sürüm istediğinde 7. MonoDroid kullanıyorsanız, uygulama mantığınızın çoğunu MonoTouch (iOS için Mono) ve Windows Phone SDK'sı. Artık web tabanlı bir sürüm istiyorlar, bu yüzden ASP.Net projesine aynı sınıf kütüphaneleri ekliyorsunuz. Masaüstü versiyonları? Hiç sorun değil, aynı sınıf kütüphanesi .Net ile Windows altında ya da Linux ve OS X'de Mono ile çalışıyor.

C veya C ++ dışında, aynı kodu tüm bu hedeflerde tekrar kullanmanıza izin veren başka dilleri düşünemiyorum.

Düzenleme yorumlarda bazı endişelerini gidermek için: Net ve Mono olmaz her yerde tam bir program ve kullanımı aynı programı yazalım. Bazı kodları paylaşmanıza izin vereceklerdir ve tüm platformlar arası programlama gibi paylaşılan kodun miktarı yazdığınız program türüne ve kullanıcı arayüzü ile donanım kodunu uygulama mantığından ne kadar iyi ayırdığınıza bağlıdır.

Bununla birlikte, Android uygulamanızı Java'ya yazarsanız, bunun ne kadarı iOS'ta veya Windows Phone'da kullanılabilir? Bu yapmaya çalıştığım noktaydı. Java'yı bilmeme rağmen , Mono for Android üzerinde çalışan C # kitaplıklarını, onları yeniden uygulamak için harcayacağından çok daha kısa bir sürede hazırladım . Mono sayesinde bir web sitesi, masaüstü programları ve mobil uygulamalar arasında paylaşılan - değiştirilmemiş - bazı kodlar var.

Dolaylı olarak bile olsa, Mono'nun her mobil geliştirme durumu için mükemmel bir araç olduğunu söylemek istemedim. Bu bir tradeoff, ancak Mono'nun çok daha iyi bir seçim olduğu durumlar olduğuna inanıyorum.

Lütfen bakın (ve oylayın!) Jason S'in cevabını başka bir bakış açısı için.


12
Ben de Java'nın "bir kere her yere koşup yaz" sloganına sahip olduğunu düşündüm!
Luciano

3
@Luciano - Aynı argümanlar olabilir OP C # öğrenmek isteyip merak olarak o Java bildiğini söyledi olsaydı uygulanacak. Önemli olan, dil değil kodun yeniden kullanılmasıdır.
ChrisF

14
Bu sebeple evde Mono seçildi. Bir müşteriyi birden fazla platformda ve kodlayıcıların hepsinde yeni c # yapmamız gerekiyordu. Teoride harika bir fikirdi. Ancak pratikte, biraz kabusa dönüştü. Yerel bir .NET platformunda çalışan kodun bir MacOS platformunda çalışmadığı birçok yer bulduk, bu nedenle bir istisna yapmak zorunda kaldık; o zaman aynı kod LInux’ta işe yaramadı. Genel olarak, mono çok dengesiz görünüyordu. Sonunda, fikri bırakıp hedeflenen işletim sistemi için yerel kod yazmaya geri dönmemiz gerekti.
Chu,

4
Yine de, yeniden kullanılabilen tek kod , kullanıcı mantığıdır, kullanıcı arayüzü ile veya telefon donanımıyla etkileşime giren kod değil . MonoTouch veya WindowsPhone 7 uygulamasına sahip olduğumu görün , Android için Mono ile yeniden oluşturabilir ve Android'i hedefleyebilir miyim? MonoDroid SSS’inde.
Jason S

2
@JasonS, yorumunuzu yanıtlamak için cevabımı güncelledim. Kayıt için, Xamarin ve Mono ile olan tek ilişkim memnun bir kullanıcı.
Kevin

18

Bu bir tür ek cevaptır, çünkü şu ana kadar cevaplarda göz ardı edilmiş görünen bir şey aslında platformlar arası olanla ilgili. Xamarin’in kendilerine göre, iş mantığınız, kullanıcı arayüzünüz ya da GPS, ses, adres defteri ve benzeri herhangi bir donanım kontrolü değil . Bunların her platform için özel olarak yazılması gerekecek. SSS girişlerini görün MonoTouch veya WindowsPhone 7 uygulamam var, Android için Mono ile yeniden oluşturabilir ve Android'i hedefleyebilir miyim? .

Mono'yu kullanarak, kullanıcı arabiriminizi ve telefon kontrol kodunuzu C # kullanarak yazabilirsiniz ancak hiçbir platformda taşınabilir olmayacaktır. C # ile yazabilseniz bile, her platform için kullanıcı arayüzü ve telefon kontrolünü yazmanız gerekir. Her iki durumda da, Android'deki UI denetimlerinin özelliklerini ve Android'in telefon kaynaklarını nasıl kullandığını öğrenmeniz gerekir.

Mono'yu kullanarak, Android API'sine çağrı yapan Mono API'sini öğrenmeniz gerekir. Mono'nun yeni Android özelliklerini uygulamalarını beklemeniz ve tüm Android özelliklerini uygulamalarını ummanız gerekir. C #, Java'dan daha güçlü olsa bile, doğrudan Android SDK'yı (Java'da) kullanmaktan daha fazlasını yapamazsınız.

Doğrudan C # 'dan Android'e geçiyorsanız, C #, Java'ya sözdizimsel olarak benzer olduğu için, bir C # geliştiricisinin Android için öğrenmesinin çoğu Android API'sini öğreniyor olacaktır.

Bazı düşünceler ...

C # Android için

Öğrenmek Gerekiyor

  • Android API
  • Java API: Dize, Takvim ve etkinlik işleme vb.

Öğrenmene gerek yok

  • Java sözdizimi: C #, çok benzer bir sözdizimidir.

Diğer hususlar

  • Kodları platformlar arasında yeniden kullanamazsınız.
  • Android SDK ile aranızdaki herhangi bir bağımlılığa sahip olmayacaksınız. Yeni Android özelliklerini piyasaya sürdükleri gibi alacaksınız.
  • Android kodu için Mono'dan daha fazla destek ve örnek sunacaksınız.

Mono için C #

Öğrenmek Gerekiyor

  • Android: Android'in kullanıcı arayüzü ve donanım kontrol özelliklerini öğrenmen gerekiyor.
  • Mono API: Android'in kullanıcı arayüzü ve donanımıyla ilgili şeyler yapmak için Mono'nun API'sini nasıl arayacağınızı öğrenmelisiniz.

Öğrenmene gerek yok

  • Java API ve sözdizimi: C # ile geliştirebilirsiniz

Diğer hususlar

  • Yeniden kod: Herhangi bir UI'den veya donanım kontrol kodundan yoksun olan C # kodunu tekrar kullanabilirsiniz, bu nedenle saf "iş mantığı" dır. İdeal olmasına rağmen, böylesine temiz bir ayrılığa sahip olmak her zaman kolay değildir. Kodunuzun ne kadarının kullanıcı arayüzüne veya donanım kontrolüne sahip olmayacağını değerlendirmeniz gerekecektir.
  • Bağımlılıklar: Android API'sini uygulayan Mono'ya bağımlısınız. Android API sürümlerinden bir miktar gecikme olabilir veya bazı Android özellikleri asla uygulanamayabilir.
  • Aralarından seçim yapabileceğiniz daha az dokümantasyon ve örnekler olabilir.

P / Invoke'den bahsetmeyi unuttun. Bir örnek.
Amir Karimi

-1: Ne demek istiyorsun Learn the Mono API? Bir Android uygulaması geliştirmek için gerçekte ne kadar bilgiye ihtiyacınız var? Ve aslında MonoDroid'i denediniz mi, yoksa tahmin mi ediyorsunuz?
Jim G.,

@JimG. By Learn the Mono API, ben hala Mono çoğaltır, parçaların yanı sıra öyle değil söz konusu Android API öğrenmemiz gerekiyor anlamına gelir. Ne kadarını bilmek istiyorsun? Uygulamaya bağlı olarak, kişiye göre değişir - bu gerçekten OP'nin özü değildi. MonoDroid kullandım mı? Hayır. C #, Java ve Objective C deneyimim var, bu yüzden gerek yok. Taşınabilirliği için Mono'yu düşündüm. Cevap verdiğimde kimse taşınabilirlik sınırlarından bahsetmedi. İnsanların benimle aynı fikirde olmalarına aldırış etmiyorum, ama bu başlı başına cevabımı zayıflatmıyor.
Jason S

13

Bence çoğunun mevcut kaynaklarla yapması gerekiyor.

Sözdizimi C # ve Java benzer olabilir, fakat çok farklı şeyler sunuyoruz. Örneğin, standart Java kütüphanelerini kullanarak tarihlerle çalışmak bir kabustur, C # ise oldukça hoş.


2
İlginç - bu nedenle temyiz, .NET kütüphanelerine erişim hakkında daha fazla. .NET, Java Android API'leri ile elde edilmesi daha zor olan, Android ile ilgili birçok kullanışlı işlev sunup sunmadığını biliyor musunuz?
Dan Tao

19
+1 - C # 'dan geliyorum, java' yı buldum ... en iyi ihtimalle kendine has ...
Oded

4
C # ve Java arasındaki benzerliklerin aralarında geçiş yaparken bir avantaj olmadığını düşünüyorum. Göz kırpma olmadan C # ve Python, Ruby veya Lua arasında geçiş yapabilirim, ancak Java kodlaması yapmaya çalıştığım son kez, dişlerimi taşlamayı ve tekerleklerimi döndürmeyi bıraktım.
Adam Crossland

1
@Dan Tao: itiraz değildir daha standart Net erişim konusunda. Hem bununla hem de yeniden kullanımla ilgili. Yeniden kullanımın yararı açık olmalıdır. Net'e gelince, ona bu şekilde bakıyorum. XDocument 1000 ve 1 kez kullandım. Bir hizmetten XML verilerini entegre eden bir mobil uygulama yazmam gerekirse, onu düşünce hızında yazıyorum. Ben olsam öğrenme Java, kolayca kodlama ve belgeler okuma arasında ileri ve geri sıçrayan (kim bilir, ya da 10 veya 12) sürece 4 ila 8 kat sürebilir. Kullanım iş için ise, bir dil öğrenirken bir proje yapmak sorumluluğu yoktur.
quentin-starin

9

Yeni bir dil öğrenmek için harika bir fırsat gibi gözüküyor .

C # 'dan Java' ya geçmek aynı kavramlara dayandıkları gibi bir esinti. Java bir C # alt kümesi gibidir, bu yüzden bazı şeyleri (özellik ve montajlar gibi) öğrenmek ve bazı yeni sözleşmelere alışmak zorunda kalırsınız, fakat çoğunlukla beyinsiz olmalıdır.


10
Ve jenerik her çalışıyorum, ve merak özellikleri yoktur neden ve olay ve ... nasıl arasındaki farklar dışında figür
Oded

5
Küçük farklar. Haskell'i öğrenmek zorunda olduğu gibi değil.
Martin Wickman

1
+1 Birkaç dil bilmenin ve üzerinde çalışılacak gerçek bir dünya projesinin olmasının zararı yok, zaten bildiklerinize benzer bir dil ise, hangisini asmak için harika bir yol.
glenatron

Ödeme yapan kişinin bir öğrenme deneyimi için para ödemesinin iyi olduğundan emin olun.
quentin-starin

1
@qes - Gereksiz olan bir şeyi öğrenmek, çoğu durumda maliyeti haklı çıkarmak için bir nedene yetmez, ancak karmaşık bir uygulamanın kendi yerel ortamında geliştirilmesi, çoğu zaman daha sorunsuz ilerler ve öğrenmeyi daha fazla yapabilmesini sağlar uzun vadeli maliyet indirimleri.
Morgan Herlocker

3

Hızlı tarih dersi - MonoDroid, MonoTouch'tan büyüdü. O zamanlar pek çok anlam ifade ediyordu. Ne yazık ki, Novell satıldı ve tüm Mono takımı işten çıkarıldı. İyi haber şu ki, Miguel de Icaza fonu güvence altına aldı ve MonoTouch / MonoDroid'i yeniden inşa etmek için yeni bir kıyafet başlattı. Yani gerçekten fırlatılana kadar bir çeşit kayıpsın.

Temmuz 2011 Güncellemesi: Miguel'in kıyafeti tüm Mono * yığınının haklarını geri aldı. Şahin iken alın.


Duymak güzel (Temmuz 2011 Güncellemesi). Mono'yu daha önce denedim ve biraz hayal kırıklığı yarattı. Başka bir deneyeyim!
Brian Knoblauch
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.