Comments (70)
継承されていないクラスには何も考えずに final
を付けたい
https://github.com/sachiko-kame/architecture_iOS/blob/feature/MVP/sample/sample/ViewController.swift#L11
from architecture_ios.
面白くもありつい笑ってました!✨
from architecture_ios.
@sachiko-kame
こんな感じの内容が続きますが、大丈夫でしょうか…?一旦休憩で、続きは後ほど見ます!
はい!とても助かります!
ありがとうございます!!✨
from architecture_ios.
です!
あとちょっとコメント編集しましたー
はい!!実は変更後すぐにみて確かに!となっていました。
ありがとうございます!🙇♀️
from architecture_ios.
現時点で指摘頂けたところ修正しました!
本当にありがとうございます!勉強になります!🙇♀️
from architecture_ios.
レビューがとても分かりやすかったのが大きかったかと思います!
自分であやふやだったり悩んでいたことなどもuhooiさんのおかげで解消できたので本当に助かりました!✨
本当にありがとうございます!🙇♀️✨
from architecture_ios.
自分はViewに単体テストを書きたくなく、できる限りViewに分岐(if, switch)を入れたくないので、
presenter.itemGet()
メソッドの戻り値はオプショナル型じゃない方がいいです!
https://github.com/sachiko-kame/architecture_iOS/blob/feature/MVP/sample/sample/ViewController.swift#L59分岐はPresenter側のメソッドに入れて、あとTableViewのデータソースで取得するのではなく、
viewDidLoad()
などで予め取得するといいと思います!
データソース以外の取得方法がそもそもわかっていなかったので考えます!
from architecture_ios.
変数名で、
numberOfItems
より普通にitemCount
でいいと思いました笑
https://github.com/sachiko-kame/architecture_iOS/blob/feature/MVP/sample/sample/Presenter.swift#L12
そこまで配慮できていなかったです!汗
ありがとうございます!
以後気をつけます!
from architecture_ios.
変数名で、
numberOfItems
より普通にitemCount
でいいと思いました笑
https://github.com/sachiko-kame/architecture_iOS/blob/feature/MVP/sample/sample/Presenter.swift#L12
これは私も実は『itemCount派』です。
どっちも良いと今英和辞書で調べてはっきりしたので『itemCount』に変更したいと思います!
ちなみに、
『number』の方がいいのか調べて
『number』は『数』とでるのに対して、『Count』は『数える』で出てきたので『number』の方がいいのかな?と『numberOfItems』にしてしまいました汗
from architecture_ios.
ModelもUIKitのインポート禁止〜!笑
https://github.com/sachiko-kame/architecture_iOS/blob/feature/MVP/sample/sample/Model.swift#L9
すみません!
from architecture_ios.
これは私も実は『itemCount派』です。
どっちも良いと今英和辞書で調べてはっきりしたので『itemCount』に変更したいと思います!そもそも
items.count
を返してるので、素直に同じ名前を使っていいと思いました笑
確かに!同じ名前の方がしっくりきますよね!
from architecture_ios.
『アイテムを取得した』の中でアイテム取得の処理を書くというイメージの方がしっくりくる感じですかね?
すみません勘違いしました、、
これはViewから呼ばれているメソッドですね。
そしたら基本的にメソッドは動詞始まりがいいと思うので、getItem()
がいいと思います!
英語構文的に
i get item(SVO)ですもんね汗
修正します!
from architecture_ios.
このあたりもclassにはすべて
final
を付けるクセを付けるといいと思います!
https://github.com/sachiko-kame/architecture_iOS/blob/feature/MVP/sample/sample/Parts/Cell/TableViewCell.swift#L15継承したくなったら外せばいいので笑
ありがとうございます!
そういって頂けるとfinalつけやすくなります。
from architecture_ios.
@IBOutlet
や@IBAction
には基本private
を付けて、外部からのアクセスを防ぐと、UIが外から変更されないことが保証されます!
https://github.com/sachiko-kame/architecture_iOS/blob/feature/MVP/sample/sample/Parts/Cell/TableViewCell.swift#L20-L22
ありがとうございます!
修正します!
from architecture_ios.
そしたら基本的にメソッドは動詞始まりがいいと思うので、 getItem() がいいと思います!
すみません、
get○○()
はゲッターにしか付けたくないので、loadItem()
やfetchItem()
などのほうがいいですね〜
勉強になります!
変更します!✨
from architecture_ios.
とりあえず以上です!
あとは単体テストを書いてみるのがいいと思います。
自分はアーキテクチャを「テストを書きやすくするため」にあると思っていて、「あ、ここテスト書きづらいな」と思ったら設計が悪いことが多く、設計の良し悪しに気づきやすくなります!
Viewは手動でテストすることが多いので、まずPresenterからテストを書くのがオススメです〜
ありがとうございます!
色々試行錯誤しながら試して考え反映していきたいと思います!
本当にありがとうございました!!✨
from architecture_ios.
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を更新できないので、データを非同期で取得するなら必須です!
試しに外してデバックすると、紫のアイコンで警告が出ますよ〜
確かに処理2回も書くのナンセンスですよね!
具体的に教えて頂いたのでとてもスッキリしました!
ありがとうございます!
from architecture_ios.
正直テストがあるだけで、「少なくともテストが書きやすい設計になってるんだな」とわかるので、それだけでも書くべきです!
逆にテストを書かずに良い設計で実装できる人すごいと思います…
そうですよね、お恥ずかしながらテスト自体をしっかり理解していないので勉強します!
すぐには出来ませんがより良いコードを書けるようになるために頑張っていきたいと思います!
なかなかこんなに丁寧に指摘して頂けることはなかったので本当に感謝です!
自分は凄い優しい方に恵まれたなと強く感じました!
本当にありがとうございました!
また修正確認後コミットしたいと思います!✨
from architecture_ios.
ありがとうございます!!✨
from architecture_ios.
超ウホーイの好みにリファクタリングしてみました笑https://github.com/uhooi/architecture_iOS/tree/feature/fix_mvp/sample/sample
diffが出過ぎると思うので、Xcodeを2つ起動してソースを見比べるといいかもしれませんw
あくまで参考で、間違っていることもあると思うので鵜呑みにしないでください〜
ありがとうございます!!🙇♀️
色々見比べたりして勉強させていただきたいともいます!!
from architecture_ios.
気になったらここでもTwitterでもどこでもいいので、何でも聞いてください〜✨
嬉しいです!
設計強い方が側にいるの心強いです!!
本当にありがとうございます!✨✨✨✨✨
from architecture_ios.
強いと思います!
理由がはっきりしているので通用すると思っています。
難しいとすぐ簡単な方に逃げてしまう私とは大違いで反省しています!
ウホーイさんを見習って勉強に励んでいきたいと思います!!✨
from architecture_ios.
あ、
setRead()
はget○○()
と同様の理由でよくないです!
read
というプロパティにセットするセッターに見えるので、setupForRead()
のようにするといいです!
ありがとうございます!
修正します!✨
ありがとうございますw
簡単な方に逃げる考えは間違っていないと思います!
逃げ方ですよねw
ありがとうございます!
うまく出来るよう試行錯誤重ねていきたいと思います!✨
from architecture_ios.
あと
if isRead == true {}
はif isRead {}
のように書くのが好みです。
前者はisRead
がBool?
型の場合に使うと、オプショナルかどうかがすぐにわかって可読性が上がります!
(Bool?
型はif isRead {}
と書くとビルドエラーになる)
確かにです!!
そう言った見方までできていなかったので非常にためになります!
ありがとうございます!✨
from architecture_ios.
『ウホーイが気になったところを書いていきます!』
がとてもチャーミングで素敵です!
修正します!
from architecture_ios.
チャーミング頂き光栄です✨
from architecture_ios.
変更しないプロパティは var
でなく let
にしましょう!
https://github.com/sachiko-kame/architecture_iOS/blob/feature/MVP/sample/sample/ViewController.swift#L13
from architecture_ios.
ついでにUI部品はできる限りInitialization Closureを使って初期化したい(これは好み)
private let tableView: UITableView = {
let tableView = UITableView()
tableView.frame = UIScreen.main.bounds
tableView.register(cellType: TableViewCell.self)
return tableView
}()
from architecture_ios.
変更しないプロパティは
var
でなくlet
にしましょう!
https://github.com/sachiko-kame/architecture_iOS/blob/feature/MVP/sample/sample/ViewController.swift#L13
はい!
すみません。
気をつけます!
修正します!
from architecture_ios.
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)
}
from architecture_ios.
@sachiko-kame
こんな感じの内容が続きますが、大丈夫でしょうか…?
一旦休憩で、続きは後ほど見ます!
from architecture_ios.
ついでにUI部品はできる限りInitialization Closureを使って初期化したい(これは好み)
private let tableView: UITableView = { let tableView = UITableView() tableView.frame = UIScreen.main.bounds tableView.register(cellType: TableViewCell.self) return tableView }()
(これは好み)ってくれていますが結構こっちの方が好まれる印象です。
なかなかなれなくてこの書き方いつもできていないです。
修正します!
from architecture_ios.
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) }
確かに!おっしゃる通りです!
沢山ありがとうございます!
修正します!
from architecture_ios.
Initialization Closureを使うと、例えばTableViewをCollectionViewに変えたくなったときに、そこだけ変えればいいのでわかりやすいです!
あとメソッド化されないので、初期化処理が一度しか呼ばれないことが保証できます。
(普通はやらないですが、 setup()
メソッドを2回呼ぶことも理論上はできてしまうので)
from architecture_ios.
Initialization Closureを使うと、例えば�TableViewをCollectionViewに変えたくなったときに、そこだけ変えればいいのでわかりやすいです!
あとメソッド化されないので、一度しか呼ばれないことが保証できます。
確かに!利点の方が大きいですね!
ありがとうございます!
from architecture_ios.
です!
あとちょっとコメント編集しましたー
from architecture_ios.
すぐに対応していただけると、こちらもレビューしたかいがあって嬉しいです✨
from architecture_ios.
自分はViewに単体テストを書きたくなく、できる限りViewに分岐(if, switch)を入れたくないので、 presenter.itemGet()
メソッドの戻り値はオプショナル型じゃない方がいいです!
https://github.com/sachiko-kame/architecture_iOS/blob/feature/MVP/sample/sample/ViewController.swift#L59
分岐はPresenter側のメソッドに入れて、あとTableViewのデータソースで取得するのではなく、 viewDidLoad()
などで予め取得するといいと思います!
from architecture_ios.
MVPだったらView以外で import UIKit
するのはよくないです。
import Foundation
で済ませましょう!
https://github.com/sachiko-kame/architecture_iOS/blob/feature/MVP/sample/sample/Presenter.swift#L9
from architecture_ios.
変数名で、 numberOfItems
より普通に itemCount
でいいと思いました笑
https://github.com/sachiko-kame/architecture_iOS/blob/feature/MVP/sample/sample/Presenter.swift#L12
from architecture_ios.
個人的には itemGet()
でなく itemGeted()
だとアイテムをゲットした後の処理だとわかって好みです!
https://github.com/sachiko-kame/architecture_iOS/blob/feature/MVP/sample/sample/Presenter.swift#L43
from architecture_ios.
DispatchQueue.main.async
はViewでやればいいと思います!
https://github.com/sachiko-kame/architecture_iOS/blob/feature/MVP/sample/sample/Presenter.swift#L46
from architecture_ios.
ModelもUIKitのインポート禁止〜!笑
https://github.com/sachiko-kame/architecture_iOS/blob/feature/MVP/sample/sample/Model.swift#L9
from architecture_ios.
個人的には
itemGet()
でなくitemGeted()
だとアイテムをゲットした後の処理だとわかって好みです!
https://github.com/sachiko-kame/architecture_iOS/blob/feature/MVP/sample/sample/Presenter.swift#L43
確かに!私はゲットしにいくって感じでとらえてしましました!
『アイテムを取得した』の中でアイテム取得の処理を書くというイメージの方がしっくりくる感じですかね?
好み
の問題と言ってくれているので少し悩みたいと思います!
from architecture_ios.
これは私も実は『itemCount派』です。
どっちも良いと今英和辞書で調べてはっきりしたので『itemCount』に変更したいと思います!
そもそも items.count
を返してるので、素直に同じ名前を使っていいと思いました笑
from architecture_ios.
『アイテムを取得した』の中でアイテム取得の処理を書くというイメージの方がしっくりくる感じですかね?
すみません勘違いしました、、
これはViewから呼ばれているメソッドですね。
そしたら基本的にメソッドは動詞始まりがいいと思うので、 getItem()
がいいと思います!
from architecture_ios.
このあたりもclassにはすべて final
を付けるクセを付けるといいと思います!
https://github.com/sachiko-kame/architecture_iOS/blob/feature/MVP/sample/sample/Parts/Cell/TableViewCell.swift#L15
継承したくなったら外せばいいので笑
from architecture_ios.
好みかもしれませんが、cellにqiitaを持たせる必要はないと思います!
https://github.com/sachiko-kame/architecture_iOS/blob/feature/MVP/sample/sample/Parts/Cell/TableViewCell.swift#L17
from architecture_ios.
@IBOutlet
や @IBAction
には基本 private
を付けて、外部からのアクセスを防ぐと、UIが外から変更されないことが保証されます!
https://github.com/sachiko-kame/architecture_iOS/blob/feature/MVP/sample/sample/Parts/Cell/TableViewCell.swift#L20-L22
from architecture_ios.
ここでcellに分岐が入るのが気になります。
setRead()
と setUnread()
とセットのメソッドを2つ作って呼び分けると分岐をなくせます!
https://github.com/sachiko-kame/architecture_iOS/blob/feature/MVP/sample/sample/Parts/Cell/TableViewCell.swift#L38
from architecture_ios.
とりあえず以上です!
あとは単体テストを書いてみるのがいいと思います。
自分はアーキテクチャを「テストを書きやすくするため」にあると思っていて、「あ、ここテスト書きづらいな」と思ったら設計が悪いことが多く、設計の良し悪しに気づきやすくなります!
Viewは手動でテストすることが多いので、まずPresenterからテストを書くのがオススメです〜
from architecture_ios.
そしたら基本的にメソッドは動詞始まりがいいと思うので、 getItem() がいいと思います!
すみません、 get○○()
はゲッターにしか付けたくないので、 loadItem()
や fetchItem()
などのほうがいいですね〜
from architecture_ios.
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
ちょっと悩みます汗
from architecture_ios.
入れざるを得なかったという感じでした汗
cell内のボタンタップ時に値を送りたくて、、、
modelの方で変えるように実装した方がいいですかね?
すごく悩みます汗
from architecture_ios.
ここでcellに分岐が入るのが気になります。
setRead() と setUnread() とセットのメソッドを2つ作って呼び分けると分岐をなくせます!
https://github.com/sachiko-kame/architecture_iOS/blob/feature/MVP/sample/sample/Parts/Cell/TableViewCell.swift#L38
確かにそうですよね。viewの方で分岐する方が良いって感じですかね?
viewでの分岐ではアイテムが『あり』『なし』で行っていたのでcellのセットならコードもそんなに多くないしとつい入れてしまいました。
from architecture_ios.
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を更新できないので、データを非同期で取得するなら必須です!
試しに外してデバックすると、紫のアイコンで警告が出ますよ〜
from architecture_ios.
入れざるを得なかったという感じでした汗
cell内のボタンタップ時に値を送りたくて、、、
modelの方で変えるように実装した方がいいですかね?
すごく悩みます汗
タップしたセルのインデックスをキーに、Qiitaのリストから取得するようにすれば持つ必要がなくなる気がします!
手を動かさないとわからないので、できなかったらすみません💦
from architecture_ios.
ここで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なのでテストしにくいですが、テストしやすくなることが多いので!
from architecture_ios.
正直テストがあるだけで、「少なくともテストが書きやすい設計になってるんだな」とわかるので、それだけでも書くべきです!
逆にテストを書かずに良い設計で実装できる人すごいと思います…
from architecture_ios.
入れざるを得なかったという感じでした汗
cell内のボタンタップ時に値を送りたくて、、、
modelの方で変えるように実装した方がいいですかね?
すごく悩みます汗タップしたセルのインデックスをキーに、Qiitaのリストから取得するようにすれば持つ必要がなくなる気がします!
手を動かさないとわからないので、できなかったらすみません💦
cell内では今の所自分の力ではわからなかったのでmodel内で値変更を行うようにしました!
cellのボタンタップ → modelのisReadボタンを逆にして登録
という感じです。
from architecture_ios.
ここで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なのでテストしにくいですが、テストしやすくなることが多いので!
ありがとうございます!
具体的に『〇〇だから〇〇が良い』と言ってもらえると納得します!
修正します!
指摘されて書いて見たら案外スッキリして、あ、今までの自分は簡単な方にと怠惰だっただけだったことがわかりました。
from architecture_ios.
なんか楽しくなってきたので、自分でも手元でリファクタリングしてますー笑
ただ完全に自分の好みで失礼なレベルでガンガン書き換えているので、PR出すか迷います…
from architecture_ios.
なんか楽しくなってきたので、自分でも手元でリファクタリングしてますー笑
そう言ってもらえると嬉しいです!時間を奪っちゃっているような気がして感謝と一緒に罪悪感もあったので、、
ただ完全に自分の好みで失礼なレベルでガンガン書き換えているので、PR出すか迷います…
意見を聞けるのなら聞きたい願望です。なのでもしよければお願いしたいです!!
from architecture_ios.
自分が勝手にやってるので罪悪感は持たないでくださいw
そしたら完成したら上げますね!
from architecture_ios.
超ウホーイの好みにリファクタリングしてみました笑https://github.com/uhooi/architecture_iOS/tree/feature/fix_mvp/sample/sample
diffが出過ぎると思うので、Xcodeを2つ起動してソースを見比べるといいかもしれませんw
あくまで参考で、間違っていることもあると思うので鵜呑みにしないでください〜
from architecture_ios.
気になったらここでもTwitterでもどこでもいいので、何でも聞いてください〜✨
from architecture_ios.
設計強いかはわかりません笑
実はそんなに実務経験がないので、他で通用するのかわかんないんですよね…
from architecture_ios.
ありがとうございますw
簡単な方に逃げる考えは間違っていないと思います!
逃げ方ですよねw
from architecture_ios.
あ、 setRead()
は get○○()
と同様の理由でよくないです!
read
というプロパティにセットするセッターに見えるので、 setupForRead()
のようにするといいです!
from architecture_ios.
あと if isRead == true {}
は if isRead {}
のように書くのが好みです。
前者は isRead
が Bool?
型の場合に使うと、オプショナルかどうかがすぐにわかって可読性が上がります!
( Bool?
型は if isRead {}
と書くとビルドエラーになる)
from architecture_ios.
Related Issues (2)
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from architecture_ios.