Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Realm meet up #9

Realm meet up #9

eight Androidアプリの開発の取り組みと
Realmの導入事例について

Jumpei Yamamoto

November 28, 2015
Tweet

More Decks by Jumpei Yamamoto

Other Decks in Programming

Transcript

  1. ⾃自⼰己紹介 ⼭山本純平   Sansan株式会社   Eight事業部   Androidアプリ担当   2015年年6⽉月⼊入社

      前職では   • ガラケーのネイティブアプリの開発   • スマートフォンのプラットフォーム   • WPFアプリ   • iOSアプリ   @boohbah
  2. アジェンダ • Eightの紹介   • Realm   • Realm導⼊入のメリット  

    • ⼯工夫した点   • Realmのデバッグツール、テスト
  3. ⽉月に2回のレクチャー • Lintの警告とその対処⽅方法   • Master  of  Fragment   •

    いかにViewがレイアウトされるか   • Recycle  View実装について   • Retrofit  +  RxJava  ハンズオン   • Dagger2  +  Robolectric  +  Espresso  +  PowerMockitでテスト環 境  ハンズオン   • Proguard設定の詳細   • Annotation  Processing概要   • Android  Studioでのgradleビルド詳細   • BLEの実装について  
  4. Eightの設計も⽇日々進化 • Lintの警告数が約半分に   • Realmの導⼊入   • RxJavaの導⼊入  

    • DataBindingの導⼊入   • Dagger2導⼊入でモジュールのDI化   • UnitTest   • Kotlin導⼊入   などを⾏行行いながら⽇日々のメンテ、新規機能開発をしていま す。
  5. Sansanのアプリ開発チーム • 法⼈人向けSansanアプリ   • iOS開発者  2名   • Android開発者

     2名   • 個⼈人向けアプリEight   • iOS開発者  2名  +  業務委託1名   • Android開発者  1名  +  業務委託  1名
  6. $PQZSJHIU˜4BOTBO *OD"MMSJHIUTSFTFSWFE 4BOTBO͸Ұॹʹ৽͍͠Ձ஋Λ࡞͍ͬͯ͘ ஥ؒΛ͕͍ͯ͞͠·͢ɻ 3VCZ 3VCZPO3BJMT ʢ8FCΞϓϦέʔγϣϯʣ $ɼ"41/&5.7$ ʢ8FCΞϓϦέʔγϣϯʣ J04"OESPJEΞϓϦ

      ݸਓ޲໊͚ࢗ؅ཧΞϓϦʮ&JHIUʯ   ໊ࢗσʔλԽ෼ࢄॲཧγεςϜ   ๏ਓ޲໊͚ࢗ؅ཧαʔϏεʮ4BOTBOʯ   ๏ਓ޲໊͚ࢗ؅ཧαʔϏε ʮ4BOTBOʯ   ݸਓ޲໊͚ࢗ؅ཧΞϓϦʮ&JHIUʯ ΤϯδχΞืूத 4BOTBO࠾༻ ݕࡧ SFDSVJU!TBOTBODPN·Ͱ ͓ؾܰʹ͝࿈བྷ͍ͩ͘͞ɻ ڵຯͷ͋Δํ͸
  7. Realm導⼊入のメリット • ⾼高速   • コンセプトが明確で概念念の把握がしやすい   • 導⼊入が楽  

    • (SQLite利利⽤用に⽐比べて)ソースの記述量量が圧倒的に 少ない   • ⼿手厚いサポート 正直⾔言って苦労した点はほとんどなし
  8. Realm  for  JavaのRealmObject • オブジェクトの継承はサポートしていない   • プロパティのsetter/getter以外のメソッドの定義 ができない  

    • 永続化しないプロパティには@Ignoreをつける   • Annotation  Processorによって定義したクラス のサブクラスのコードが⽣生成される
  9. public  class  CardUpdateDetail  extends  RealmObject    implements  FeedItemDetail{
    

       @PrimaryKey
        private  String  postId;
 } public  interface  FeedItemDetail  {
 } RealmObjectの拡張クラスをFeedItemDetailの実装とする public  class  CardUpdateDetail  extends  RealmObject    implements  FeedItemDetail{
        /*  ..  */  
 } public  class  CardUpdateDetail  extends  RealmObject    implements  FeedItemDetail{
        /*  ..  */
 }
  10. public  class  FeedItem  extends  RealmObject  {
        private

     int  kind;
        @Ignore
        private  FeedItemDetail  feedItemDetail;
 
        public  FeedItemDetail  getFeedItemDetail()  {
 
                if  (this.feedItemDetail  !=  null)  {
                        return  feedItemDetail;
                }
 
                int  kind  =  getKind();
                String  postId  =  getPostId();
                switch  (kind)  {
                        case  FEED_ITEM_KIND_CARD_UPDATE:
                                this.feedItemDetail  =  realm.where(CardUpdateDetail.class).                                  break;
                        case  FEED_ITEM_KIND_SHARED_LINK:
                                this.feedItemDetail  =  realm.where(SharedLinkDetail.class).
                                break;
                      /*  ...  */
                }
                return  feedItemDetail;
        }
 }   @Ignore指定された   プロパティは   永続化されない getterでアクセス時に   クエリをかけて   メモリ上にキャッシュ
  11. PowerMockを使う • finalクラスのMock化が可能!   • staticメソッドのMock化も可能!   • privateメソッドの呼び出しもできてしまう  

    • どうやらクラスローダを差し替えているらしい   • Mockitoと⼀一緒につかう   • 遅い   https://github.com/jayway/powermock   https://github.com/robolectric/robolectric/wiki/ Using-‐‑‒PowerMock
  12. RunWith(RobolectricGradleTestRunner.class)
 @Config(constants  =  BuildConfig.class,  sdk  =  21)
 @PowerMockIgnore({"org.mockito.*",  "org.robolectric.*",  "android.*"})


    @PrepareForTest({Realm.class})
 public  class  ExampleUnitTest  {
        @Rule
        public  PowerMockRule  rule  =  new  PowerMockRule();
 
        @Test
        public  void  mockRealm()  throws  Exception  {
                final  Realm  mockRealm  =  PowerMockito.mock(Realm.class);
 
                PowerMockito.when(mockRealm.isAutoRefresh()).thenReturn(true);
 
                assertThat(mockRealm.isAutoRefresh(),  is(true));
        }
 }
 mock化したいクラスを指定 mockするメソッドの記述 Robolectric上でPowerMockを   動作させるためのおまじない