Slide 1

Slide 1 text

1 iOSクライアント Re-Architectureのその後 Masaki Haga

Slide 2

Slide 2 text

2 About Me - 2018年4月にメルカリへ入社。 - UK版メルカリやJP版メルカリのUX関連プロジェクト(画像検索、ホーム画面な ど)を担当。 - 現在はPersonalizationチームのiOS Tech Lead。主にHomeやSearch画 面関連のプロジェクトを担当。 Masaki Haga

Slide 3

Slide 3 text

3 iOSクライアント Re-Architectureの概要 ● 2018年からスタート ● 現在までに主要な画面(出品, 商品詳細, 検索, ホーム)はすべて Re-Architecture済み ● Micro View Controllerという概念に基づく

Slide 4

Slide 4 text

4 Micro View Controller とは?

Slide 5

Slide 5 text

5 2018年時点での問題 ● 主要な画面でのロジックの増大、複雑化

Slide 6

Slide 6 text

6 Item Detail VC ● Show Product Images ● Show Product Name ● Show Brand Name if available ● Show Price ● Show Merpay Balance if available ● Call Like API ● Navigate to comment screen ● Call purchase API …. And more

Slide 7

Slide 7 text

7 Micro View Controllerとは? ● どのようなアーキテクチャでも、ビジネスロジックが増えれば各レイヤーは肥大 化する。 ● 一つのVCを複数のVCに分けることができれば、一つのVCに入るロジックを減 らすことができるのではないか。

Slide 8

Slide 8 text

8

Slide 9

Slide 9 text

9 Product Image VC ● Show Product Images Product Name VC ● Show Product Name ● Show Brand Name if available Product Price VC ● Show Price ● Show Merpay Balance if available Like Button VC ● Call Like API Comment Button VC ● Navigate to comment screen Purchase Button VC ● Call purchase API

Slide 10

Slide 10 text

10 Micro View Controllerとは? ● 一つの画面を複数のView Controllerに分ける。 ● それらのVCのViewをUIStackViewでつなげ、UIScrollViewにのせる。 ○ 各VCが自分のViewのサイズを決定 ○ 親VCが最終的なContent Sizeを決定 ● UIStackViewでUIViewControllerをつなげる部分(ContainerView)や Input, Output, Dependency Injectionに関するProtocol等を共有 Frameworkとして提供する。

Slide 11

Slide 11 text

11 Mercariの組織 出品 商品詳細 ホーム マイページ カテゴリ 特化 etc...

Slide 12

Slide 12 text

12

Slide 13

Slide 13 text

13 並行開発やABテスト ● ABテストの結果、機能を採用しない場合は、関連するロジックはすべてView Controller内にカプセル化されているので、View Controllerごと消すことが できる。

Slide 14

Slide 14 text

14 効果 ● 各View Controllerのコード量の減少 ○ 共有できるレイアウトのロジックはDesign Systemとして提供する。 ○ 共有できないログ、API、遷移などのロジックはVC内に記述し分散させる。 ● 表示速度の改善

Slide 15

Slide 15 text

15 Item Thumbnail ● Log, Navigation, UIContextMenuのロジックがカプ セル化されている。

Slide 16

Slide 16 text

16 めでたしめでたし?

Slide 17

Slide 17 text

17 1.Stateの管理

Slide 18

Slide 18 text

18 Stateの管理 ● View ControllerそれぞれがStateの型を持っていた。 ● Stateを同期するため、シンプルなVCでもコード量が多かった。 ○ 例:いいねボタンのState

Slide 19

Slide 19 text

19

Slide 20

Slide 20 text

20

Slide 21

Slide 21 text

21 FLUXライクなArchitecture ● Store, Action, Reducerから構成される。 ● 大きな単位のVCがStoreのインスタンスを保持する。

Slide 22

Slide 22 text

22

Slide 23

Slide 23 text

23 効果 ● Stateを同期させることが簡単になる。 ● 複雑なReactive Frameworkのコードの減少。 ● Stateの変化が理解しやすくなる。

Slide 24

Slide 24 text

24 2.ViewControllerとViewの区別

Slide 25

Slide 25 text

25 ViewControllerの深いネスト ● 細かくView Controllerを作りすぎると、単純なViewでもコードのオーバーヘッ ドが多くなったり、View Controllerがネストしてコードの見通しが悪い。 ● Viewにすべきか、View Controllerにすべきか。ロジックの量で各チームが判 断。

Slide 26

Slide 26 text

26 3.組織とArchitecture

Slide 27

Slide 27 text

27 背景 ● 2018年、Re-Architectureと同時期に組織が大きくなった。 ● メンバーの価値観が多様化。 ● Design SystemやDeclarative UIがチーム内でも注目され始める。

Slide 28

Slide 28 text

28 sections.append(contentsOf: [ .group([ .detailPush(title: "My profile".localizedString, selectionBlock:pushToMyProfile), .detailPush(title: "Saved and viewed items".localizedString, selectionBlock:pushToMyLikesAndViews), .detailPush(title: "Listings".localizedString, selectionBlock:pushToMyListings), .detailPush(title: "Purchases".localizedString, selectionBlock:pushToMyPurchases), .detailPush(title: "Instant offers".localizedString, selectionBlock:pushToInstantSales) ]), .gap(), .group([ .detailPush(title: "Settings".localizedString, selectionBlock:pushToSettings), .detailPush(title: "Support messages".localizedString, selectionBlock:pushToMercariNews), .detailPush(title: "Help centre".localizedString, selectionBlock:pushToHelpCenter) ]), .gap() ])

Slide 29

Slide 29 text

29 論点 ● 組織の開発スタイルや規模にどれだけマッチしているか ● On-Boardingのしやすさ ● 実装のスピード ● データフローのつかみやすさ ● Testability ● PlatformのAPI(UIKit)は直接使いやすいか ...etc

Slide 30

Slide 30 text

30 結論 ● アーキテクチャに正解はない。 ● 各View ControllerのInput, Output, Dependency Injectionに関する Protocolは統一されているが、内部のArchitectureはある程度各チームの裁 量に任せる。

Slide 31

Slide 31 text

31 Micro View Controllerの応用 (Home)

Slide 32

Slide 32 text

32

Slide 33

Slide 33 text

33

Slide 34

Slide 34 text

34 新しいHome ● 様々なコンポーネントが柔軟に追加できる。 ● コンポーネントの出し分けがbackendから操作できる。 ● Stateが変更された際、差分がなめらかにUIに反映される。

Slide 35

Slide 35 text

35 UIStackView vs UICollectionView ● UIStackViewはsub viewが自分でviewの大きさを決めるのに対して UICollectionViewは親がsub viewの大きさを決める(self-sizingを使わな ければ)。 ● UICollectionViewはDifference UpdateにUIKitがアニメーションをつけて くれる。 ● UICollectionViewの場合、sub viewのインスタンスは見た目よりも多く作ら れる。

Slide 36

Slide 36 text

36 まとめ ● Mercari iOSのアーキテクチャ ○ Micro View Controllerによるロジックの分散、カプセル化 ○ 各View ControllerのInput, Output, Dependency Injectionに関す るProtocolの統一 ○ StoreによるStateの同期 ○ UIStackViewやUICollectionViewによるContainerViewの仕組み

Slide 37

Slide 37 text

37 Thank you!