Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Realm meet up #9
Search
Jumpei Yamamoto
November 28, 2015
Programming
2
2.2k
Realm meet up #9
eight Androidアプリの開発の取り組みと
Realmの導入事例について
Jumpei Yamamoto
November 28, 2015
Tweet
Share
More Decks by Jumpei Yamamoto
See All by Jumpei Yamamoto
KotlinでDSLを作る #Kotlin_Sansan
boohbah
2
1.5k
みんな大好き拡張関数 #kotlin_sansan
boohbah
1
8.9k
sealed class in Kotlin1.1
boohbah
1
1.6k
Sansanではたらくアプリエンジニアの20%ルール
boohbah
0
710
KotlinでDSL
boohbah
0
8.9k
ObservableArrayとPikkel
boohbah
2
1.2k
KotlinでPhantom Type #kotlin_sansan
boohbah
2
3.8k
#jkug Kotlinのclass delegation
boohbah
1
330
#DroidKaigi 既存のAndroidプロジェクトに Kotlinを導入した話
boohbah
5
2.5k
Other Decks in Programming
See All in Programming
Jakarta EE meets AI
ivargrimstad
0
260
【re:Growth 2024】 Aurora DSQL をちゃんと話します!
maroon1st
0
780
Go の GC の不得意な部分を克服したい
taiyow
3
800
return文におけるstd::moveについて
onihusube
1
1.2k
rails stats で紐解く ANDPAD のイマを支える技術たち
andpad
1
290
선언형 UI에서의 상태관리
l2hyunwoo
0
180
たのしいparse.y
ydah
3
120
短期間での新規プロダクト開発における「コスパの良い」Goのテスト戦略」 / kamakura.go
n3xem
2
170
ある日突然あなたが管理しているサーバーにDDoSが来たらどうなるでしょう?知ってるようで何も知らなかったDDoS攻撃と対策 #phpcon.2024
akase244
1
150
創造的活動から切り拓く新たなキャリア 好きから始めてみる夜勤オペレーターからSREへの転身
yjszk
1
130
Security_for_introducing_eBPF
kentatada
0
110
快速入門可觀測性
blueswen
0
380
Featured
See All Featured
Art, The Web, and Tiny UX
lynnandtonic
298
20k
Practical Orchestrator
shlominoach
186
10k
Git: the NoSQL Database
bkeepers
PRO
427
64k
Faster Mobile Websites
deanohume
305
30k
How GitHub (no longer) Works
holman
311
140k
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
33
2k
Stop Working from a Prison Cell
hatefulcrawdad
267
20k
Intergalactic Javascript Robots from Outer Space
tanoku
270
27k
Optimising Largest Contentful Paint
csswizardry
33
3k
Fontdeck: Realign not Redesign
paulrobertlloyd
82
5.3k
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
17
2.3k
Documentation Writing (for coders)
carmenintech
66
4.5k
Transcript
eight Android アプリでの Realm導⼊入事例例 Realm meet up #9
Sansan株式会社 ⼭山本純平
⾃自⼰己紹介 ⼭山本純平 Sansan株式会社 Eight事業部 Androidアプリ担当 2015年年6⽉月⼊入社
前職では • ガラケーのネイティブアプリの開発 • スマートフォンのプラットフォーム • WPFアプリ • iOSアプリ @boohbah
アジェンダ • Eightの紹介 • Realm • Realm導⼊入のメリット
• ⼯工夫した点 • Realmのデバッグツール、テスト
None
None
名刺刺管理理アプリからビジネスネットワーキングサービスへ進化 フィードの投稿 ニュースの配信
プロフィールの公開
None
For Android @yanzam @zaki50
Slackでのサポート
ソースレビュー
⽉月に2回のレクチャー • Lintの警告とその対処⽅方法 • Master of Fragment •
いかにViewがレイアウトされるか • Recycle View実装について • Retrofit + RxJava ハンズオン • Dagger2 + Robolectric + Espresso + PowerMockitでテスト環 境 ハンズオン • Proguard設定の詳細 • Annotation Processing概要 • Android Studioでのgradleビルド詳細 • BLEの実装について
Eightの設計も⽇日々進化 • Lintの警告数が約半分に • Realmの導⼊入 • RxJavaの導⼊入
• DataBindingの導⼊入 • Dagger2導⼊入でモジュールのDI化 • UnitTest • Kotlin導⼊入 などを⾏行行いながら⽇日々のメンテ、新規機能開発をしていま す。
Sansanのアプリ開発チーム • 法⼈人向けSansanアプリ • iOS開発者 2名 • Android開発者
2名 • 個⼈人向けアプリEight • iOS開発者 2名 + 業務委託1名 • Android開発者 1名 + 業務委託 1名
$PQZSJHIU4BOTBO *OD"MMSJHIUTSFTFSWFE 4BOTBOҰॹʹ৽͍͠ՁΛ࡞͍ͬͯ͘ ؒΛ͕͍ͯ͞͠·͢ɻ 3VCZ 3VCZPO3BJMT ʢ8FCΞϓϦέʔγϣϯʣ $ɼ"41/&5.7$ ʢ8FCΞϓϦέʔγϣϯʣ J04"OESPJEΞϓϦ
ݸਓ໊͚ཧΞϓϦʮ&JHIUʯ ໊σʔλԽࢄॲཧγεςϜ ๏ਓ໊͚ཧαʔϏεʮ4BOTBOʯ ๏ਓ໊͚ཧαʔϏε ʮ4BOTBOʯ ݸਓ໊͚ཧΞϓϦʮ&JHIUʯ ΤϯδχΞืूத 4BOTBO࠾༻ ݕࡧ SFDSVJU!TBOTBODPN·Ͱ ͓ؾܰʹ͝࿈བྷ͍ͩ͘͞ɻ ڵຯͷ͋Δํ
Realm • Realm導⼊入以前 • Realm導⼊入のメリット • Realmでの実装の詳細
• デバッグ • テスト
Realm導⼊入以前 • そもそもORMは使⽤用せずSQLiteを直接利利⽤用 • SQLの⽣生成のコードが読みづらい。 • メンテが⼤大変。データの把握もままならず
Realm導⼊入のメリット • ⾼高速 • コンセプトが明確で概念念の把握がしやすい • 導⼊入が楽
• (SQLite利利⽤用に⽐比べて)ソースの記述量量が圧倒的に 少ない • ⼿手厚いサポート 正直⾔言って苦労した点はほとんどなし
Feedデータの保存に Realmを使⽤用 • サーバから取得してきた データのキャッシュ • ⼀一覧表⽰示⽤用
• 詳細表⽰示⽤用
Data structure
Realm for JavaのRealmObject • オブジェクトの継承はサポートしていない • プロパティのsetter/getter以外のメソッドの定義 ができない
• 永続化しないプロパティには@Ignoreをつける • Annotation Processorによって定義したクラス のサブクラスのコードが⽣生成される
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{ /* .. */ }
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でアクセス時に クエリをかけて メモリ上にキャッシュ
Data structure
Realmデータのデバッグ
stetho-‐‑‒realm • zaki50さんが開発のstethoプラグイン • https://github.com/uPhyca/stetho-‐‑‒realm • stetho上でRealmデータの閲覧が可能
stetho • stethoはfacebook社で開発されたDebugツール • ChromeのインスペクタからAndroidアプリのViewのツ リー構造、Network状況、SQLiteデータなどが閲覧可能
with stetho-‐‑‒realm stetho上でRealmのDBの状況を リアルタイムに把握
Realm環境でのテスト
JVM上でRealmを使ったテストをしたい • RealmはAndroidのネイティブライブラリ • Robolectric等を⽤用いたJVM上でのテストでは読み 込めない • Realmオブジェクト⾃自体もfinalクラスなので
Mockito等でMock化することはできない
PowerMockを使う • finalクラスのMock化が可能! • staticメソッドのMock化も可能! • privateメソッドの呼び出しもできてしまう
• どうやらクラスローダを差し替えているらしい • Mockitoと⼀一緒につかう • 遅い https://github.com/jayway/powermock https://github.com/robolectric/robolectric/wiki/ Using-‐‑‒PowerMock
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を 動作させるためのおまじない
まとめ • Realmは簡単、便便利利 • @Ingnoreを使ってオブジェクトの継承関係を擬 似的に実装 • stetho-‐‑‒realmを使うとデバッグも便便利利
• PowerMockでJVM上でのテストも可能
Thank you!