Obj-CをSwiftにリプレースするお話
2017/06/14 Skill Wednesday
齋藤 仁
自己紹介
・齋藤 仁(さいとう ひとし)
・株式会社CyberZ OPENREC事業部
・iOSエンジニアだったりサーバーサイドエンジニアだったり
・ロードバイク乗りです
絶賛Swiftへのリプレース中
Swift化のメリット
● ジェネリクスの活用することで柔軟で汎用的なコーディングが可能
● optional型を活用することでnull安全なコーディングが可能
● Objective-Cより処理パフォーマンスが向上
● ヘッダーファイルがなくなったので、実装ファイルとヘッダーファイルを行き来する必
要がなくなった
● Objective-Cのいけていないメソッドの呼び出し方からの解放
● ネームスペース
● 採用力の強化
● などなど
現在の構成
View ViewController Model
現在の構成 カオス!!
ViewControllerView
Model
Model
Model
View
View
Model
Model
Fat Controller!!
Model
Model
View
View
View
View
View
View
Model
実装面でのKPTを実施
「Problem」
・null安全が保障されない実装であるため、 EXC_BAD_ACCESSが発生しやすい
・ReactiveCocoaとdelegateが混ざったりしていて、逆効果になっていることがある気がする
・ViewでModelの処理してる
・View周りの実装があらゆる箇所に入り込んでいる。
・XCodeプロジェクト上のフォルダ構成と実フォルダ構成が合っていない
・xibファイルがないので、 uiの実装効率が悪い
・xib化した時にレビューの仕方どうする?
・アプリ全体の挙動に関わる状態を保っているクラスがどこにあるのか把握しづらい
・クラスに関するコメントがないから、何をしてくれる Managerなのかわからない
・コードでviewの実装をしているため、メンテが大変
・コードでViewを生成するのはつらい
・コードの依存関係が複雑
・コードコメントが少ないので、読みにくい
・サーバ側apiの仕様変更したとこらが、 wikiに反映遅い時もあります
・トップ画面とかの Controllerが親クラスを継承していて、処理の流れを追いにくい。
・ユニットテストない
・ログイン・サインアップの各 controllerに共通のソースコード多い。
・各Controllerがかなり肥大化している
・画像名やローカライズの key名を文字列でハードコーディングしているため、存在しないリソース名が出てきた時に気付きにくい
・自動再生と動画再生画面で共通で使えるように MoviePlayerクラスを定義しているが、肥大化しすぎて影響範囲が見切れずメンテしにくい。
自動再生だけに絞るとかなりソースコード少ないはず。
実装面でのKPTを実施
「Try」
・APIライブラリの使い方もう少し検討する余地ある
・BuildConfigurationの見直し
・Dataレイヤ、Domainレイヤのデータオブジェクトはそこそこ正規化する。
・DIの導入
・iOS9以降の対応にシフト。
・signingの設定とか見直しする
・Swift lint入れる
・XCodeプロジェクト上のフォルダ構成と実フォルダ構成が合っていないのはツールで解決
・Xib, ストーリーボード有効活用
・xib化するか検討する。
・コードフォーマッタの導入
・タイプセーフリソース化 Swiftgen
・マクロとUtilityの使い分けを統一してもよさそう
・命名規則やコーディング規約の再認識
・状態を伝えるのはドメインじゃないといけない
・継承していること自体が問題じゃない。ドメイン設計意識する。
以下を実現できるアーキテクチャを選定
・責務ごとにレイヤー化
・ドメイン設計意識する
・依存の方向性を単一方向に揃える
・処理の流れは単方向にする
・DIによってユニットテストを導入しやすくする
Clean Architecture
Clean Architecture
View
ViewController
Presenter UseCase Repository DataStore
EntityTranslater
Model
Presentation Layer Domain Layer Data Layer
Clean Architectureのメリット
● 責務を細分化
○ 各レイヤの役割が明確になる。
○ MVCでは実装者の経験やレベルなどによって、実装するクラスの構成に差が
出るが、各レイヤーの役割を明確にしてアーキテクチャとして定めることで、
チーム内の共通認識も持ちやすい。
○ データ・処理の流れを単方向に制限することを意識して実装しやすい。
● UIとビジネスロジックを分離することでレイヤ間の依存を最小限に抑えるこ
とができる。
● レイヤ間を疎結合に保つことでモジュールの置き換えができ、テストが容易
となる。
実装量が多くて面倒そう。。
MVVMを検討してみた
View ViewController ModelViewModel
MVVM PresenterとUseCaseを追加
View
ViewController
ModelPresenter UseCase
MVVM Repositoryを追加
View
ViewController
Presenter UseCase Repository DataStore
Model
あれ?どこかで見たような。。。
これClean Architectureじゃね?
その他対応
● 現状、iOSとtvOSのソースコードは独立しているが、Domain
Layer以下を共通化させる。
● 各レイヤーはprotocolで抽象化してDIで依存性注入
● ユニットテストの導入
● CIツールの活用
● RxSwiftの導入

More Related Content

