2017-12-25 15 views
2

コミュニティに質問があります。 私は今すぐKotlinを学び、関数から複数の値を一度に返すことができるときに、構造化宣言という概念を見つけました。非常に便利だと思われますが、同時にそれは難題です。私がJavaのその機能について考えるとき、私はそれが私のアーキテクチャの穴であることを理解しています。おそらくクラスだけでなく、いくつかの変数があるはずです。皆さんはどう思いますか?Kotlinにおける宣言の構造解除のポイントは何ですか?

+0

関数から2つのものを返すのは、コーナーユースケースの1つのみです。機能自体はより多くの状況で使用されており、有用で維持可能であることが証明されています。 – voddan

+2

"そこにはクラスがあるはずです" - あなたが持っているものがすべてハンマーであるなら、すべてがc-l-a-s-s-e-s- nailsのように見えます。別の言語 - 異なるイディオム。また、@ voddanが言ったこと。 –

+0

破壊宣言にはKotlinのクラスが必要です。私はそれの主な目的は、複数の戻り値の代わりに単純さを提供することだと思います。ほとんどのユースケースは、[official doc](https://kotlinlang.org/docs/reference/multi-declarations.html)で実演されています。 – BakaWaii

答えて

5

このコンセプトでは、主なプロパティのいくつかを明確に識別するクラスを持つことができます。のコンポーネントは、です。

これらのコンポーネントにアクセスするには、プロパティにアクセスする際の構文上の騒音がないように、構造解除宣言を使用します。

val (x, y) = clickEvent.getPointOnScreen() 

基本的には、シンタックスシュガーのこの種を使用する必要はありません、とコンセプト:タイプはcomponent1component2だけを持っていると仮定して、

val point = clickEvent.getPointOnScreen() 
val x = point.xCoordinate 
val y = point.yCoordinate 
// Use `x` and `y` in some calculations 

と:

を比較しますそれ自体は抽象化を害するものではなく、インスタンス自体を必要としない場合、クラスインスタンスのプロパティにアクセスする便利な方法を提供するだけの場合もあります。

for ((key, value) in myMap) { /* ... */ } 

まだ(key, value)非構造背後Map.Entry<K, V>あります、そして、あなたはfor (entry in myMap) ...でそれを置き換えることができますが、通常はそれはあなたが必要とする2つのプロパティをです:

別の例は、例えば、マップエントリと協力しています。これは、非構造化ノイズからあなたを保護します。

+0

あなたのオブジェクトの2つの変数xCoordinateとyCoordinateを交換することによってリファクタリングする場合、慎重に使用してください - > component1とcomponent2が切り替わります - > '' 'val(x、y)' ''は実際には '' val (y、x) '' 'ここにバグがあります。 –

+0

ctrl + f6またはcmd + f6リファクタリングツールを使用すると、これが正しく処理されます。 –

関連する問題