kryssplatform mobilutvikling
DESCRIPTION
Slides fra et kurs jeg holdt for Abakus om Kryss-platform mobilutviklingTRANSCRIPT
Kryssplatform mobilutvikling
Med .Net og Mono
Agenda
• Intro, hvorfor kryssplatform
• Intro til .Net og Mono (veldig kort!)
• CrossBox v1
• Pause – vi deler ut en billett til TDC
• Patterns og arbeidsmåter som hjelper oss
• CrossBox v2
• Oppsummering (og litt mer kode hvis tid)
Kort om Capgemini
• Internasjonalt konsulenthus
– 112.000 ansatte (!)
– Ca 750 i Norge
– Ca 60 i Trondheim
• Leverer Consulting, Teknologi og Outsourcing
• Fokus på et sterkt fagmiljø
– Gode fagfolk
– Gode muligheter for faglig utvikling
Rune da?
• Spesialist på .Net
• Veldig interessert i mobile løsninger
• Har fått en relativt «fri» stilling i Capgemini
– Bruker mye tid på ny teknologi
– Forskning, prøve ut nye metoder
– Målet er å bygge kompetanse på kommende teknologi
Kryssplatform?
Kryssplatform?
• Gjenbruke mest mulig kode på tvers av platformene
– Dekker ikke alle platformer, fokuserer på de store
• iOS, Android og Windows Phone
– Ikke Symbian, Blackberry eller Bada
• For små eller døende...
Kryssplatform?
• Hvilke valg har vi?
– Native kode fungerer ikke
• Objective C, Java, .Net
– HTML5 og Javascript
• Fungerer, men hvor godt?
• Facebook! HTML5 stinker...
– Mono og .Net
• Gir native apper
• Kodes i C# mot .Net framework
Kryssplatform?
• Hvorfor .Net og Mono i stedet for «vanlig» native?
– Nok å kunne ett språk, C#
• I stedet for ObjectiveC, Java og C#
– Lett å gjenbruke kode
– Billigere
– Lettere å teste
Noen ulemper
• Må sikte på felles egenskaper
– Egenskaper som bare finnes på en platform kan ikke støttes (uten videre)
– F.eks. tiles på WP7
– Eksotisk Android-hardware
– iPhone addons
• Du trenger to maskiner / to OS
– PC / Windows for WP7 / Android
– Mac for iOS / Android
Eksempler
• Kolumbus Sanntid
Eksempler
• Bussøyet!
Kryssplatform ala Rune
• Vi må først velge platform vi sikter på
– Typisk:
• iOS / iPhone
• Android-telefoner
• Windows Phone 7 (7.5)
– Kanskje:
• iPad
• Android tablets
• Windows 8 / Metro
Kryssplatform ala Rune
• Starter med .Net, C#
– Starter med kode kompilert mot desktop .Net
• Skrive testbar kode
• Enhetstester
– Implementerer så på WP7 siden det er lettest
• GUI for WP7
– Så bruker vi Mono!
• Først Android siden den kjører på PC/Windows
Kryssplatform ala Rune
• Til slutt MonoTouch
– iOS. Krever en Mac så vi må bytte...
• Andre versjoner
– Metro / Windows 8?
• Kan bruke C# og .Net
– iPad og Android tablets
• MonoTouch og Mono for Android
CrossBox!
... men den kommer vi tilbake til
Intro til
... tidenes korteste ...
.Net
• .Net er et rammeverk og en platform
• Kjører i en virtuell maskin
– Common Language Runtime (CLR)
– Standardisert og åpen spesifikasjon
• Støtter mange språk
– C#, VB.Net, F#, C++, osv.
• Svært stort og rikt rammeverk
– Veldig mye funksjonalitet innebygd
C#
• Et typesikkert og objektorientert språk
• Inspirert av C++ og Java
– Men rikere samtidig som det er enklere
• LINQ
– Language integrated query
– Async
• Åpen spesifikasjon
Intro til Mono
... veldig kjapp denne også ...
Mono
• Mono er en open source implementasjon av .Net-rammeverket
• Kjører på Linux, Mac, Windows
– iOS, Android
– Diverse rare platformer: Wii, PS3, Amiga OS, +++
• Ganske kompatibel, men ikke 100%
• MonoDevelop er en open source editor som kjører på Mono
Mono for Android
• Kjører på Android i parallell med Java-VM’en
• Nesten komplett versjon av Mono
– Støtter avanserte features som Reflection og kodegenerering
• Kan bruke Java-klasser og dele ut komponenter med Java
MonoTouch (iOS)
• Kompilerer C# til native kode
– Noen begrensninger
– Ikke kodegenerering
– Svakheter i generics
• Kan kalle ObjC-biblioteker og native kode
Windows Phone 7
• Kjører en nedskalert versjon av Silverlight
• Bare asynkrone versjoner av API
– Gir mer responsive applikasjoner
• Mangler noen av funksjonene i .Net framework
• Begrensninger i reflection
Kryssplatform .Net
• Må se på hvilke platformer man vil støtte
– Gå for et minste felles multiplum
• Starte på WP7 og unngå kodegenerering
– 99% sikker at koden kjører på alle platformer
• Bør unngå GUI-komponenter i koden
• Abstrahere trådhåndtering dersom det er nødvendig
KODE!
... endelig ...
(men ikke gjør dette hjemme)
Hvordan lagde vi appen?
• Bruker DropNet for integrasjon mot DropBox
– Kjører på alle tre platformene
– Må registrere app key hos DropBox
• DropNet dekker ikke GUI for autentisering
– Vise webside med riktig URL
– Tre forskjellige måter å gjøre dette på
– Lager et interface som beskriver operasjonen
– Implementerer på hver plattform
Programmere mot interface
• Dette er lurt!
• Interface gir operasjonene
– Men vi bryr oss ikke om hvordan de fungerer
– Gjør ingen ting at utførelsen er forskjellig
• Muliggjør mer gjenbruk
Svakhetene med løsningen
• Ikke testet
• For lite gjenbruk av kode
• Er vi sikre på at oppførselen er lik på alle platformer?
• Dårlig skille mellom GUI og «forretningslogikk»
PAUSE!hvem blir med på TDC?
Svakhetene med løsningen
• Ikke testet
• For lite gjenbruk av kode
• Er vi sikre på at oppførselen er lik på alle platformer?
• Dårlig skille mellom GUI og «forretningslogikk»
Mål for versjon 2
• Enhetstester av all funksjonalitet
• Gjenbruke all forretningslogikk
• Native GUI for hver platform
• Tydelig skille mellom presentasjon og modell
Noen verktøy
• MVVM – patternet
• Enhetstester, NUnit
• MVVM – bibliotek, MVVMCross
MVVM
• Model View ViewModel
– (verdens mest krøkkete navn!)
– Baserer seg på MVC
• Skiller mellom
– Model – dataene som skal presenteres
– View – presentasjonen av dataene
– ViewModel – En logisk modell av view som beskriver oppførsel
MVVM
• ViewModel skal
– Være testbar
– Beskrive all oppførsel
– Være gjenbrukbar
– Innkapsle data
– Ikke ha knytninger til presentasjon
– Varsle om endringer
MVVM
• View skal
– Bare bry seg om presentasjon
– Være platformspesifikk
– Knyttes mot en ViewModel
– Helst ikke ha kode som beskriver oppførsel
• Men det er lov å synde :-)
MVVM
• Model skal
– Beskrive data
– Være enkel
– Ikke beskrive oppførsel
MVVM
• I tillegg trenger vi
– Services
• IDropBoxClient er et eksempel
– Converters
• Konverterer f.eks. en boolean til et Visibility-objekt
– Infrastructure
• Oppsett av applikasjon
• Navigasjon
• Osv.
Hvor brukes MVVM?
• WPF
• Silverlight
• Windows Phone
• Windows 8 / WinRT
• Web / HTML5– Knockout.js, KendoUI
• MVVMCross– iOS, Android
MVVMCross
• Kryss-platform MVVM-bibliotek
– Open source
• Kjører på
– WP7
– MonoTouch
– Mono for Android
– WinRT
– Desktop (for testing)
MVVMCross
• Gjør det mulig med MVVM på platformene den støtter
• Noen begrensninger
– Litt umoden
– Litt tungvint på iOS
– Trenger kanskje litt tilpasninger
(veldig kort om) Enhetstesting
• Bruker Nunit
• Tester oppførsel for ViewModels
• Lager Mock-objekter for tjenester
– IDropBoxClient
• Kjører på desktop
• Tester ikke UI og platformspesifikk kode
– Det er mulig, men vi har ikke tid i dag :-)
KODE!
... igjen ...
(og denne gangen blir det bedre)
Oppsummering
• Vi har laget en kryss-platform DropBox-klient
– Bruker .Net og Mono
– DropNet for integrasjon mot DropBox
– Egen interface for å abstrahere vekk implementasjon
– Enhetstester
– MVVM-patternet
– MVVMCross
Ressurser
• Last ned koden på GitHub:
– https://github.com/runegri/CrossBox
• Test MVVMCross:
– https://github.com/slodge/MvvmCross
• NUnit:
– http://www.nunit.org/
• Intro til MVVM fra StackOverflow:
– bit.ly/8EVvwN
Ta kontakt!
• Twitter: @runegri
• GitHub: https://github.com/runegri/
• Epost:
• Presentasjonen kommer på SlideShare