見出し画像

【Swift5】実例で学ぶ、似たような画面を用意する時に元の画面をカスタマイズ&流用した方がいいか、新規クラスを用意するべきか

iPhone_12_と_iPhone_11_と_DeckModel_swift

アップデートでデッキレシピを比較する機能を追加したいと考えました。

しかしながら、左(既存画面)と右(新規画面)ともに同じような表示内容ですよね。

そこで「元のクラスを変更して流用する」「新規クラスを設けるか」悩むと思いますが、それぞれのメリット・デメリットに触れて、どういう選択を行っていたか書いていきます。

「元のクラスを変更して流用する」とは

一覧表示を行っているクラスがListViewControllerだとすると、そのListViewController内に

var isCompare = false 

を追加して、今回追加する時の画面で

let vc = ListViewController()
vc.isCompare = true
self.navigationController?.push(vc,animated:true)

のように比較対象画面を表示する時に流用元のListViewControllerを呼び出す方法です。

もちろんそのままListViewControllerを走らせると全く一緒の画面が出てきてしまうので、if (isCompare) {} else {} で処理を分岐させます。

「新規クラスを設けるか」とは

流石に1から作成するのは骨が折れるのでFinder上でListViewController.swift/xibをコピーしてXcodeに追加するやり方です。

そしてCompareViewControllerのように名前を変えて、不要な処理を削除して、CompareViewController独自の機能を書いていきます。

「元のクラスを変更して流用する」:メリット

実装するとなると実際は簡単です。

ListViewController内でif文を追加するだけで終わります。
これは実装スピードが早いのでメリットに感じます。

「元のクラスを変更して流用する」:デメリット

まず1つ目は、「コードの可読性が落ちる」です。

if文まみれになって、一覧画面の部分のコードと比較対象画面を描画するためのコードなどが一目で見てわかりません。

可読性が落ちるということは、一覧画面を改修する際にコード追加・削除した場合に比較対象画面に影響する可能性があります。

そういったデメリットは運用開発上大きいと思います。

次に考えられるのは、複製元・先の画面の機能が大きく乖離していった場合対応できないです。

現実的には対応できますが、対応コストが多すぎてしまうのです。

今は似たような画面なので、間に合っているだけと考えます。

「新規クラスを設けるか」:メリット

複製元・先のクラスとは最初だけは似ていますが、そこからの拡張性が高いのがメリットと言えます。

その後、どんな変更を加えてしまっても問題ないのです。

「新規クラスを設けるか」:デメリット

たいてい無いですが、唯一あげるとすれば、複製元・先のクラスで同じ機能を追加させる時に工数が二倍になります。

たとえば、画面右下にver表示するような改修を行なった場合は2画面で作業を行う必要があります。

これぐらいなら問題ないですが、実際はクラスの中身が複雑になっていた場合は同様に表示するだけでもかなり大変になります。

今回選択した改修:「新規クラスを設けるか」

今回は複製元・複製先のアプリで複雑な追加処理を行わないと予測しているので、「新規クラスを設けるか」:デメリットが少ないと感じたので「新規クラスを設ける」方を選択しました。







いいなと思ったら応援しよう!