教科書の設計について

自分が学んだことを今後どのようにまとめてゆけばよいのかについて、PHP の教科書を例に考える。

概念を学んでから最終的にアプリケーションをつくるのではなく、最初につくるべきアプリケーションの要件や機能を示した上で、概念を学んでゆく。 個別の課題はできるだけ最終成果のアプリケーションにつながるようにすべきである。重要であるがアプリケーションをつくる上で必須ではない項目は書かないか、最後の補足としてまとめる。

アプリケーションをつくる際にはマイクロフレームワークを使う。素の PHP を書いた上でマイクロフレームワークを使ったコードのリファクタリングしてもよいだろう。マイクロフレームワークを導入する前にテンプレートエンジンの導入を示したほうがわかりやすいだろう。テンプレートエンジンに最小限のロジックしか求めないので、Mustache がよいかもしれない。教科書の説明に必要な最小限のマイクロフレームワークにすれば、フレームワークの学習負担を減らすことができる。

データの保存に関しては、データベースよりも JSON 形式のテキストにすれば SQL および noSQL データベースのセットアップが不要になるので、 練習しやすくなる。データベースを使うのであれば SQLite3 がよいだろう。デフォルトで PHP に搭載されているからだ。

学習において SQL を使わないメリットはフィルタリングの操作を PHP で書く必要があるので、配列関数のトレーニングになる。また SQL に慣れてしない人が SQL でつまずく問題を減らすことができる。もっとも、高度なフィルタリングを考えると、高階関数とクロージャの学習が必要になるので、ここでつまずく可能性がある。

アプリができれば、今度は異なるプログラミングパラダイムに切り替えるために、別のフレームワークに置き換えることも考えられる。

最小限でも実用的なアプリをつくるためには PHP だけでなく、HTML5、JavaScript の学習が必要になる。

バリデーションに関して、PHP、HTML5、JavaScript を統一的に学ぶ必要がある。

JavaScript の部分の実装に関して、素の JavaScript、jQuery、MVC フレームワークの選択肢がある。

教科書の方針としては jQuery を使ったコードから MVC フレームワークを使ったコードにリファクタリングすることである。

DOM、イベント、Ajax の学習について手際よくまとめる必要がある。

PHP と JavaScript を並行して使うために、クロージャを使ったイベント駆動のプログラミングについては PHP にも説明が必要だろう。

配列関数の分類について

CRUD(Create、Read、Update、Delete)、一階関数か高階関数かどうか、デフォルトとカスタマイズ方法の3つの分類を挙げることができる。

array_filter を使って空の値を削除する

empty 関数によって空であると見なされる値 (falsy) に関して、配列以外であれば array_filter を使って削除することができる。

// $var は未定義の変数
var_dump(array_filter(
    ["", 0, 0.0, "0", null, false. [], $var]
));

上記のコードを実行すると、配列が Array という文字列に変換される。

array(1) {
  [5]=>
  string(5) "Array"
}

解決方法の1つは空の配列を false など空の値として判定される値に変換してから array_filter を適用する。

var_dump(
    array_filter(
        array_map(
            function($elem) {
                 return empty($elem) ? false : $elem;
            },
            $array
        )
    )
);

もう1つの方法は array_filter の多次元配列対応バージョンのユーザー関数を定義することである。PHP 公式マニュアルのユーザーノートに定義の例が示されている。

function array_filter_recursive($input) 
{ 
    foreach ($input as &$value) { 
    
        if (is_array($value)) { 
            $value = array_filter_recursive($value); 
        }

    } 
    
    return array_filter($input); 
} 

array_map、array_walk、array_walk_recursive、array_filter、array_reduce の引数の順序について

array_map だけコールバックが第1引数になっており、ほかの関数はコールバックを第2引数にとる。

array array_map ( callable $callback , array $arr1 [, array $... ] )
bool array_walk ( array &$array , callable $funcname [, mixed $userdata = NULL ] )
bool array_walk_recursive ( array &$input , callable $funcname [, mixed $userdata = NULL ] )
array array_filter ( array $input [, callable $callback = "" ] )
mixed array_reduce ( array $input , callable $function [, mixed $initial = NULL ] )

array_map だけ変則的になっているのは array_map の機能が Scala、Haskell で言うところの map、zip、zipWith を兼ねていて、可変引数をとれるようにするためである。

array_walk、array_walk_recursive、array_reduce はコールバックを第2引数にとる。 これは第3引数が省略できるようにするためである。

JavaScript において上記の PHP に対応するメソッドはコールバックを第1引数にとる。

array.map(callback[, thisArg])
array.forEach(callback[, thisArg])
array.filter(callback[, thisObject])
array.reduce(callback[, initialValue])
array.reduceRight(callback[, initialValue])

Haskell の Data.List の対する関数はどれもコールバックを第1引数にとる。

map f xs
filter f xs
foldl f xs

コールバックの順序を統一するのであればどうすればよかったのか考える。

Haskell のようにコールバックの順序を第1引数に統一した場合を想定してみよう。

この場合、array_filter が課題になる。array_filter は第2引数のコールバックを省略した場合、falsy な値を削除する。 この使い方の場合、コールバックを第1引数に指定した場合、空の文字列を渡す必要がある。JavaScript において filter メソッドを使って falsy な値を削除するためには、何らかの値を渡す必要がある。コードはこちらの記事に書いた。

Wikipedia で使われるプログラミング言語の事例

Wikipedia(MediaWiki) において PHP が使われることはよく知られているが、ほかの言語は以外と知られていないようなので、書いておく。 Special:VersionにアクセスすればWikipedia に導入されている PHP および Lua のバージョンを調べることができる。

  • PHP - サイト全般 (MediaWiki として配布)
  • Lua - コンテンツレイヤーにおけるテンプレート言語
  • Ocaml - 数式画像の生成
  • Python - pdf の生成、多言語間リンクのためのボット
  • Java - Apache Lucene による検索
アーカイブ ランダム ホーム 次のページ ページ 1 / 98