ในฐานะนักพัฒนา 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
Google วลี "เป็น COBOL ใหม่" และดูว่า Google ใช้ภาษาอะไรมา ...
จอห์นเรย์โนลด์ส

1
@JohnReynolds แดกดันแล้วตอนนี้การเติบโตที่เร็วที่สุดอยู่ในมือถือและ Android โดยใช้ "COBOL ใหม่" ไม่ว่าคุณจะหั่นมันอย่างไรแม้ว่าคุณจะเลือก MonoDroid หากคุณกำลังพัฒนาสำหรับ Android คุณยังคงต้องพึ่งพา "COBOL ใหม่"
Jason S

1
"COBOL ใหม่" หมายถึงภาษาไม่ใช่ VM (ไม่ว่าจะเป็น JVM หรือ Dalvik) ดังนั้น MonoDroid จึงไม่พึ่งพา "ภาษาโคบอลใหม่" และไม่มีทั้ง Scala และ Clojure หรือภาษา JVM อื่น ๆ
John Reynolds

มีภาษาโคบอลเก่าแก่จำนวนมากที่ยังอยู่รอบ ๆ ด้วย
Alan B

@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 จะไม่อนุญาตให้คุณเขียนโปรแกรมที่สมบูรณ์และใช้โปรแกรมเดียวกันทุกที่ พวกเขาจะให้คุณแบ่งปันรหัสบางส่วนและเช่นเดียวกับการเขียนโปรแกรมข้ามแพลตฟอร์มทั้งหมดจำนวนรหัสที่ใช้ร่วมกันนั้นขึ้นอยู่กับประเภทของโปรแกรมที่คุณเขียนและวิธีการแยก UI และรหัสฮาร์ดแวร์ออกจากตรรกะแอปพลิเคชัน

อย่างไรก็ตามหากคุณเขียนแอพ Android ของคุณใน Java จำนวนนั้นสามารถนำมาใช้ซ้ำได้บน iOS หรือ Windows Phone นั่นคือจุดที่ฉันพยายามทำ ฉันมีห้องสมุด C # ที่มีอยู่ที่ทำงานบน Mono สำหรับ Android ในเวลาที่น้อยกว่าที่คิดไว้เพื่อนำไปใช้ใหม่แม้ว่าฉันจะรู้จัก Javaแล้วก็ตาม ฉันมีรหัสที่ใช้ร่วมกัน - ไม่ได้แก้ไข - ระหว่างเว็บไซต์โปรแกรมเดสก์ท็อปและแอพมือถือบนแพลตฟอร์มมือถือสองแพลตฟอร์มขอบคุณโมโน

ฉันไม่ได้ตั้งใจจะบอกเป็นนัยแม้กระทั่งทางอ้อมว่าโมโนเป็นเครื่องมือที่สมบูรณ์แบบสำหรับทุกสถานการณ์การพัฒนาอุปกรณ์พกพา มันเป็นการแลกเปลี่ยน แต่ฉันเชื่อมั่นว่ามีสถานการณ์เมื่อโมโนเป็นตัวเลือกที่ดีกว่ามาก

โปรดดู (และโหวตขึ้น!) คำตอบของ Jason S สำหรับมุมมองอื่น


12
และฉันคิดว่า Java เป็นหนึ่งเดียวกับสโลแกน "เขียนครั้งเดียวทุกที่"!
Luciano

3
@Luciano - สามารถใช้อาร์กิวเมนต์เดียวกันได้ถ้า OP กล่าวว่าเขารู้ Java ว่าสงสัยว่าเรียนรู้ C # หรือไม่ บิตที่สำคัญคือการใช้รหัสซ้ำไม่ใช่ภาษา
ChrisF

14
โมโนถูกเลือกเข้ามาในบ้านด้วยเหตุผลเดียวกันนี้ เราจำเป็นต้องสร้างไคลเอนต์ในหลายแพลตฟอร์มและรหัสใหม่ทั้งหมด c # ในทางทฤษฎีมันเป็นความคิดที่ดี อย่างไรก็ตามในทางปฏิบัติมันกลับกลายเป็นฝันร้ายสักหน่อย เราพบหลายสถานที่ที่โค้ดที่ทำงานในแพลตฟอร์ม. NET ไม่ทำงานในแพลตฟอร์ม MacOS ดังนั้นเราจึงต้องทำการยกเว้น ดังนั้นรหัสเดียวกันนี้ใช้ไม่ได้ใน LInux โดยรวมแล้วดูเหมือนว่าโมโนไม่เสถียรเกินไป ในที่สุดเราก็ต้องละทิ้งความคิดและกลับไปเขียนโค้ดเนทีฟสำหรับระบบปฏิบัติการเป้าหมาย
Chu

