Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Realm meet up #9
Search
Jumpei Yamamoto
November 28, 2015
Programming
2.2k
2
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Realm meet up #9
eight Androidアプリの開発の取り組みと
Realmの導入事例について
Jumpei Yamamoto
November 28, 2015
More Decks by Jumpei Yamamoto
See All by Jumpei Yamamoto
KotlinでDSLを作る #Kotlin_Sansan
boohbah
2
1.8k
みんな大好き拡張関数 #kotlin_sansan
boohbah
2
9.6k
sealed class in Kotlin1.1
boohbah
1
1.8k
Sansanではたらくアプリエンジニアの20%ルール
boohbah
0
820
KotlinでDSL
boohbah
0
9.9k
ObservableArrayとPikkel
boohbah
2
1.4k
KotlinでPhantom Type #kotlin_sansan
boohbah
2
4k
#jkug Kotlinのclass delegation
boohbah
1
420
#DroidKaigi 既存のAndroidプロジェクトに Kotlinを導入した話
boohbah
5
2.8k
Other Decks in Programming
See All in Programming
Heart of Swift Concurrency
koher
0
980
更なる可用性を求めて、5年間運用したKotlinのアプリケーションをGoでリプレイスする話
ken_tunc
0
370
AI Agent時代のリアーキテクチャ戦略と実践
hokaccha
9
5k
IBM Bob Dojo #1 仕様駆動開発入門
oniak3ibm
PRO
0
270
速習iPhone Duo対応
yuukiw00w
2
830
UPDATE をやめる — EF Core でマスタをバージョン管理する
panda728
PRO
0
760
The Good Stuff, Not the Slop: Engineering High-Quality Android Apps with Modern AI Tooling
danybony
1
260
速く作れる。その次は、速く確かめられる開発へ 〜AIネイティブ開発を支える、Shift Down〜 / Can build fast. Next, moving to development where we can verify fast.
rkaga
7
4.9k
GitHubハンズオン講座 — 実務レベルのチーム開発のフローを身につけよう
junhat6
0
110
The Rails Doctrine Decade
koic
2
390
新卒PdEのリアル
ryu1013
1
520
技術的負債の返済は、AI時代の複利で効く投資 — 経営としての意思決定とその遂行
curekoshimizu
0
1.9k
Featured
See All Featured
From π to Pie charts
rasagy
1
380
[RailsConf 2023] Rails as a piece of cake
palkan
59
7k
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
333
23k
Speed Design
sergeychernyshev
33
2.1k
Balancing Empowerment & Direction
lara
6
1.3k
The State of eCommerce SEO: How to Win in Today's Products SERPs - #SEOweek
aleyda
2
12k
We Are The Robots
honzajavorek
0
380
Joys of Absence: A Defence of Solitary Play
codingconduct
1
530
Designing Dashboards & Data Visualisations in Web Apps
destraynor
232
55k
Leadership Guide Workshop - DevTernity 2021
reverentgeek
1
370
Dealing with People You Can't Stand - Big Design 2015
cassininazir
367
27k
Building Adaptive Systems
keathley
44
3.2k
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!