Upload
ryota-murohoshi
View
859
Download
8
Embed Size (px)
Citation preview
普段C#使っている僕から見た、Kotlin
@RyotaMurohoshi
いやー、みなさんすばらしいLTでしたね
残念ながら、僕のLTは技術的な内容薄くなってます
過度な期待はしないで下さい
普段C#使っている僕から見た、Kotlin
おまえだれよ• 室星亮太
• Unityでモバイルゲーム開発
• 3年くらい前までAndroid開発
• C#(Unityだと、dynamicやasyncなどは使えない)
• 26歳、プログラマ4年目
C#が好きですもちろん、Kotlinも好きですよ
実はGroovyとかも好きです
この場にいる方は、• Kotlinに少しでも興味がある方
• Kotlinをこれから勉強してたいと思っている方
• Kotlinを使っていて流行らせたい方
だと思います。
Kotlinを使っていて流行らせたい方そして
Kotlin(勉強中で)仲間を増やしたい方
ちょっと聞いてください。
Scalaプログラマの方にKotlinをすすめると...
Kotlin公式、Comparison-to-Scala-より
Taking'this'into'account,'if'you'are'happy'with'Scala,'you'probably'do'not'need'Kotlin
h"p://kotlinlang.org/docs/reference/comparison6to6scala.html
Scalaプログラマの方には、やはりScalaで満足?
僕の主張
Kotlinを流行らせたい方、C#プログラマの人に勧めるのいいのでは!
C#が大好きなC#プログラマ、だけど仕事でJVM言語を使う必要がある方(C#に割と近い機能を持つ)Kotlinでプロダクトを作りながら
C#6.0で加わったり・今後加わりそうな機能を試すの、
いいと思うんですよ!
(あくまで僕の妄想ですが...)
C#プログラマが、Javaで何か書く必要が出てきたとして...
「あの機能がない」「C#だとできるのに...」ってなりそう(あくまで僕の妄想です)
あくまで僕の妄想です
例を挙げます
C#とKotlinにはあるけれどJavaになくてつらい機能
個人的に第1位
例その1"名前付き引数メソッド呼び出しが超読みやすくなる
例えばこんなメソッドがあったとてfun reformat( str: String, normalizeCase: Boolean, upperCaseFirstLetter: Boolean, divideByCamelHumps: Boolean, wordSeparator: Character) {(略)}
呼び出し側はこんな感じreformat(str, true, true, false, '_')
なるほど、わからん。実装を見ないと。IDEだったら実装側にジャンプすればいいけれど
githubとかでこういうののリビューだるい
呼び出し側で名前付き引数を使うと!reformat( str, normalizeCase = true, uppercaseFirstLetter = true, divideByCamelHumps = false, wordSeparator = '_')
どの引数がどのような意味なのか、すんなり読める!
名前付き引数はデフォルト引数(C#のオプショナル引数)
と組み合わせるとさらに強力!
派手さはないけど、使えるところ多くて便利
例その2"拡張メソッド(拡張関数)クラスにメソッドを追加したい、継承せずに
例えば...
java.u&li.Collec&onにisNotEmptyメソッドを追加したい
(要素が存在すればtrueを、空ならfalseを返すメソッド)
実はKotlinでは、拡張関数でこれが標準で追加さていれる
h"ps://github.com/JetBrains/kotlin/blob/build90.12.1525/libraries/stdlib/src/kotlin/collec>ons/JU>l.kt@より
package kotlin
import java.util.*
(前略)
/** Returns true if the collection is not empty */public fun <T> Collection<T>.isNotEmpty(): Boolean = !isEmpty()
(後略)
雑な解説• 名前空間の下に関数が定義できる
• 拡張関数で関数の追加
• 単一式関数
h"ps://github.com/JetBrains/kotlin/blob/build90.12.1525/libraries/stdlib/src/kotlin/collec>ons/JU>l.kt@より
package kotlin
import java.util.*
(前略)
/** Returns true if the collection is not empty */public fun <T> Collection<T>.isNotEmpty(): Boolean = !isEmpty()
(後略)
C#から見たさっきの例• 文法や定義できる場所は違うけどクラスに関数を追加できる
• C#6.0のexpression/bodiedみたいに式形式で関数を書ける
C##6.0だけでなく、更にその先
拡張プロパティ/** * Returns the index of the last item in the list or -1 if the list is empty * * @sample test.collections.ListSpecificTest.lastIndex */public val <T> List<T>.lastIndex: Int get() = this.size() - 1
thisが無くても拡張関数(プロパティ)が呼べる Test fun lastIndex() { assertEquals(-1, empty.lastIndex) assertEquals(1, data.lastIndex) }
C#7.0で入るかどうか分からないけれどディスカッションされているもの、Kotlinではもすでに使える!!!
普段C#使っている僕から見た、Kotlin
Kotlin、C#にわりと近い気がするの
Kotlin仲間増やすならScalaバリバリの人を勧誘されるよりも
JVM言語をやる必要になったC#バリバリの方勧誘されてはどうでしょう?
そして未来のC#は、Kotlinと似ている部分が増える気がする
まとめ
C#erな僕は、Kotlinがすきです
蛇足
C#とかGroovyとか勉強していて
deprecateになっている機能・文法・クラスがあったり
歴史的な経緯で変えられないものが多いのがちょいつらい
Kotlinはそれらの失敗から学んだり、破壊的な変更ができたりする
のかな(?)
kotlinパッケージのメソッドのソース読むの面白い
Kotlinの文法の復習になると思うの
懇親会で
仕事では使わないかもしれない「言語」を学ぶ事と、仕事での「実用」について
お話しさせてもらえると嬉しいです