2008年4月11日金曜日

C#で関数型: Unfold

関数型言語にはUnfoldという関数が用意されていることが多い。Schemeだとこんな感じ。
(unfold p f g seed tail-gen) ==
   (if (p seed)
       (tail-gen seed)
       (cons (f seed)
             (unfold p f g (g seed))))
これをC#に直訳する。ただし、tail-genは無視する(optionalなので)。
public static IEnumerable<U> Unfold<T, U>
(
  Predicate<T> p,
  Func<T, U> f,
  Func<T, T> g,
  T seed
)
{
  if (p(seed))
    return Enumerable.Empty<U>();
  else
    return Cons
    (
      f(seed),
      Unfold(p, f, g, g(seed))
    );
}
 
public static IEnumerable<T> Cons<T>
(
  T car,
  IEnumerable<T> cdr
)
{
  yield return car;
  foreach (T element in cdr)
    yield return element;
}
これって、結局こういうこと。(そして、C#には末尾最適化がないのだから、必ずこう書くべきだ。)
public static IEnumerable<U> Unfold<T, U>
(
   Predicate<T> p,
   Func<T, U> f,
   Func<T, T> g,
   T seed
)
{
   for (T i = seed; !p(i); i = g(i))
      yield return f(i);
}
だったら、パラメータの順番を変えたほうが、Unfoldを呼び出すときにIntelliSenseが効いてうれしい。
public static IEnumerable<U> Unfold<T, U>
(
   T initial,
   Predicate<T> until,
   Func<T, T> next,
   Func<T, U> convert
)
{
   for (T i = initial; !until(i); i = next(i))
      yield return convert(i);
}
C#にわざわざUnfoldを用意する必然性はあるのだろうか。自分でも考えてみる。
そうだな、匿名メソッドやラムダ式ではyieldが使えないけど、それで困るようなシチュエーションならFoldとかUnfoldとかその類のメソッドがあると便利。
でもより重要なのは、きっとDLinqやPLinq(んー、でもUnfoldを並列処理するのは難しいか)みたいな世界に簡単に対応できるというポテンシャルなんだろう。そういう意味では、今現在での意味は薄いのか。

2008年4月8日火曜日

404 Table Module ないわー (そろそろTable Moduleについてひとこと言ってお くか) (2)

前回のエントリにひがやすをさんからコメントをもらった。

DataSetは


org.seasar.extension.dataset

で一応実装されてます。



ひがさん、ありがとうございます。
しかしながら、JavaでDataSetを実装するエントリで時間を稼ぐという目論見はあっけなく崩れ去ってしまった。

さて、Seaser2のDataSet実装を使って話を進めようと思うが、今回のネタのためにSeaser2を使うのはちょっと重装備すぎるように思ったので、DataSet実装だけ切り出してみた。ファイルはここに置いた。
元ファイルに加えた変更点は:

  • ログ機能は削除

  • リソースからメッセージを取得する機能も削除

  • それに伴い、SRuntimeExceptionとSSQLExceptionを使わないように修正

  • Beanを使ってDataTableをセットアップする機能を削除


といったところ。

2008年4月5日土曜日

そろそろTable Moduleについてひとこと言っておくか(1)

まずひとこと。このシリーズではJavaを使うよ!

ビジネスロジック部分のパターンとしてMartin Fowlerの"Patterns of Enterprise Application Architecture"(以下、PoEAA)で挙げられているのが、"Transaction Script"、"Table Module"、そして"Domain Model"。
ビジネスロジックについてはこの分類に沿って語られることが多いのだが、ほとんどの場合Table Moduleはいらない子扱いされている。
「んー?Table Module? なんか.NETのやりかたでしょ?うちらはJavaで(Spring|Seasar2)でDomain Modelだから関係ないしー」
まあ、確かにDomain ModelでやれてるんならTable Moduleはシカトしてもいいけど、でもTransaction Scriptで頑張ってるんなら、そしてDomain Modelがハードル高いと感じているのなら、Table Moduleにも目を向けたほうがいいんじゃないの?

とはいっても、Javaでの実装の仕方が分からん。
分からんけど実装してみよう。というのがこのシリーズだ。

まずは、.NETのTable Moduleで使われている(とされている) DataSetをJavaで使えるようにしてみる。
dataset UML

2008年4月4日金曜日

エキスパートCプログラミングを読むといい

ダンコーガイがK&Rから中途半端な引用をしている。

char s[];

and
char *s;

are equivalent;

これ、ダンコーガイはわざとやってると思うんだが、ここだけ読んだ人が誤解しないように言っておくと、正しくは

as formal parameters in a function definition,
char s[];

and
char *s;

are equivalent;

つまり、「関数定義の仮引数としては」という前提がついているのだ。ここを無視してはいけない――という重要な指摘と詳しい解説はこの本に載ってる。

エキスパートCプログラミング―知られざるCの深層 (Ascii books)

エキスパートCプログラミング―知られざるCの深層 (Ascii books)



  • 作者: ピーターヴァン・デ・リンデン, Peter van der Linden, 梅原系

  • 出版社/メーカー: アスキー

  • 発売日: 1996/03

  • メディア: 単行本




前のエントリでも書いたけどこの本は面白いよ。ぜひ読むべし。

2008年4月1日火曜日

2008年3月20日木曜日

あの広告インスパイア

reblogされるかな?

ドメイン駆動

同僚の尾島氏が(いつのまにか)監修。
ドメイン駆動

ドメイン駆動

  • 作者: Jimmy Nilsson, 尾島良司, 株式会社ロングテール長尾高弘
  • 出版社/メーカー: 翔泳社
  • 発売日: 2008/03/20
  • メディア: 大型本

翔泳社のページに概要が書いてあった。

デザイン&パターンへのドメイン駆動適用法解説

この本の最大のテーマは、ドメインモデルをクリーンに作りつつ、永続記憶とも仲良くする方法である。ドメインモデルようなもののための永続記憶はどのように構成されるかを示し、ドメインモデルとデータベースの間に橋をかける。
また、単にパターンの使い方を説明するだけでなく、たとえば、O/Rマッパーでパターンがどのように使えるかまで説明する。
この本の中心はパターン自体ではないが、この本ではすべての章でパターンをツールとして、設計のさまざまな側面を論じるための言語として利用していく。この方法には、パターンを知らない読者が、本を読むうちにパターンに興味を覚え、パターンとは何かということに関してイメージをつかんでいくだろう。
プラットフォームごとに読者を分類して言うなら、この本は、ドロップするまでドラッグするというような場当たり的なやり方ではなく、しっかりとした理論に支えられたアプローチを取りたいと思っている.NET世界の人々の役に立つだろう。また、DDDとO/Rマッピングの組み合わせ方についての議論やサンプルからは、Javaの世界の人々も学べるだろう。
(「序章」より抜粋)
同じく翔泳社のページに著者紹介がある。
それを読むと、原著者のWebサイトはhttp://www.jnsk.se/WeBlog/だそうだ。
原書は"Applying Domain-Driven Design and Patterns: With Examples in C# and .NET"とのこと。