Drupal でノードのサブミットボタン押下時にタームがクリアされる

tag: 

Drupal にはタクソノミモジュールというのがあって、タグみたいなものを提供できる。

これはいいんだけど、

$form['add_material'] = array(
  '#type' => 'submit',
  '#value' => t('Submit'),
  '#weight' => -6,
  '#submit' => array('_customnode_submit'),
);

こんな感じにカスタムノードにボタンをつけてですね。

function _customnode_submit($form, &$form_state) {
  $node = node_form_submit_build_node($form, $form_state);
}

こんな感じで。

そして、タームを適当に選択して Submit ボタンを押すと、あら不思議! 選択済みのタームがクリアされるという悲しい自体が…。

あまりにも悲しいのでソースコードを本気で追ってみました。

[Effective C#] 項目21 デリゲートを使用してコールバックを実現する

本日の Effective C# は「項目21 デリゲートを使用してコールバックを実現する」です。

コールバックは激しく便利です。C# はデリゲートというのがあるので、これを利用してコールバックが書けます。Java だとこれがないのでインターフェイスを利用する必要があります。

特定のクラス間でデータをやり取りする必要があるけども、互いのインターフェイスを使用するほどには密に連携させたくない場合、デリゲートは最善の選択肢だといえます。

そうなんですよね。ちょろっとしたことなら、インターフェイスよりデリゲートの方が便利なんですよね。

マルチキャストデリゲートは複数のメソッドが登録されたデリゲートで、1 回の呼び出しで登録されたメソッドを呼び出すことができます。ただし注意すべき点が 2 つあります。一つは例外に対して安全ではないこと、もうひとつはマルチキャストデリゲートの返り値は最後に実行されたメソッドの返り値になるということです。

例外の件はともかくとして、返り値が一つしか、しかも最後のメソッドのもののみってのは大問題な気がします。

[Effective C#] 項目20 インターフェイスを実装することと仮想関数をオーバーライドすることの違い

本日の Effective C# は「項目20 インターフェイスを実装することと仮想関数をオーバーライドすることの違い」です。

これ、分かりにくいんですよねぇ…。Java のように、デフォルトで仮想関数ならば、あまり差がないんですが、C# の場合はデフォルトで仮想関数ではないので…。

書籍の方では、いろいろとごにょごにょ書いていますが、インターフェイスの実装と仮想関数は目的が違うので、目的に合わせて使い分けるのがいいと思います。

というか、似て非なるもの、なので、置き換えが可能なものでもありません。組み合わせて使ったりもします。

[Effective C#] 項目19 継承よりもインターフェイスの定義および実装を行うこと

今日の Effective C# は、「項目19 継承よりもインターフェイスの定義および実装を行うこと」です。

これ重要です!

オブジェクト指向を学び出したころは、継承による差分プログラミングを夢見ていました。でもまあ、これは失敗に終わりました。(もちろん、継承による差分プログラミングが有効だったときもありますが)

個人的にインターフェイスを使うべき最大の理由が、Mock Object の問題です。例えば、NMock はインターフェイスの Mock しか作れません。ですので、継承ではなく、極力インターフェイスを使うようになりました。(クラスの Mock を作れるのもありますが、その場合 virtual メソッドに限定されるので、やっぱり使えなかったりします)

そしたらなんか別のメリットが出てきてびっくりしました。

[Effective C#] 項目18 Dispose パターンの標準的な実装

今日の Effective C# は「項目18 Dispose パターンの標準的な実装」です。

これはためになります。Dispose メソッドを実装する回数ってそれなりに多いので、そのたびに深く考えるのは馬鹿らしいです。

Dispose メソッドの実装というエントリが MSDN Library にもあります。

って、書籍に書いてあることは全部書いてあるな…。

個人的には、こういう Dispose みたいなメソッドのために、多重継承が欲しいんですよねぇ。基本的には MSDN Library にあるサンプル通りに書いたクラスを継承することで対処すれば問題ないんですけどね。

ただ、Abstract パターンみたいなのを使ってるときは多重継承できないから、Dispose の方のクラスを継承できないというか…。

ASP.NET MVC2 Release

ScottGu のブログより。

ASP.NET MVC 2がリリースしたんだそうな。

個人的には気に入っているんだけど、いまいち盛り上がっていない感じ。さみしい…。

さーて、いろいろと研究せんとね。とか思いつつ、書籍がほとんどないんですよねぇ。洋書ならあるんだけど。

ASP.NET MVC実践プログラミング―.NET Frameworkによる標準Web開発技法くらいかな? これにしても MVC1 だし。あたりまえだけど。

[Effective C#] 項目17 ボックス化、ボックス化解除を最小限に抑える

本日の Effecitve C# は「項目17 ボックス化、ボックス化解除を最小限に抑える」です。

あー、ややこしいんですよね、これ…。

ボックス化とボックス化解除 (C# プログラミング ガイド)

この機能のおかげで、値型をさもオブジェクトのように扱えるので、非常にありがたいのですが、ボックス化・ボックス化解除で値型のコピーが作られ、ヒープにもボックスが作られるので、遅くなる原因になることがあるそうです。

ありがたいことに、C# からジェネリックが入りまして、これでほとんどの問題が解決できます。なので、省略!

[Effective C#] 項目16 ゴミの量を最小限に抑えること

仕事忙しすぎ。そんなわけで、現実逃避。

本日の Effective C# は「項目16 ゴミの量を最小限に抑えること」です。

これはまああれです。ヒープに短命な参照型をたくさん作るべきではないってやつです。オブジェクト指向ってのは隠ぺいなので、こういったものは、本来なら意識すべきではないとおもうのですが、やっぱり意識しないといけないのですよね。

ローカル変数が参照型であり、なおかつ非常に頻繁に呼び出されるメソッドの中で使用する必要がある場合には、その変数をメンバ変数へ昇格すべきです (値型のローカル変数については特に必要ありません)。

[Effective C#] 項目15 using および try...finally を使用してリソースの後処理を行う

本日の Effective C# は「項目15 using および try...finally を使用してリソースの後処理を行う」です。

using ステートメントは私が C# で大好きな機能の一つです。using ステートメントは try-finally を使うのと同じ効果が得られます。

[Effective C#] 項目14 コンストラクタの連鎖を活用する

本日の Effective C# は「項目14 コンストラクタの連鎖を活用する」です。

寒いです…。

コンストラクタが複数ある場合、その初期化処理の実装は悩みものです。初期化処理をメソッドとして書き、コンストラクタからそれを呼び出すとかやりたくなります。

でも、Effective C# によると、この方法は効率が悪いんだそうです。コンストラクタはちょいと特殊で、そのままコンパイルされるわけではないんだそうで、変数初期化子などのコードが追加されるそうです。

コンストラクタの連鎖を利用した場合は、連鎖の最後のコンストラクタにだけそういったコードが追加されるんだそうで。

んで、一番の理由はあれですよね。

readonly フィールドはコンストラクタからしか初期化できないこと、です。

なので、コンストラクタの連鎖を使用し、初期化コードをコンストラクタ内に書くことが重要なんです。

ページ

まさくらのブログ RSS を購読