自分が学んだときに思った疑問
- いつ使うのか?
- そもそも拡張関数って、 なんで必要なの?
業務上で使うことがあり、「あ、そのときに使うのか」といったアハ体験的なことを感じたので、
その体験を言語化(アウトプット)をするために投稿しました。
ではでは、早速・・・
拡張関数って何?(なぜ、必要なのか?)
- 既存のクラス(String, Int, 自分が作ったクラス)に対して、関数を追加することができる
- クラスの継承する必要がない。
- 新たなクラスを作成する必要がない
いつ使うの?
- 標準クラスにない処理を作る場合
実装(コードで示すと・・・)
fun String.listSplitStr(): List<String>{
return this.split("").filter { it != "" }
}
fun main(){
val str = "アイウエオ"
println(str.listSplitStr()) //-> [ア, イ, ウ, エ, オ]
}
新しい関数としての処理は、
- String型の値を一文字ずつに分割する処理(処理自体は、競技プログラミングで使われているかも!?)
それで???(単純な関数にした方が楽ではないか?)
はい・・・・・。
実は、今回作った関数は、こうやって単純に新しい関数を作って行うことも可能なのです。
fun listSplitStr(str: String): List<String>{
return str.split("").filter { it != "" }
}
fun main(){
val str = "アイウエオ"
println(listSplitStr(str)) //-> [ア, イ, ウ, エ, オ]
}
しかし、これでは、
- 引数を必ず入れないといけない
- 単純な関数なので、変数名(中身: List型、Map型など).メソッド名で使うことができない
※ 3に関しては、思わない人もいると思う。ドット.
をつけられるだけだから
一回の処理、使われるクラスが少ない場合は良いが、何度も使用するとなると、使いやすさに問題が出てきそうな感じがする
拡張関数を使えば、ドット.
で書くこともできて、型が合えば、すぐにクラス関係なしに使うことができるので、利用しやすいと思えた。
何が「アハ体験」だったのか?
Kotlinの data class
を使った拡張をした時に、ドット .
で関数を呼ぶことができたことが、「アハ体験」でした。
今までは、拡張関数を使用せずにprivate関数を作ったりして、処理を作成していました。
data class Splitlist(
val str: String
)
private fun listsplit(splitlist: Splitlist): List<String> {
return splitlist.str.split("").filter { it != "" }
}
fun main(){
val str = Splitlist("アイウエオ")
println(listsplit(str))
}
しかし、拡張関数を利用することで、以下のような形にすることができます。
data class Splitlist(
val str: String
)
fun Splitlist.listsplit(): List<String> {
return this.str.split("").filter { it != "" }
}
fun main(){
val str = Splitlist("アイウエオ")
println(str.listsplit())
}
大きな違いはほとんどないですが、個人的には
- ドット
.
で処理を作成することができたのが、わかりやすい・見やすいと思えました。
まとめ
- 「学んだが、どこで使えば良いのかわからない」ことを一つ、わかるようになり良かったと思えました。
- 実際の開発では、他の人や規則(ユーティリティクラスなど)があるので、これが良いとは言えませんが、使える知識が一つ増えたことで、使い分けをすることができるようになったのは,良かったことではないかなと思っております。(自己満足!!!)