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.7k
Sansanではたらくアプリエンジニアの20%ルール
boohbah
0
720
KotlinでDSL
boohbah
0
9k
ObservableArrayとPikkel
boohbah
2
1.3k
KotlinでPhantom Type #kotlin_sansan
boohbah
2
3.8k
#jkug Kotlinのclass delegation
boohbah
1
340
#DroidKaigi 既存のAndroidプロジェクトに Kotlinを導入した話
boohbah
5
2.6k
Other Decks in Programming
See All in Programming
昭和の職場からアジャイルの世界へ
kumagoro95
1
350
お前もAI鬼にならないか?👹Bolt & Cursor & Supabase & Vercelで人間をやめるぞ、ジョジョー!👺
taishiyade
4
3.4k
AWS Organizations で実現する、 マルチ AWS アカウントのルートユーザー管理からの脱却
atpons
0
130
Spring gRPC について / About Spring gRPC
mackey0225
0
220
Amazon Q Developer Proで効率化するAPI開発入門
seike460
PRO
0
110
TokyoR116_BeginnersSession1_環境構築
kotatyamtema
0
110
データの整合性を保つ非同期処理アーキテクチャパターン / Async Architecture Patterns
mokuo
38
13k
知られざるDMMデータエンジニアの生態 〜かつてツチノコと呼ばれし者〜
takaha4k
4
1.2k
Compose でデザインと実装の差異を減らすための取り組み
oidy
1
300
Pythonでもちょっとリッチな見た目のアプリを設計してみる
ueponx
1
450
ペアーズでの、Langfuseを中心とした評価ドリブンなリリースサイクルのご紹介
fukubaka0825
2
290
DevinとCursorから学ぶAIエージェントメモリーの設計とMoatの考え方
itarutomy
1
600
Featured
See All Featured
A Philosophy of Restraint
colly
203
16k
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
128
19k
Code Reviewing Like a Champion
maltzj
521
39k
Testing 201, or: Great Expectations
jmmastey
41
7.2k
Fireside Chat
paigeccino
34
3.2k
Fantastic passwords and where to find them - at NoRuKo
philnash
51
3k
RailsConf 2023
tenderlove
29
990
Done Done
chrislema
182
16k
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
7
620
The Straight Up "How To Draw Better" Workshop
denniskardys
232
140k
Site-Speed That Sticks
csswizardry
3
360
Faster Mobile Websites
deanohume
306
31k
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!