Effective C# 3rd 読書メモ 32 イテレーションとAction/Predicate/Functionの間の結合度を低くする

イテレーターメソッドでは、主に2種類の仕事をする。1つは一連の要素の繰り返しで、もう1つはそれぞれの要素に基づく処理(集計等)である。これらは別々のイテレーターメソッドで扱うべきである。

これらの仕事を行うには、デリゲートを使うのがよい。デリゲートの中でも、特に汎用的なものはAction<T>Func<T, TResult>Predicate<T>として定義されている。

Predicate<T>はbooleanを返す。フィルタリング処理等に使用する。以下はfilterFuncで絞り込みを行うWhereメソッドの実装例。

Func<T, TResult>の実装例は以下。

Effective C# 3rd 読書メモ 31 合成可能なAPIを作る

イテレーターメソッドの結果を次のイテレーターメソッドにつなげるような呼び出しを行うと、イテレーターは全体で1回だけ実行される(遅延評価される)。

上記コードを実行すると、その出力は以下のようになる。「{1, 2, 2, 3}」という配列を前から順に1回だけ走査していることがわかる。

このように、イテレーターメソッドを使うと、通常のループに比べて、関数を合成するような使い方ができる。

Effective C# 3rd 読書メモ 30 ループよりもクエリ構文を使う

ループは手続き的な構文だが、LINQのクエリは宣言的な構文である。できることは同じでも、クエリ構文を使ったほうが、よりコードの意味が伝わりやすくなる。

以下のコードはループを使った例である。

同じ処理を、LINQを使うと以下のように書くことができる。

一般に、コレクションを操作するロジック(絞り込み、並び替え等)が複雑になる場合は、ループよりもLINQの方がわかりやすいコードを書くことができる。

Effective C# 3rd 読書メモ 29 コレクションを返すよりもイテレーターメソッドを使う

一連の要素をメソッドから返す際は、イテレーターメソッドを作成すべきである。そうすることで、呼び出し側の使い勝手が良くなるし、コレクション全体を取得して返すよりもパフォーマンスが良くなる。

イテレーターメソッドとは、yield returnを使って一連の要素を返す方法である。

イテレーターメソッドは、最初の要素が要求されるまで実行されない。このことは、エラーの発生箇所がわかりづらいという問題を生み出す。この問題の解決のためには、以下のように、ジェネレータ関数を別メソッドとして用意するというイディオムを利用できる。

上記サンプルのGenerateAlphabetSubset()メソッドに対して誤った呼び出しを行うと、呼び出しの時点でバリデーションが実行されるため、エラーに気づきやすい。

日経ソフトウエアでPHPの連載を始めます

日経ソフトウエア2017年5月号

日経ソフトウエアの2017年5月号から、「PHPでサクサクWebアプリ開発」というタイトルの連載を始めます。

PHPの特徴は、環境構築が簡単で、プログラミング初心者でも始めやすいことです。一方で、やや古い情報が多かったり、イマイチなサンプルがネットに転がってたりするのが残念な点でもあります。

PHP 5.4以上ならビルトインサーバが使えるのでApache等のWebサーバを入れる必要はありません。また、Windows 10 Anniversary Update以降なら、XAMPPよりも簡単に、「本物」のLinux環境を整えることができます(macOSなら、そもそもPHPははじめからインストールされています)。そういった新しくて使いやすい環境をベースに、実用的なPHPプログラムを書く方法を紹介していきます。

毎号6ページ程度なので、多くを書くことはできないですが、要所は押さえているので、他の書籍で学び始める前のスタート地点にしていただければいいと思っています。


ちなみに、最近の機械学習ブームを受けてか、日経ソフトウエアも機械学習系の話題が多いです。今号(2017年5月号)では、Anacondaを使ったPythonプログラミングの学習、Python + OpenCVによる画像認識、Pythonによる金融データの分析と、Pythonの記事が山盛りにあります。

私もOpenCVを使う際などにPythonを使ったことはありますが、機械学習を本格的に触ったことはないので、日経ソフトウエアの記事から入門してみようと思ってます。