Open uhooi opened 4 years ago
継承されていないクラスには何も考えずに final
を付けたい
https://github.com/sachiko-kame/architecture_iOS/blob/feature/MVP/sample/sample/ViewController.swift#L11
『ウホーイが気になったところを書いていきます!』 がとてもチャーミングで素敵です!
修正します!
チャーミング頂き光栄です✨
面白くもありつい笑ってました!✨
変更しないプロパティは var
でなく let
にしましょう!
https://github.com/sachiko-kame/architecture_iOS/blob/feature/MVP/sample/sample/ViewController.swift#L13
ついでにUI部品はできる限りInitialization Closureを使って初期化したい(これは好み)
private let tableView: UITableView = {
let tableView = UITableView()
tableView.frame = UIScreen.main.bounds
tableView.register(cellType: TableViewCell.self)
return tableView
}()
変更しないプロパティは
var
でなくlet
にしましょう! https://github.com/sachiko-kame/architecture_iOS/blob/feature/MVP/sample/sample/ViewController.swift#L13
はい! すみません。 気をつけます! 修正します!
setup()
メソッドで「テーブルビューの初期化」と「アイテムの取得」の2つのことを行っているので、メソッドを分けるといいと思います!
https://github.com/sachiko-kame/architecture_iOS/blob/feature/MVP/sample/sample/ViewController.swift#L25-L32
自分ならこう書きます↓
あと self
の有無は統一したい!笑
override func viewDidLoad() {
super.viewDidLoad()
configureTableView()
self.presenter.itemsGet()
}
private func configureTableView() {
self.tableView.delegate = self
self.tableView.dataSource = self
self.view.addSubview(tableView)
}
@sachiko-kame こんな感じの内容が続きますが、大丈夫でしょうか…?
一旦休憩で、続きは後ほど見ます!
ついでにUI部品はできる限りInitialization Closureを使って初期化したい(これは好み)
private let tableView: UITableView = { let tableView = UITableView() tableView.frame = UIScreen.main.bounds tableView.register(cellType: TableViewCell.self) return tableView }()
(これは好み)ってくれていますが結構こっちの方が好まれる印象です。 なかなかなれなくてこの書き方いつもできていないです。 修正します!
setup()
メソッドで「テーブルビューの初期化」と「アイテムの取得」の2つのことを行っているので、メソッドを分けるといいと思います! https://github.com/sachiko-kame/architecture_iOS/blob/feature/MVP/sample/sample/ViewController.swift#L25-L32自分ならこう書きます↓ あと
self
の有無は統一したい!笑override func viewDidLoad() { super.viewDidLoad() configureTableView() self.presenter.itemsGet() } private func configureTableView() { self.tableView.delegate = self self.tableView.dataSource = self self.view.addSubview(tableView) }
確かに!おっしゃる通りです! 沢山ありがとうございます! 修正します!
Initialization Closureを使うと、例えばTableViewをCollectionViewに変えたくなったときに、そこだけ変えればいいのでわかりやすいです!
あとメソッド化されないので、初期化処理が一度しか呼ばれないことが保証できます。
(普通はやらないですが、 setup()
メソッドを2回呼ぶことも理論上はできてしまうので)
@sachiko-kame こんな感じの内容が続きますが、大丈夫でしょうか…?
一旦休憩で、続きは後ほど見ます!
はい!とても助かります! ありがとうございます!!✨
Initialization Closureを使うと、例えば�TableViewをCollectionViewに変えたくなったときに、そこだけ変えればいいのでわかりやすいです! あとメソッド化されないので、一度しか呼ばれないことが保証できます。
確かに!利点の方が大きいですね! ありがとうございます!
です! あとちょっとコメント編集しましたー
です! あとちょっとコメント編集しましたー
はい!!実は変更後すぐにみて確かに!となっていました。 ありがとうございます!🙇♀️
@uhooi
現時点で指摘頂けたところ修正しました! 本当にありがとうございます!勉強になります!🙇♀️
https://github.com/sachiko-kame/architecture_iOS/commit/76a8d89a6c35becdda37c5d697521765cf6b92b1
すぐに対応していただけると、こちらもレビューしたかいがあって嬉しいです✨
@uhooi
レビューがとても分かりやすかったのが大きかったかと思います!
自分であやふやだったり悩んでいたことなどもuhooiさんのおかげで解消できたので本当に助かりました!✨
本当にありがとうございます!🙇♀️✨
自分はViewに単体テストを書きたくなく、できる限りViewに分岐(if, switch)を入れたくないので、 presenter.itemGet()
メソッドの戻り値はオプショナル型じゃない方がいいです!
https://github.com/sachiko-kame/architecture_iOS/blob/feature/MVP/sample/sample/ViewController.swift#L59
分岐はPresenter側のメソッドに入れて、あとTableViewのデータソースで取得するのではなく、 viewDidLoad()
などで予め取得するといいと思います!
MVPだったらView以外で import UIKit
するのはよくないです。
import Foundation
で済ませましょう!
https://github.com/sachiko-kame/architecture_iOS/blob/feature/MVP/sample/sample/Presenter.swift#L9
変数名で、 numberOfItems
より普通に itemCount
でいいと思いました笑
https://github.com/sachiko-kame/architecture_iOS/blob/feature/MVP/sample/sample/Presenter.swift#L12
自分はViewに単体テストを書きたくなく、できる限りViewに分岐(if, switch)を入れたくないので、
presenter.itemGet()
メソッドの戻り値はオプショナル型じゃない方がいいです! https://github.com/sachiko-kame/architecture_iOS/blob/feature/MVP/sample/sample/ViewController.swift#L59分岐はPresenter側のメソッドに入れて、あとTableViewのデータソースで取得するのではなく、
viewDidLoad()
などで予め取得するといいと思います!
データソース以外の取得方法がそもそもわかっていなかったので考えます!
変数名で、
numberOfItems
より普通にitemCount
でいいと思いました笑 https://github.com/sachiko-kame/architecture_iOS/blob/feature/MVP/sample/sample/Presenter.swift#L12
そこまで配慮できていなかったです!汗 ありがとうございます! 以後気をつけます!
個人的には itemGet()
でなく itemGeted()
だとアイテムをゲットした後の処理だとわかって好みです!
https://github.com/sachiko-kame/architecture_iOS/blob/feature/MVP/sample/sample/Presenter.swift#L43
DispatchQueue.main.async
はViewでやればいいと思います!
https://github.com/sachiko-kame/architecture_iOS/blob/feature/MVP/sample/sample/Presenter.swift#L46
変数名で、
numberOfItems
より普通にitemCount
でいいと思いました笑 https://github.com/sachiko-kame/architecture_iOS/blob/feature/MVP/sample/sample/Presenter.swift#L12
これは私も実は『itemCount派』です。 どっちも良いと今英和辞書で調べてはっきりしたので『itemCount』に変更したいと思います!
ちなみに、 『number』の方がいいのか調べて 『number』は『数』とでるのに対して、『Count』は『数える』で出てきたので『number』の方がいいのかな?と『numberOfItems』にしてしまいました汗
個人的には
itemGet()
でなくitemGeted()
だとアイテムをゲットした後の処理だとわかって好みです! https://github.com/sachiko-kame/architecture_iOS/blob/feature/MVP/sample/sample/Presenter.swift#L43
確かに!私はゲットしにいくって感じでとらえてしましました! 『アイテムを取得した』の中でアイテム取得の処理を書くというイメージの方がしっくりくる感じですかね?
好み
の問題と言ってくれているので少し悩みたいと思います!
これは私も実は『itemCount派』です。 どっちも良いと今英和辞書で調べてはっきりしたので『itemCount』に変更したいと思います!
そもそも items.count
を返してるので、素直に同じ名前を使っていいと思いました笑
『アイテムを取得した』の中でアイテム取得の処理を書くというイメージの方がしっくりくる感じですかね?
すみません勘違いしました、、
これはViewから呼ばれているメソッドですね。
そしたら基本的にメソッドは動詞始まりがいいと思うので、 getItem()
がいいと思います!
このあたりもclassにはすべて final
を付けるクセを付けるといいと思います!
https://github.com/sachiko-kame/architecture_iOS/blob/feature/MVP/sample/sample/Parts/Cell/TableViewCell.swift#L15
継承したくなったら外せばいいので笑
好みかもしれませんが、cellにqiitaを持たせる必要はないと思います! https://github.com/sachiko-kame/architecture_iOS/blob/feature/MVP/sample/sample/Parts/Cell/TableViewCell.swift#L17
@IBOutlet
や @IBAction
には基本 private
を付けて、外部からのアクセスを防ぐと、UIが外から変更されないことが保証されます!
https://github.com/sachiko-kame/architecture_iOS/blob/feature/MVP/sample/sample/Parts/Cell/TableViewCell.swift#L20-L22
ここでcellに分岐が入るのが気になります。
setRead()
と setUnread()
とセットのメソッドを2つ作って呼び分けると分岐をなくせます!
https://github.com/sachiko-kame/architecture_iOS/blob/feature/MVP/sample/sample/Parts/Cell/TableViewCell.swift#L38
とりあえず以上です!
あとは単体テストを書いてみるのがいいと思います。 自分はアーキテクチャを「テストを書きやすくするため」にあると思っていて、「あ、ここテスト書きづらいな」と思ったら設計が悪いことが多く、設計の良し悪しに気づきやすくなります! Viewは手動でテストすることが多いので、まずPresenterからテストを書くのがオススメです〜
そしたら基本的にメソッドは動詞始まりがいいと思うので、 getItem() がいいと思います!
すみません、 get○○()
はゲッターにしか付けたくないので、 loadItem()
や fetchItem()
などのほうがいいですね〜
DispatchQueue.main.async
はViewでやればいいと思います! https://github.com/sachiko-kame/architecture_iOS/blob/feature/MVP/sample/sample/Presenter.swift#L46
viewの処理開始一番最初に書くか、実際に描画している所で書くかの違いなのですかね?
非同期の後に処理が遅くなるということでここに入れているのかな?と思いました。
正直今回の場合描画が遅いとかはなさそうなので『DispatchQueue.main.async』を書く必要がないのかもしれないと今更ながらに思ったりもしました。
非同期の中で描画が遅い時に出すでもいいのかとも思いました、、、
参考: https://teratail.com/questions/52000
ちょっと悩みます汗
ModelもUIKitのインポート禁止〜!笑 https://github.com/sachiko-kame/architecture_iOS/blob/feature/MVP/sample/sample/Model.swift#L9
すみません!
これは私も実は『itemCount派』です。 どっちも良いと今英和辞書で調べてはっきりしたので『itemCount』に変更したいと思います!
そもそも
items.count
を返してるので、素直に同じ名前を使っていいと思いました笑
確かに!同じ名前の方がしっくりきますよね!
『アイテムを取得した』の中でアイテム取得の処理を書くというイメージの方がしっくりくる感じですかね?
すみません勘違いしました、、 これはViewから呼ばれているメソッドですね。 そしたら基本的にメソッドは動詞始まりがいいと思うので、
getItem()
がいいと思います!
英語構文的に i get item(SVO)ですもんね汗 修正します!
このあたりもclassにはすべて
final
を付けるクセを付けるといいと思います! https://github.com/sachiko-kame/architecture_iOS/blob/feature/MVP/sample/sample/Parts/Cell/TableViewCell.swift#L15継承したくなったら外せばいいので笑
ありがとうございます! そういって頂けるとfinalつけやすくなります。
入れざるを得なかったという感じでした汗 cell内のボタンタップ時に値を送りたくて、、、 modelの方で変えるように実装した方がいいですかね? すごく悩みます汗
@IBOutlet
や@IBAction
には基本private
を付けて、外部からのアクセスを防ぐと、UIが外から変更されないことが保証されます! https://github.com/sachiko-kame/architecture_iOS/blob/feature/MVP/sample/sample/Parts/Cell/TableViewCell.swift#L20-L22
ありがとうございます! 修正します!
ここでcellに分岐が入るのが気になります。 setRead() と setUnread() とセットのメソッドを2つ作って呼び分けると分岐をなくせます! https://github.com/sachiko-kame/architecture_iOS/blob/feature/MVP/sample/sample/Parts/Cell/TableViewCell.swift#L38
確かにそうですよね。viewの方で分岐する方が良いって感じですかね? viewでの分岐ではアイテムが『あり』『なし』で行っていたのでcellのセットならコードもそんなに多くないしとつい入れてしまいました。
そしたら基本的にメソッドは動詞始まりがいいと思うので、 getItem() がいいと思います!
すみません、
get○○()
はゲッターにしか付けたくないので、loadItem()
やfetchItem()
などのほうがいいですね〜
勉強になります! 変更します!✨
とりあえず以上です!
あとは単体テストを書いてみるのがいいと思います。 自分はアーキテクチャを「テストを書きやすくするため」にあると思っていて、「あ、ここテスト書きづらいな」と思ったら設計が悪いことが多く、設計の良し悪しに気づきやすくなります! Viewは手動でテストすることが多いので、まずPresenterからテストを書くのがオススメです〜
ありがとうございます! 色々試行錯誤しながら試して考え反映していきたいと思います! 本当にありがとうございました!!✨
DispatchQueue.main.async
はViewでやればいいと思います! https://github.com/sachiko-kame/architecture_iOS/blob/feature/MVP/sample/sample/Presenter.swift#L46viewの処理開始一番最初に書くか、実際に描画している所で書くかの違いなのですかね?
はい! 描画の直前に書くと、そのメソッドを呼ぶたびに書かなくて済むので👍 あとは好みかもしれませんが、描画しないPresenterにこの処理があると違和感を感じます。
非同期の後に処理が遅くなるということでここに入れているのかな?と思いました。
正直今回の場合描画が遅いとかはなさそうなので『DispatchQueue.main.async』を書く必要がないのかもしれないと今更ながらに思ったりもしました。
非同期の中で描画が遅い時に出すでもいいのかとも思いました、、、
いや、そもそもiOSはメインスレッドでしかUIを更新できないので、データを非同期で取得するなら必須です! 試しに外してデバックすると、紫のアイコンで警告が出ますよ〜
入れざるを得なかったという感じでした汗 cell内のボタンタップ時に値を送りたくて、、、 modelの方で変えるように実装した方がいいですかね? すごく悩みます汗
タップしたセルのインデックスをキーに、Qiitaのリストから取得するようにすれば持つ必要がなくなる気がします! 手を動かさないとわからないので、できなかったらすみません💦
ここでcellに分岐が入るのが気になります。 setRead() と setUnread() とセットのメソッドを2つ作って呼び分けると分岐をなくせます! https://github.com/sachiko-kame/architecture_iOS/blob/feature/MVP/sample/sample/Parts/Cell/TableViewCell.swift#L38
確かにそうですよね。viewの方で分岐する方が良いって感じですかね? viewでの分岐ではアイテムが『あり』『なし』で行っていたのでcellのセットならコードもそんなに多くないしとつい入れてしまいました。
分岐はできる限り親側(うまく言えない…呼び出し元側、ですかね)で行う派です〜 今回は呼び出し元がViewなのでテストしにくいですが、テストしやすくなることが多いので!
ウホーイが気になったところを書いていきます!