2014年11月27日木曜日

swiftの変数は、積極的に型宣言してます

swiftの変数宣言には、型推論の機能が備わっています。代入する初期値の型により、自動的に変数の型が決められる機能です。これを利用すると、変数宣言のときに、型宣言を付ける必要性が大きく減ります。ソースコードを少しでも短く簡潔に書きたい人には、喜ばれる機能だと思います。

しかし、私は、できるだけ型宣言を付ける方針でコーディングしています。StringやIntのように基本的な型なら省略することもありますが、それ以外の型では、可能な限り型宣言を付けています。その理由を、少し書きます。

 

変数宣言で型も一緒に宣言するのは、iOSのAPIに含まれる様々な型を明示するためです。私の場合は、よく使う機能を独自ライブラリの形で作るので、細かなAPIを覚えることがほとんどありません。もちろん作るときには、おそらく他の人よりも詳しく、ウェブ上のAPI資料を見ます。でも、ライブラリとして作り終わると、ライブラリ内の関数またはメソッドを呼び出すだけなので、個々のAPIの処理内容はすぐに忘れてしまいます。覚える気も最初からありません。だからこそ、忘れても構わないように、後から思い出しやすい形でコーディングしているわけです。

APIに含まれる型を変数宣言に入れると、変数の型で検索しやすくなります。そのため、後で機能を拡張したい時や、バグが発生したときに調べやすくなります。完全に忘れてしまっても大丈夫です。

 

加えて、複数のメソッドを連続して書くのではなく、途中に一時的な変数を挿入するようにもしています。その変数はletで宣言し、変数の型も宣言に含めます。型を指定して途中に変数を使うと、自分が正しく理解しながらコーディングしているかの確認にもなります。swiftは型チェックが厳しい言語なので、間違っているとコンパイラーがエラーを知らせてくれるからです。

APIの中身に詳しくないまま自動変換を使っていると、コンパイルエラーが消えないとか、コンパイルは通ったものの、実行させると正常に動作しないといった状況が生じることもあります。原因を探るために、途中に変数を入れたりするでしょう。

ところが、最初から途中で変数を使い、しかも型宣言までしていると、その変数が何の型なのかは明白です。たいていは実行前にコンパイルエラーとなり、自分の理解が間違っていることを知ることができます。API資料を見直して、正しく理解する作業に移れます。無駄な実行や、遠回りのデバッグを大きく減らせる手段でもあるのです。

最近のコンパイラーは最適化の機能が凄いので、途中に変数を入れても遅くなりません。もし遅くなったとしても、通常の動作に影響するほどは遅くなりません。安心して、途中に変数を入れています。

当たり前のことですが、変数の型が正しいだけでは、処理内容をきちんと理解していることにはなりません。でも、変数の型すら間違っているなら、正しい理解の最低限もクリアーしていないことを意味します。変数の型が正しいのか確認することは、最低限をクリアーしていることの確認でもあります。

途中に変数を入れる目的は、もう1つあります。将来、自分以外の開発者がアプリをメンテする可能性を考慮しての判断です。メンテできる開発者を少しでも増やすには、処理内容が理解しやすいコーディングが欠かせません。途中に変数を入れて、その型を明示することで、APIの内容を解析しやすく仕上げられます。メンテする必要が生じたとき、優秀な開発者を確保できるとは限りませんから。

 

iOSのAPIには、中身は同じなのに型が違うものが数多くあります。StirngとNSString、FloatとCGFloatなどは分かりやすい例でしょう。これらの型は、同じように見えても、使えるメソッドなどが違っています。NSStringにはdoubleValueメソッドがあり、Doubleに変換するのが便利といった具合に。違いを知って、上手に使い分ける必要があります。

これらとは違って、中身が分かりにくい型もあります。NSTimeIntervalの中身がDoubleというのはAPI資料を見ないと知り得ません。きちんと理解してコーディングするためには、NSTimeIntervalの中身がDoubleと知っておくのがベストです。中身の型が違っていると、自動的に変換してくれなかったり、変数の種類による精度の違いからバグが生じたりもします。

余計なトラブルを事前に避けるためには、中身の型を意識しながらコーディングし、中身の型ができるだけ見えるような形で途中の変数を使います。この場合、途中の変数が基本的な型であっても、変数宣言の中に、あえて型宣言を入れます。または、明示的にキャストを使ったりもします。

 

私の勝手な推測ですが、swiftの開発者は、厳密な型宣言や型チェックを重視したかったのではないでしょうか。Optionalなんかも、その一環と思えます。でも、それだけだと、ものぐさな開発者(失礼)に見向きもされないため、仕方なく型推論の機能を付けたのではないかと。それは現実的な解であり、選択肢が多いほうが良いだけに、何の文句もありません。

私のように、どんなに注意深く実行しても人間はミスすると思っている人は、可能な限り多くのことをコンパイラーに頼ります。変数の型を積極的に宣言するコーディング方法は、そのための一番の方法だと考えています。実際に何度も、実行前にミスを見付けてもらっています。今後も、変数宣言に型を入れ続けるでしょう。

 

私の開発スタンスは、APIの細かな名前などは基本的に覚えない(もちろん大まかな仕組みは理解しておく)、忘れても思い出せるようにコーディングするというものです。それを実現するためのコーディングとして、途中で挿入する変数を増やし、その変数宣言で型を明示するようにしています。

このようなスタンスは、覚えるのが苦手な人にも適していると思います。自分に向いているスタンスだと感じた方は、swiftでも積極的に型宣言しましょう。

0 件のコメント:

コメントを投稿