2014年8月21日木曜日

Javaについて最近の雑感

以下、俺の俺による俺のためのまとめなので、俺以外の方はどうぞ他の有用なサイトをご覧ください。




まず、歴史の振り返り。

  • Java (1.0, 1.1) 1996
    • オブジェクト指向言語として鳴り物いりだったのだろう。よく知らない。
  • Java2 (1.2, 1.3, 1.4) 1998
    • リフレクション
    • コレクションフレームワーク
    • 1.4より正規表現
    • その他、あまり興味のないもの導入(Javaアプレット、Swing、CORBA対応)
  • Java5.0 (1.5) 2004
    • ジェネリクス(総称型)
    • オートボクシング
    • 列挙型
    • 可変長引数
    • アノテーション
    • 拡張forループ
    • エグゼキューターフレームワーク
    • Concurrent API (マルチスレッド対応用ユーティリティ)
  • Java6  2006
    • 改善、チューニング的なイメージ
  • Java7  2011
    • 型推論
    • AutoCloseable
    • 並列処理関連とクラスローダーの拡張
    • あとはわりと興味ない(JavaFXとか)
  • Java8  2014/3
    • ラムダ式
      • 関数型を可能に。正しいクロージャじゃないと言われるが、細かいレベルは俺にはあまり関係ない。
      • pararellによる並行処理→マルチコア時代の高速化
        • .pararell()をかますだけでスレッドを分けた並列処理
          • うまく使えてないけど。
    • メソッド参照 まだ実力不明
    • デフォルトメソッド これは非常に良い
      • 多重継承に近い
    • Nashhorn / InvokeDynamic -> JavaScript実装
      • 広義のJavaだが完全に動的言語

色をつけたものは、あって非常に助かってるもの。なかったらもうJavaなんか使いたくない。ラムダには期待しているが、まだ使い始めて日が浅いので実績は乏しい。

Javaとオブジェクト指向

Javaじゃなくてもオブジェクト指向はいくらでも出来るだろうと思っている。多少の差はあれ、指向できるしそこそこできるはず。

ただ、Javaは最初からオブジェクト指向を謳っているので、オブジェクト指向になじみが良いと思っている。本来の言語仕様を活かすように設計すれば自然とオブジェクト指向になる・・・いや、なりやすいと言うか。


継承について、単一継承ポリシーの是非が問われていたが、自分は単一継承は正解だと思っている。親が不明というのは、いろいろ怪しくなりそう。親クラスはただの雛形ではなく、抽象概念としての上位概念であるべきなので、系統が必要と思え、であるならば単一でなくてはならないはずという直観。


そこへきて、インターフェースのデフォルトメソッドによる多重継承ライクな動作は、よい落としどころではないか。メソッドがぶつかることはコンパイル時点で検出、制御できるし、インターフェースなので状態は多重に継承できないことにより、安全性が確保できているのではないか。という気がする。

Javaと動的言語

Javaは静的言語の代表みたいに言われるし、実際現在も基本的に動的ではない。が、動的っぽい方向へ進化していると思う。総称型のワイルドカードやD/Iと組み合わせたリフレクション、匿名クラス、関数型やラムダなど、「なんだかわからない」状態で使うものはいろいろ増えてる。

けど、実際にはあくまでも静的なので、安全というか、安心感?があるのが良い。


俺はスーパーハッカーではないというか人一倍もの覚えが悪いしコード読む(2つの意味で)のも嫌いだから、完全に動的な言語を動的につかいまくったら、おみくじガジェットくらいならともかく、まともな規模のアプリを作れる気がしない。

Javaと開発環境

充実していると思う。NetBeansはまともに使ったことがないが、一度インストールしたら画面がしょぼくて萎えた。何か1つだけ良いことがあった気がするが、それが何だか思い出せない。・・・・依存ライブラリでも解決したっけか?

自分はEclipseを推す。実に良い。10年前は重すぎて使い物にならんと思ったが、今は軽快。情報も多いし。

Javaのポータビリティ

Write Once, Run Anywhere、だったか?昔は嘘くさいと思ったが、最近じゃわりと事実だなと思う。

国際化やIO関連の抽象化が進んだからかも知れない。JVMが違っててすらそうそう誤動作?しない気がする。

Javaと組み込みアプリやデスクトップアプリケーション

作ったことないから知らない。

Swingはちょっと見た目がダサい印象。WindowsでもMacでも浮いた感じで悪目立ちするような。良いモノを見たことがないだけかも知れないが。




ただ、Eclipseをデスクトップ系の一例とみると、まあ十分なものだなと。Eclipse自体を下敷きにしたアプリというのを複雑なウィンドウシステムを持つものではいくつか見たが、それはナイスアイデア・・・なのかどうか、やはりやったことないからわからない。

JavaEE

ハローわーるどくらいの開発か、サンプルくらいしか見たことないので、よく知らない。けど、良い印象はない。いつも迷走している巨艦という印象。だいたい風呂敷を広げすぎてるからそうなるんじゃないのか?とか思ってしまう。

とは言え、自分のように小さいものを作っているのと違い、数百人以上が参加(名前だけのマネージャーとか責任者とかは抜いて)するような大きなプロジェクトでは、ああいったルール化された仕組みが便利なのかも知れない。成果物の粒が揃う、という意味で。

JavaとWebアプリ

Servlet/JSPは、Perl/CGIで小さな仕事をしてた俺が最初に接した頃にはやたら冗長、硬直していて使いにくいと思ったものだが、今は良い塩梅だと思っている。

逆に、EL式は好きじゃない。無駄だと思う。なんであんなの作ったんだ?当時勢いがあった気がするPHPに対抗するためなのかな?

カスタムタグもファックな感じ。関数1つにXMLでどうのこうのとかやってらんない。@includeディレクティブも酷い。変数のスコープがめちゃくちゃになることしばしば。

気に入っているのはJSPタグ。引数の宣言が出来てスコープもちゃんと管理できるし、変な設定ファイルとかいらないし。良い感じで部品が作れる。小さいJSPタグをたくさん作ると便利。重くなるとかはあんまり気にしない。出力をキャッシュすればいいし、それでもダメなら、非正規化のようなチューニングならいつでも出来る(コンパイルされてからはさほどオーバーヘッドがあると思わない。ゼロじゃないが、致命傷になるのはたいてい、そういうところじゃないので)。

もっとも、もはやそういうのじゃないテンプレートエンジンを入れるべきなのかも知れない。が、そういう努力には不毛な側面もあると思う。結局、どう頑張ろうとプレゼンテーションからロジックがなくなることなどないからだ。ビジネスロジックを排除したって、ビジネスじゃないロジックは残る。そのロジックがJavaだと困るけどCMSの固有言語なら困らない・・・という話でもないんじゃないかと。同じではないのはわかるけど。まあ、場合によりけりだけど。書くのがどうせSEになるような状況じゃあ、という話ですかね。

結局

Javaの強みは、JVM+言語仕様+APIとなってるところじゃないだろうか。JavaとJava8ではSDKのサイズが10倍くらい違う(だったと思う)。言語仕様自体は慎重に少しずつ拡張されているし、APIはわりと「使うも使わないも自由」な感じでどんどん便利になってきた印象。言語自体を変えるより当然ハードルは低いし、さりとてサードパーティでもないので安心して準備いらずで使えるし。

外部ライブラリも豊富だが、それらを安易に使わなくても相当のことが出来るし、そういったライブラリも過剰に依存ライブラリを持たずに開発できるので、導入しやすい。・・・のではないか?たぶん。



0 件のコメント:

コメントを投稿