PDF
Directiveで実現できたこと
PDF
Xcode以外の開発環境 AppCodeの紹介
PDF
Macアプリのインストーラ作成ツールSwift版
PPTX
Visual Studio 2019 Updates Pickup!
PDF
ECSとGitLabでCI環境構築
PDF
ng build --prod & Continuous Delivery
PDF
angular X designer - デザイナからみたAngularJS #ten1club
PPTX
Visual studio 2015 update1 ctpとcsi
Directiveで実現できたこと
Xcode以外の開発環境 AppCodeの紹介
Macアプリのインストーラ作成ツールSwift版
Visual Studio 2019 Updates Pickup!
ECSとGitLabでCI環境構築
ng build --prod & Continuous Delivery
angular X designer - デザイナからみたAngularJS #ten1club
Visual studio 2015 update1 ctpとcsi

What's hot (19)

PDF
持続的な運用開発のために社内基盤を整えている話 〜auditのCI組み込みやlintの社内PKG化〜
PPTX
今さら聞けない人のためのDevOps超入門
PDF
AngularJS で ハイスピードSI
PDF
OWIN - .NETにおけるPSGI -
PPTX
BitriseでiOS/Androidアプリ開発が幸せになった話
PDF
only ip whitelist at cloudfront is ok?
PPTX
開発環境をDockernizeした話
PDF
改めて C# でできることを振り返る
PDF
Riotでサーバレスにした話
PPTX
フロントエンドの技術を刷新した話し。
PPTX
「Atomic Design × Nuxt.js」コンポーネント毎に責務の範囲を明確にしたら幸せになった話
PPTX
消滅都市5周年の運営を支えた技術とその歴史
PDF
Node red basic & node-red-ug-japan
PDF
新登場!Surface Laptop 4
PDF
これから始める Bot Builder 開発のコツと舞台裏
PDF
AngularJS 概説
PDF
Database tools for .NET Core
PDF
Blazor Server テンプレート解説
PDF
de:code報告
持続的な運用開発のために社内基盤を整えている話 〜auditのCI組み込みやlintの社内PKG化〜
今さら聞けない人のためのDevOps超入門
AngularJS で ハイスピードSI
OWIN - .NETにおけるPSGI -
BitriseでiOS/Androidアプリ開発が幸せになった話
only ip whitelist at cloudfront is ok?
開発環境をDockernizeした話
改めて C# でできることを振り返る
Riotでサーバレスにした話
フロントエンドの技術を刷新した話し。
「Atomic Design × Nuxt.js」コンポーネント毎に責務の範囲を明確にしたら幸せになった話
消滅都市5周年の運営を支えた技術とその歴史
Node red basic & node-red-ug-japan
新登場!Surface Laptop 4
これから始める Bot Builder 開発のコツと舞台裏
AngularJS 概説
Database tools for .NET Core
Blazor Server テンプレート解説
de:code報告
Ad

Similar to Obj-CをSwiftにリプレースするお話 (20)

PDF
JAWS-UGアーキテクチャ専門支部 ServerlessConfレポート
PDF
How to improve Type-safety in your Objective-C code
PDF
Objective-Cプログラマのためのswift導入法
PPTX
実プロジェクトの経験から学ぶazureサービス適用パターン
PDF
既存Objective-CプロジェクトをSwiftに移行した時ハマったこと
PPTX
The seminar of asp.net at 201908 sakurug
PPTX
Inside of swift
PDF
Wolcome to swift
PDF
プログラミング生放送第7回 比べてみようPaaSクラウド~Azure VS GAE~
PDF
JavaでWebサービスを作り続けるための戦略と戦術 JJUG-CCC-2018-Spring-g1
PPTX
CEDEC2021 Android iOS 実機上での自動テストをより楽に有意義にする為に ~端末管理・イメージ転送・動画記録等の周辺情報のノウハウ共有~
PDF
あるインフラエンジニアの過去と未来
PDF
IoT Edge and Serverless playground with Node.js ~ IoT EdgeとサーバレスをNode.jsで遊ぶ実験ノート
PDF
Nifty cloud automationでクラウド構築・運用の自動化
PDF
OpenStack Object Storage; Usage
PDF
サーバーレスのアーキテクチャパターンとそれぞれの実装・テストの勘所
PDF
Vsug day 2010 summer windows azure でやってみよう
PPTX
Sails.jsのメリット・デメリット
PPTX
Japan MVP Community Connection 2017 Autumn smart Demonstration
PDF
Spring Boot概要
JAWS-UGアーキテクチャ専門支部 ServerlessConfレポート
How to improve Type-safety in your Objective-C code
Objective-Cプログラマのためのswift導入法
実プロジェクトの経験から学ぶazureサービス適用パターン
既存Objective-CプロジェクトをSwiftに移行した時ハマったこと
The seminar of asp.net at 201908 sakurug
Inside of swift
Wolcome to swift
プログラミング生放送第7回 比べてみようPaaSクラウド~Azure VS GAE~
JavaでWebサービスを作り続けるための戦略と戦術 JJUG-CCC-2018-Spring-g1
CEDEC2021 Android iOS 実機上での自動テストをより楽に有意義にする為に ~端末管理・イメージ転送・動画記録等の周辺情報のノウハウ共有~
あるインフラエンジニアの過去と未来
IoT Edge and Serverless playground with Node.js ~ IoT EdgeとサーバレスをNode.jsで遊ぶ実験ノート
Nifty cloud automationでクラウド構築・運用の自動化
OpenStack Object Storage; Usage
サーバーレスのアーキテクチャパターンとそれぞれの実装・テストの勘所
Vsug day 2010 summer windows azure でやってみよう
Sails.jsのメリット・デメリット
Japan MVP Community Connection 2017 Autumn smart Demonstration
Spring Boot概要
Ad

Obj-CをSwiftにリプレースするお話