プラットフォームごとに View を分ける必要があるかよく検討する。 #15
YusukeHosonuma
started this conversation in
Ideas
Replies: 0 comments
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
-
Overview
SwiftUI はマルチプラットフォームに対応したフレームワークであり、iOS / macOS を始めとした Apple プラットフォームにおいて共通的に利用できる、抽象化された DSL として各種 API が提供されている。
しかし、特定のプラットフォームでしか利用できない API が多数存在する。例えばnavigationBarTitleDisplayMode はナビゲーションバーの表示スタイルを制御する Modifier であるが、macOS では利用できない。
このような場合は
#if os(iOS)
などの Compiler Control Statement を利用して分岐するのが一般的な解決策となる。このコード例は極めてシンプルであるが、View が複雑になるにつれ、こうしたプラットフォーム分岐がコード中の至るところで登場することになる。
そして、どこかのタイミングでこういう考えが頭を過ることになる。「もういっそ View を分割したほうが楽だ」と。
このコードでは同じ名称の
MainView
をプラットフォームごとに分けて定義することで、呼び出し元はそれを意識せず利用できるようになっている。もし、View を分割するという方針が正しいとするならば、この書き方は申し分ない。実のところ View を分割するのは簡単でシンプルな解決策ではあるが、それらは完全に別の View としてメンテされることになり、再び統合されることは基本的になくなるということを意識にとどめておくこと。
明らかに View 構造が異なる場合はさておき、コードが複雑に見えるという理由だけで分割するのは避けること。
Discussion
本項目は私の(SwiftUI に限らずプログラミング全般の)経験則によるところが大きい。そのため、View を分割したほうがシンプルにメンテできるというケースも決して少なくないだろうと思う。
例えば、巨大なアプリを大規模チームで開発している場合、プラットフォームごとに開発チームを分けるという判断がされることもあるかもしれない。その際は、共通化を諦め、異なるコードとしてメンテしたほうが全体の生産性に寄与するだろうと予想される。
ともあれ View を分割する際は、それが十分な理由によって行われるものかよく考えることが大切だろうと私は考える。
Example
私が開発した以下のアプリでは、プラットフォーム単位で View を切り分ける処理は(たしか)行っていない(特定のプラットフォームのみで表示される View は存在する)。
Reference
Beta Was this translation helpful? Give feedback.
All reactions