タプルはコンピュータ分野で特別な意味を持ち、この名前は少し馴染みが浅く聞こえるかもしれませんし、コードを書く際にはほとんど応用的なシナリオがありません。しかし驚くべきことに、タプルはプログラミングと密接に関連しており、リレーショナルデータベースにおける「レコード」の別の学術的名称が「タプル」であることを知らない学生もいるかもしれません。レコードはタプル、テーブルはリレーションシップ、レコードはテーブルで構成され、タプルはリレーションシップを生成します。これがリレーショナルデータベースの核心的な概念です。
タプルはリレーショナルデータベースの切り離せない一部ですが、プログラミングにおいて必ずしも不可欠なものではありません。 python、F#、haskell、scalaなど独自のタプル構文を持つプログラミング言語もあれば、Java、JavaScript、C++、C#などタプル構文を持たないものもあります。
タプルは配列やオブジェクトのように不可欠なプログラミング要素ではありませんが、特に関数が複数の値を返す必要がある場合に、コードを書く際に非常に便利です。 この場合、一般的な慣習はオブジェクトを定義し、関数が返すべき値をオブジェクトの属性として設定し、関数の返還値型をオブジェクトの型に設定することです。 あるいは、この関数に特定のデータが存在するマップデータ構造を返すことも可能です。 しかし、どちらの方法にも欠点があり、最初の方法は信頼性が高いものの、コードが異常に肥大化しています。 関数が複数の値を返せば要件自体は非常にシンプルですが、この方法は事前に型を定義し、それをインスタンス化し、インスタンスプロパティを設定し、最後に返す必要があり、効率があまりにも低くなります。 後者の方法は高速ですが十分に安全ではありません。関数内ではマップに保存される値はわかっていても、関数外ではこの関数の返り値がマップであることだけを知っています。マップにどの数値が格納されているか、どの型が不明かは複数人開発プロジェクトで知られていません。この欠点は特に明白で、残念ながらこの手法は一部の動的型付け言語で好まれており、これが動的型付け言語がセキュリティや可読性の低さを理由に批判される根本的な理由の一つでもあります。 したがって、この種の問題に対する最良の解決策はタプルを使うことです。
構文自体がタプルをサポートする言語では、(int, bool, string)は三重型で表され、その値は(1, true, "abc")となります。 各タプルタイプは一意であり、(int, bool)、(bool, int)、(string, double)はすべてバイナリですが、異なるタプルです。ここで特定のタプルを関数の返還値として取ると、前述のカスタム型を使った最初の解決策ほどの可読性やセキュリティ面では劣りますが、mapを使う2番目の解決策よりははるかに優れています。少なくともタプルを使うことで関数が返す値を知ることができます。 これらの値はどのような種類のものであり、mapを使って第二のスキームを簡潔かつ迅速にコーディングできる利点があります。
幸いなことに、これらのプログラミング言語は現在ジェネリック(言語)をサポートしており、組み込みでないタプルの実装は非常に簡単になりましたが、結局のところ、これは言語外の組み込み構文要素であり、ネイティブタプルほど使いやすくはありません。
以下では、Javatuplesと呼ばれるサードパーティ製のJavaタプルライブラリを紹介します。これは独自の公式ホームページと数百のGitHubスターを持ち、Javaタプル分野でほぼ独占的な地位を占めています。
Javatupleは最大長さが10のタプルを定義しますが、10タプルの要素数はすでに多すぎて、基本的に読みやすさがありません。 タプルクラスは次のように定義されます:
ユニット<A>(1要素)
ペア<A,B>(2要素)
三連<A、B、C>(3要素)
四重奏<A,B,C,D>(4要素)
五重奏<A、B、C、D、E>(5要素)
セクステット<A、B、C、D、E、F>(6要素)
セプテット<A、B、C、D、E、F、G>(7要素)
オクテット<A、B、C、D、E、F、G、H>(8要素)
エネアド<A,B,C,D,E,F,G,H,I>(9要素)
10<A,B,C,D,E,F,G,H,I,J>(10要素) これらのアーキタイプクラスは汎用クラスであるため、角括弧内の文字は任意のタイプに置き換えることができます。 以下は二進コードの例です
推論を描くことで、他のタプル型も同様に使用されます。
Javaのタプルは言語自体でサポートされていないため、コードはジャワ語のように見え、あまり洗練されていません。 しかし、コードを書く際には、書くことの利便性が効率を高めるだけでなく、コード自体が表現する意味、つまりタプル自体の意味(関数)を使ってコードを強化すること、そして書き方は実際には二次的なものに過ぎません。
最後に、一般的な角括弧内の型はJavaの基本型ではならないことに注意してください。基本型を使いたい場合は、ボックス化された基本型でなければなりません。例えば、int型は整数に変換し、bool型はブール型に対応します。 |