4
อย่างไรก็ตามรหัสเดียวที่สามารถใช้งานได้อีกครั้งคือตรรกะทางธุรกิจไม่ใช่รหัส UI หรือรหัสที่โต้ตอบกับฮาร์ดแวร์โทรศัพท์ เห็นฉันมีแอพพลิเคชั่น MonoTouch หรือ WindowsPhone 7 ฉันจะสร้างใหม่ด้วย Mono สำหรับ Android และกำหนดเป้าหมาย Android ได้หรือไม่ บน MonoDroid FAQ
Jason S

2
@JasonS ฉันได้อัปเดตคำตอบเพื่อตอบความคิดเห็นของคุณแล้ว สำหรับการบันทึกการมีส่วนร่วมของฉันกับ Xamarin และ Mono ก็เป็นที่พอใจของผู้ใช้
Kevin

18

นี่เป็นคำตอบเพิ่มเติมเนื่องจากมีสิ่งหนึ่งที่ดูเหมือนจะถูกมองข้ามในคำตอบจนถึงสิ่งที่เกี่ยวข้องกับสิ่งที่เป็นจริงข้ามแพลตฟอร์ม Xamarin อ้างอิงจากตัวเองว่าเป็นตรรกะทางธุรกิจของคุณไม่ใช่ UI หรือการควบคุมฮาร์ดแวร์ใด ๆ เช่น GPS, เสียง, สมุดรายชื่อและอื่น ๆ จะต้องมีการเขียนเฉพาะสำหรับแต่ละแพลตฟอร์ม ดูรายการคำถามที่พบบ่อยของพวกเขาฉันมีแอพพลิเคชั่น MonoTouch หรือ WindowsPhone 7 ฉันสามารถสร้างใหม่ด้วย Mono สำหรับ Android และกำหนดเป้าหมาย Android ได้หรือไม่ .

ด้วย Mono คุณสามารถเขียน UI และรหัสควบคุมโทรศัพท์โดยใช้ C # แต่จะไม่สามารถพกพาไปยังแพลตฟอร์มใด ๆ ได้ คุณจะต้องเขียน UI และการควบคุมโทรศัพท์สำหรับแต่ละแพลตฟอร์มแม้ว่าคุณจะสามารถเขียนได้ใน C # ไม่ว่าจะด้วยวิธีใดคุณจะต้องเรียนรู้ข้อมูลเฉพาะของส่วนควบคุม UI บน Android และวิธีที่ Android จัดการทรัพยากรโทรศัพท์

การใช้ Mono คุณจะต้องเรียนรู้ Mono API ที่เรียกเข้าสู่ Android API คุณจะต้องรอ Mono เพื่อใช้คุณสมบัติ Android ใหม่และหวังว่าพวกเขาจะใช้คุณสมบัติ Android ทั้งหมด แม้ว่า C # จะมีประสิทธิภาพมากกว่า Java คุณจะไม่สามารถทำได้มากกว่าถ้าคุณใช้ Android SDK โดยตรง (ใน Java)

หากคุณกำลังตรงจาก C # ถึง Android เนื่องจาก C # คล้ายกับ Java ดังนั้นการเรียนรู้ C # ของนักพัฒนาซอฟต์แวร์ส่วนใหญ่สำหรับ Android จะเป็นการเรียนรู้ Android API

ข้อควรพิจารณาบางประการ ...

C # ถึง Android

จำเป็นต้องเรียนรู้

  • Android API
  • Java API: การจัดการสตริงปฏิทินและกิจกรรมอื่น ๆ

ไม่จำเป็นต้องเรียนรู้

  • ไวยากรณ์ Java: C # เป็นไวยากรณ์ที่คล้ายกันมาก

ข้อควรพิจารณาอื่น ๆ

  • คุณจะไม่สามารถใช้รหัสซ้ำในแพลตฟอร์มต่างๆได้
  • คุณจะไม่ต้องพึ่งพาใด ๆ ระหว่างคุณกับ Android SDK คุณจะได้รับคุณสมบัติ Android ใหม่เมื่อมีการเปิดตัว
  • คุณอาจมีการสนับสนุนและตัวอย่างสำหรับรหัส Android มากกว่า Mono

