2. 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)
3. 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
4. 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
6. 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...
7. 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
8. 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
9. 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
16. 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
17. 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
18. 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
21. .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
22. 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
24. 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
25. 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
26. MonoTouch (iOS)
• Kompilerer C# til native kode
– Noen begrensninger
– Ikke kodegenerering
– Svakheter i generics
• Kan kalle ObjC-biblioteker og native kode
27. 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
28. 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
29. KODE!
... endelig ...
(men ikke gjør dette hjemme)
30. 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
31. 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
32. 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»
34. 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»
35. Mål for versjon 2
• Enhetstester av all funksjonalitet
• Gjenbruke all forretningslogikk
• Native GUI for hver platform
• Tydelig skille mellom presentasjon og modell
37. 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
38. MVVM
• ViewModel skal
– Være testbar
– Beskrive all oppførsel
– Være gjenbrukbar
– Innkapsle data
– Ikke ha knytninger til presentasjon
– Varsle om endringer
39. 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 :-)
40. MVVM
• Model skal
– Beskrive data
– Være enkel
– Ikke beskrive oppførsel
41. 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.
42. Hvor brukes MVVM?
• WPF
• Silverlight
• Windows Phone
• Windows 8 / WinRT
• Web / HTML5
– Knockout.js, KendoUI
• MVVMCross
– iOS, Android
44. MVVMCross
• Gjør det mulig med MVVM på platformene
den støtter
• Noen begrensninger
– Litt umoden
– Litt tungvint på iOS
– Trenger kanskje litt tilpasninger
45. (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 :-)
46. KODE!
... igjen ...
(og denne gangen blir det bedre)
47. 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
48. 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
49. Ta kontakt!
• Twitter: @runegri
• GitHub: https://github.com/runegri/
• Epost:
– rag@rag.no
– rune-andreas.grimstad@capgemini.com
• Presentasjonen kommer på SlideShare