最近、TypeScriptを使うようになりました。
使うようになった理由は、以前サーバアプリをJavaScriptで作って懲りたというのがあります。
JavaScriptは個人的にとても便利で好きなスクリプト言語のひとつです。
だからこそ、サーバサイドのプログラムをnode.jsで作ると決まった時は、個人的にはかなり嬉しかったです。
しかしながら、これは個人的な意見になりますが、JavaScriptはWebサイトの小さなプログラミングを行うのには向いているが、規模の大きなサーバ開発にはあまり向いていません。
その理由を以下に書いてみたいと思います
- 変数の型がないのが、大規模開発では仇となる
JavaScriptに限らず、スクリプト言語の多くは、変数に型を宣言する必要がありません。
一旦変数を宣言すれば、その変数に数値だろうと文字列だろうとオブジェクトだろうと何でも自在に設定可能です。
それがスクリプト言語の良さであり、非常に便利なわけですが、大規模開発になると、一人で全てのプログラムを作成するということは稀で、大抵複数人で一つのシステムのプログラムを書くと言うことになります。
そうなった場合に、本来便利だったはずの型宣言なしが、逆に仇となってしまうのです。
例えば、ある人が作った関数を使いたい場合、JavaScriptだと型の定義がないので、変数に何を指定すればいいのかわからない時があります。
コメントに引数の詳細を記載すればいいというかもしれません。
しかし、引数がオブジェクトの場合、オブジェクトの全メンバをコメントに記載してくれないと、結局他の人は何を渡せばいいのかわからなくなり、自分でソースを解析する羽目になってしまいます。
(jQueryを使ったことがある人は、引数の巨大なオブジェクトにどういったメンバを指定すればいいか、関数のインターフェースを見ただけで分かった人はほぼいないんじゃないでしょうか?
大抵は、自分で関数のソースを追いかけるか、どこかのWebサイトで拾ってくるかになることでしょう)
こういう時、型がある言語の場合は、変数の型を宣言しておけば、型を定義しているモジュールにいけば、どういう情報を設定すればいいのか、すぐにわかって便利なのです。 - くだらない実行時エラーが多発する
JavaScriptに限らず、スクリプト言語がコンパイラ言語よりも便利なところは、いちいちコンパイルする必要がないところです。
ちょこちょこっとプログラムを書いて、すぐに実行できるところは、コンパイル型言語にはない利点と言えます。
しかし、大規模開発においては、これもまた仇となってしまいます。
人間はミスをする生き物なので、プログラムを書いている時、どうしてもミスコーディングが発生します。
コンパイラ言語の場合は、コンパイルである程度のミスを発見することが可能です。
例えば、変数を宣言しないで使用していた場合、コンパイラはコンパイル時にエラーを返してくれます。
しかしながら、JavaScriptはコンパイルがないので、コンパイル言語では本来コンパイル時点で判明するようなエラーも、プログラム実行時に検知することになります。
変数定義の確認に関しては、JavaScriptの場合でもESLintを使えばできますが、例えば数値を入れていた変数に文字列を入力すると言った属性のミスマッチエラーは検出できません。
(JavaScriptの場合は、変数に何でも設定できるのでエラーにする方がおかしいのですが、データ型のミスマッチはいろんなところでエラーを生み出す要因となるので、個人的には一つの変数に格納できるデータ型は一つにしたいところです。)
小さなプログラムの場合は、実行しながら修正するスタイルは、それほど苦になりません。
しかし、大規模開発になると、実行時エラーの多発は、苦行でしかありません。
(しかも機能的なエラー以前のエラーが多発する)
ましてや、他人が作った箇所で、くだらない実行時エラーが多発した日には、イライラもピークに達してしまうでしょう。 - JavaScriptのコードは巨大化するほど可読性が低下する傾向にある
これは、以前から言われていることですが、JavaScriptは多様な書き方が可能なため、開発者によって各コードの癖が顕著に現れる言語だと思います。
ただ、そのためもあってか、上級者のコードになるほど、何をやっているのか理解するのに時間がかかることが多いです。
まあ、私の技術不足と言われればそれまでなのですが・・・
そして、個人的に可読性が低いことの要因の一つが、1であげた変数の型がないだと思います
あとは、上級者ほど無意味にapply関数やcall関数を多用していたりするので、本当に難しいです。
以上のことは、TypeScriptを使えば、大抵解決することができます。
TypeScriptは変数にデータ型を指定することができます。
従って、関数の引数や戻り値といった厳密にデータ型を指定したい箇所に変数を定義することで、インターフェースを明確化することができます。
TypeScriptはクラスも作成できるので、よりわかりやすいコードを書くことができます。
また、TypeScriptはトランスパイルによってJavaScriptを生成しますが、この時にデータ型のチェックを行ってくれます。
例えば、string型で宣言した変数に数値を代入しようとしている場合は、トランスパイルでエラーが吐き出されます。
これにより、実行する前にエラーを検知できるようになるため、不具合修正の効率が格段に上がります。
そして、TypeScriptのようにデータ型を厳密にチェックすることで、少しは可読性も上がっていくと思います。
実は、筆者はTypeScriptという存在は知っていたのですが、最近までその詳細についてはあまり知りませんでした。
まあ、ぶっちゃけて言うと、俺はJavaScriptを書くからいらないって思ってたんですね。
もっと早くにTypeScriptを知っておけばよかった。
そうすれば、サーバ開発のメンテも、もう少し楽になったかもしれないのに・・・
別の開発案件では、私はTypeScriptを推しています。
恐らく採用されると思いますが、実際にTypeScriptで大規模開発を行ったら、また色々と見えてくるものがあるかもしれません。
その時にまた、TypeScriptに関する記事を改めて書いてみたいと思います。
コメント