動的型付言語と静的型付言語

Posted by user on Sunday, May 12, 2019

TOC

背景

今までJavaの開発が多く、Javaは静的型付言語であった。最近Railsの開発に携わっており、静的型付言語と動的型付言語の違いを実感することがあったため雑ですが今思うことを以下に備忘メモとして残しました。

静的と動的型付言語の違い

Rubyは動的型付言語であり、開発時にカルチャーショックを受けることが多い。

簡単な書き方であれば困ることはあまりないが、メタプログラミング要素を含む書き方になると調査難易度が格段に上がる。

現場で感じた動的型付言語のメリット・デメリットは以下の通り。

大規模になればなるほどメリデメは顕著に現れるように思える。現に現在参画している案件は大規模のため、以下の特徴を強く感じている。

静的型付言語のメリット

  • (慣れると)開発生産性(メンテナンス性含む)は高い

静的型付言語のデメリット

  • 慣れない間は遅い
  • Ruby初学者
    • 可読性が低い
    • 静的コードチェックができないため、メソッド呼び出し可否が不明確
  • プロジェクト新規参入者の学習コストがかかる
    • 影響範囲調査に時間がかかる(対応箇所の検討は付くが、裏取りに時間がかかる。CircleCIなど自動的に回帰テストを行える環境が整っていると良い)
  • (雑な言い方だが)頭が良くないときつい。抽象的思考能力と大きめの脳内キャッシュ(短期記憶能力)があると良い
  • プログラマの使い方を制限しないため空気を読んだコーディングが必須(コードレビューは必須)

最後に

RubyはDDDと相性が良いように思える。

ドメインを明確に決めることで役割が明確化し、可読性、メンテナンス性が高まる。(デグレも起きにくい)
Rubyの設計スキルを上げるためにDDDを学ぶ必要がある。
Railsの場合、ControllerとModelが確実に分割されるが、Modelが複雑化した時の書き方は追って学習する必要がある(ActiveRecord::Concernやmix-in、他にもある?)
大規模のプロジェクトでRails(動的型付言語)を使っている場合は序盤は全体構成の理解に徹するべき。
SOAによるサービス単位での分割など、大規模になりすぎないようにシステムを分割することを検討した方が良い。