新しいプログラムの書き方ってなんで出てくるんだろう
古いコードのサンプルに出くわしたりしたときにふと思うんですけどねこれ。
おそらく、事情が変わったというのが大きいんじゃないかなと思ったので、ひとつ小話。
C#についていえば、Ver5.0で非同期処理のためのキーワードが生まれました。実は.NET Frameworkには初期バージョンのころから非同期処理に関するお作法がちゃんとあるのですが、あえて生み出した理由は何でしょうか。
これが「事情が変わった」というところだと思います。たとえば入出力。昔は遅くてもみんな待ってくれたのですが、月日は変わってみんな待ってくれなくなりました。画面が操作を受け付けなくなったらすぐ「バグった」と思われてしまいます。これは人に限らずOSもそうで、ストアアプリやWindows Phoneアプリ*1はUIが既定の時間応答しないとOSに「あっ死んでる」と思われて問答無用で終了するようになっています。これはおそらく、そんなアプリを待機させているとバッテリーや帯域が無駄になるからという事情があるのでしょう。つまり、いかに重たい操作や入出力でUIが応答しなくならないようにするかが問われる環境で使われるようになったというわけです。そこで入出力や重たい作業をUIスレッドから分離させるわけですが、今までの書き方だと超めんどくさいです。
void Show() { WebRequest req = WebRequest.Create("http://hoge"); req.BeginGetResponse(new AsyncCallBack(Result), req); } private void Result(IAsyncResult ar) { WebRequest req = (WebRequest)ar.AsyncState; WebResponse res = req.EndGetResponse(ar); string str = new StreamReader(res.GetResponseStream()).ReadToEnd(); Dispatcher.BeginInvoke((Delegate)MessageBox.Show); }
Ver1.0あたりのコードだとこうなります。書けないことはないですが、めんどくさいですね。毎回やってられるかこんなの
それがVer5.0ではこうなります。
async void ShowAsync() { var req = WebRequest.Create("http://hoge"); var res = await req.GetResponseAsync(); var mes = await new StreamReader(res.GetResponseStream()).ReadToEndAsync(); MessageBox.Show(mes); }
これなら書ける…!
とまあ、こんな感じにそのときの事情に合わせて拡張されたのが理由のひとつではないでしょうか。
理由は使う側であったり、作る側であったり、世の中の流れだったりいろいろあるのでしょうが、人が論理を重ねて作るものですから、新しい書き方が生まれるのはなにかしら理由があるはずです。ちょっと立ち止まって考えてみるのも悪くはないかも。