はじめに
Twitterで気になったツイートを引用RTしたら、リプでいろいろ意見を頂きました。
非常に興味深かったので、まとめてみることにします。
updateAge(_ age: Int) vs update(age: Int)
updateAge(_ age: Int)
と update(age: Int)
メソッド、どちらの名前のほうがいいと思いますか?
少しだけ考えてみてください。
正解は…
.
.
.
.
.
.
.
.
.
.
メソッドの処理によって異なる だと思います。
updateAge(_ age: Int)
updateAge(_ age: Int)
というメソッドを見て、どのような処理を想像するでしょうか?
私は「 年齢のプロパティを更新する 」ことを想像しました。
コードに落とし込むとこんな感じです。
final class FooCollectionViewCell: UICollectionViewCell {
private var age: Int = 0
func updateAge(_ age: Int) {
self.age = age
}
}
呼び出しはこのようになります。
cell.updateAge(31) // `cell.age` が `31` に更新される
同じ処理を想像した人が多いと思っています。
余談ですがSwiftは引数にラベルを付けることができるので、 updateAge(_ age: Int)
より updateAge(to age: Int)
のほうが英語で意味が読み下せて、より処理を想像しやすくなります。
cell.updateAge(to: 31) // 「update age to 31」で意味が通る
ただ今回のようにプロパティにセットするだけなら setAge(_ age: Int)
が最も処理を想像しやすいと思います。
cell.setAge(31) // ほとんどの人が `age` というプロパティに値をセットするとわかると思う
update(age: Int)
続いて update(age: Int)
です。
updateAge(to age: Int)
よりも短く、意味も同じように捉えられそうですが、どうでしょうか。
実はよく考えると意味が異なることに気づきます。
先に呼び出し側のコードから見てみましょう。
cell.update(age: 31)
age
はセルを更新するために使う要素のひとつに過ぎず「 年齢を使ってセルを更新する 」ことが想像できると思います。
コードに落とし込むとこんな感じです。
final class FooCollectionViewCell: UICollectionViewCell {
@IBOutlet private weak var birthYearLabel: UILabel!
func update(age: Int) {
birthYearLabel.text = convertAgetoBirthYearString(31)
}
private func convertAgetoBirthYearString(_ age: Int) -> String {
// ...
}
}
あくまで例ですが、 age
というプロパティを持たず、年齢から生まれた年を算出してラベルに表示する、というような処理が想像できます。
余談ですが、私はセルを初期化するメソッドは setup()
という名前にしています。
cell.setup(age: 31)
どこかで見たのをマネしたと思うのですが、どこで見たかは覚えていません。
おわりに
他にも「 updateAge(_ age: Int)
はObjective-C感がある」「API Design Guidelinesに従っていればこだわらない」などの意見がありました。
他にも意見があればコメントなどで教えていただけると嬉しいです