C # ถึง Mono

จำเป็นต้องเรียนรู้

  • Android: คุณยังต้องเรียนรู้ UI และคุณสมบัติการควบคุมฮาร์ดแวร์ของ Android
  • Mono API: คุณต้องเรียนรู้วิธีเรียก API ของ Mono เพื่อทำสิ่งต่างๆด้วย UI และฮาร์ดแวร์ของ Android

ไม่จำเป็นต้องเรียนรู้

  • Java API และไวยากรณ์: คุณสามารถพัฒนาใน C #

ข้อควรพิจารณาอื่น ๆ

  • รหัสนำมาใช้ใหม่: คุณสามารถใช้รหัส C # ซ้ำที่ไม่มี UI หรือรหัสควบคุมฮาร์ดแวร์ใด ๆ และเป็น "ตรรกะทางธุรกิจ" อย่างแท้จริง ถึงแม้ว่าในอุดมคติการมีการแยกที่สะอาดนั้นไม่ใช่เรื่องง่ายเสมอไป คุณจะต้องประเมินว่าโค้ดของคุณจะไม่มี UI หรือการควบคุมฮาร์ดแวร์ใด ๆ
  • การพึ่งพา: คุณต้องพึ่งพาโมโนที่ใช้ Android API อาจมีความล่าช้าจากการเปิดตัว Android API หรือฟีเจอร์ Android บางอย่างอาจไม่เคยใช้
  • คุณอาจมีเอกสารและตัวอย่างให้เลือกน้อยลง

คุณลืมพูดถึง P / Invoke ตัวอย่าง.
Amir Karimi

-1: คุณหมายถึงLearn the Mono APIอะไร คุณต้องรู้จักการพัฒนาแอพ Android เท่าไหร่ และคุณลอง MonoDroid จริง ๆ หรือคุณเดา?
Jim G.

@JimG โดยLearn the Mono APIฉันหมายความว่าคุณยังต้องเรียนรู้ Android API ที่โมโนทำซ้ำนอกเหนือจากส่วนที่ไม่ได้ทำ คุณต้องรู้เท่าไหร่ ขึ้นอยู่กับแอพขึ้นอยู่กับบุคคล - นั่นไม่ใช่ส่วนสำคัญของ OP ฉันเคยใช้ MonoDroid หรือไม่ ไม่ฉันมีประสบการณ์ C #, Java และ Objective C ดังนั้นไม่จำเป็น ฉันพิจารณา Mono สำหรับการพกพา ในขณะที่ฉันตอบไม่มีใครได้กล่าวถึงข้อ จำกัด ในการพกพา ฉันไม่รังเกียจคนที่ไม่เห็นด้วยกับฉัน แต่ในตัวมันเองไม่ได้ทำให้คำตอบแย่ลง
Jason S

13

ฉันคิดว่ามันเกี่ยวข้องกับทรัพยากรที่มีอยู่มากมาย

ไวยากรณ์ใน C # และ Java อาจจะคล้ายกัน แต่พวกเขามีสิ่งที่แตกต่างกันมาก ตัวอย่างเช่นการทำงานกับวันที่โดยใช้ห้องสมุด Java มาตรฐานเป็นฝันร้ายในขณะที่ใน C # มันค่อนข้างน่าพอใจ


2
สิ่งที่น่าสนใจ - ดังนั้นการอุทธรณ์จึงเป็นเรื่องเกี่ยวกับการเข้าถึงไลบรารี. NET คุณรู้หรือไม่ว่า. NET มีฟังก์ชั่นการใช้งานที่สะดวกมากมายที่เกี่ยวข้องกับ Android หรือไม่นั้นเป็นเรื่องยากที่จะประสบความสำเร็จกับ Java Android API หรือไม่
Dan Tao

19
+1 - มาจาก C # ฉันพบว่าจาวาเป็น ... นิสัยที่ดีที่สุด ...
Oded

4
ฉันพบว่าความคล้ายคลึงกันระหว่าง C # และ Java ไม่ได้เปรียบเมื่อสลับระหว่างพวกเขา ฉันสามารถสลับระหว่าง C # และ Python, Ruby หรือ Lua ได้โดยไม่ต้องกะพริบ แต่ครั้งสุดท้ายที่ฉันพยายามทำการเข้ารหัส Java ฉันสิ้นสุดการบดฟันและหมุนวงล้อของฉัน
Adam Crossland

1
@ ด่านเต่า: การอุทธรณ์ไม่ได้เพิ่มเติมเกี่ยวกับการเข้าถึงมาตรฐาน. Net มันเกี่ยวกับทั้งที่และใช้ซ้ำ ประโยชน์ของการใช้ซ้ำควรชัดเจน สำหรับการเข้าถึง. Net ฉันดูด้วยวิธีนี้ ฉันเคยพูด XDocument 1,000 และ 1 ครั้ง ถ้าฉันต้องการเขียนแอพมือถือที่รวมข้อมูล XML จากบริการฉันเขียนมันด้วยความเร็วที่คิด ถ้าฉันเรียนรู้ Java ฉันสามารถใช้เวลา 4 ถึง 8 เท่าได้อย่างง่ายดาย (หรือ 10 หรือ 12 ที่รู้) ที่กระดอนไปมาระหว่างการเข้ารหัสและการอ่านเอกสาร หากการใช้เพื่อธุรกิจนั้นไม่รับผิดชอบในการทำโครงงานขณะเรียนรู้ภาษา
quentin-starin

9

ดูเหมือนว่าโอกาสที่ดีสำหรับการเรียนรู้ภาษาใหม่ซึ่งฉันไม่คิดว่าคุณควรจะผ่าน

การเปลี่ยนจาก C # ไปเป็น Java นั้นง่ายกว่าเดิมเนื่องจากใช้แนวคิดเดียวกัน Java เป็นเหมือนชุดย่อยของ C # ดังนั้นคุณจะต้องคลายความรู้บางอย่าง (เช่นคุณสมบัติและแอสเซมบลี) และทำความคุ้นเคยกับการประชุมใหม่ ๆ


10
และหาความแตกต่างระหว่างวิธีการทำงานของยาชื่อสามัญในแต่ละและสงสัยว่าทำไมคุณสมบัติไม่อยู่และกิจกรรมและ ...
Oded

5
ความแตกต่างเล็กน้อย ไม่ใช่ว่าเขาต้องเรียนรู้ Haskell
Martin Wickman

1
+1 ไม่เป็นอันตรายในการรู้ภาษาที่แตกต่างกันเล็กน้อยและการมีโครงการในโลกแห่งความเป็นจริงในการทำงานเป็นวิธีที่ยอดเยี่ยมในการเรียนรู้หากมันเป็นภาษาที่คล้ายกับที่คุณรู้จัก
ลนนาตรอน

ดีกว่าให้แน่ใจว่าบุคคลที่จ่ายเงินนั้นจ่ายค่าประสบการณ์การเรียนรู้
quentin-starin

1
@qes - การเรียนรู้บางสิ่งที่ซ้ำซ้อนนั้นไม่เพียงพอสำหรับเหตุผลในการประเมินค่าใช้จ่ายในกรณีส่วนใหญ่ แต่การพัฒนาแอพที่ซับซ้อนในสภาพแวดล้อมดั้งเดิมของมันกำลังจะไปอย่างราบรื่นมากขึ้นตลอดเวลาและนั่นอาจทำให้การเรียนรู้มีมากขึ้น การลดต้นทุนระยะยาว
Morgan Herlocker

3

บทเรียนประวัติศาสตร์ด่วน - MonoDroid โตขึ้นมาจาก MonoTouch ทำให้รู้สึกมากในเวลา น่าเสียดายที่โนเวลล์ขายและทีมโมโนถูกปลดออก ข่าวดีก็คือ Miguel de Icaza ระดมทุนอย่างปลอดภัยและได้เริ่มชุดใหม่เพื่อสร้างสิ่งที่ MonoTouch / MonoDroid ดังนั้นคุณจะอยู่ในภวังค์จนกว่าพวกเขาจะเปิดตัวจริง ๆ

ปรับปรุงกรกฎาคม 2011: ชุดของ Miguel ได้รับสิทธิ์ในการใช้งานสแต็ก Mono * ทั้งหมดอีกครั้ง รับขณะที่มันหยุด


ดีใจที่ได้ยิน (อัพเดทเดือนกรกฎาคม 2554) ฉันลองใช้โมโนมาก่อนและพบว่ามันน่าผิดหวังเล็กน้อย ฉันจะลองอีกครั้ง!
Brian Knoblauch
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.