Drupal AHAH で "HTTPエラー 0" とか表示される

tag: 

Drupal AHAH を最近使っています。AHAH って Drupal のものだと思ったら、別にあるんですね。

Ajax は難しい? AHAH ならどうだが参考になりました。

AHAH は AJAX などと違って、HTML をそのまま帰してやればいいんですね。おかげで非常に簡単に実装ができます。

Introduction to AHAH Forms in DrupalAdding dynamic form elements using AHAH にあるように、hook_form() で作成したフォームを元に、drupal_render() を呼び出して、html を取得し、クライアントに帰してやるだけです。

クライアントサイドのコードは一切書く必要がありません。

これはすごくないですけ? 非 JavaScript 環境との処理の整合性も取りやすいですし。

[Effective C#] 項目29 親クラスの変更による指示がない限り new 修飾子は使用しないこと

本日の Effective C# は「項目29 親クラスの変更による指示がない限り new 修飾子は使用しないこと」です。

new 演算子は他の言語ではあんまり見ない気がします。

C# は C++ から派生した言語で、比較的近い Java と違い、メソッドはデフォルトで仮想関数ではありません。これは、Java との最大の違いだと思います。

仮想関数にするには virtual キーワードをつける必要があります。

このため、C# では Java ではなかった、メソッドをオーバーライドしたくてもできないという事態が発生します。逆に、Java であった、勝手にオーバーライドされてしまうといった問題はありません。

[Effective C#] 項目28 変換演算子は使用しないこと

また日が空いてしまいました。本日の Effective C# は「変換演算子は使用しないこと」です。

ある機能を使うな! というのも何なんですが、作ったはいいけど、うまく機能しないとか多いんですよね。たとえば、ApplicationException クラス

変換演算子もこれほどじゃないんですけど、意図しない動作をすることがあるので、使いづらいです。

変換演算子は 以下のように利用します。

[Effective C#] 項目27 ICloneable を使用しないこと

本日の Effective C# は「項目27 ICloneable を使用しないこと」です。

オブジェクトクローンって難しいんですよね。いや、作るのはそんなに難しくないんですが、浅いコピーにするか、深いコピーにするかで非常に悩みます。

コピーを作成するには、ICloneable インターフェイスを実装します。

値型に関しては、そもそも代入でコピーが作成されるため、ICloneable を実装する必要はないそうです。

参照型の場合は…。一般的には深いコピーを行うんだと思います。

IClonebale インターフェイスを実装するのであれば、すべての派生クラスでもこのインターフェイスを実装しなければいけないのです。

なので、ドキュメントにきちんと記述して、これらを行うよう促さないといけないですね。

[Effective C#] 項目26 IComparable と IComparerer を実装して順序関係をサポートする

これで半分過ぎました。本日の Effective C# は「項目26 IComparable と IComparerer を実装して順序関係をサポートする」です。

IComparable インターフェイスはオブジェクトを比較可能にするものです。比較というのは大小関係を決めるもので、既定のソートに利用されます。それに対し、IComparer インターフェイスはオブジェクトの比較を行います。

書籍のほうでは、IComparable インターフェイスの実装は明示的に行い、オーバーロードで引数の型を明示的に指定した CompareTo メソッドを定義したりしていますが…。(構造体のボクシング・案ボクシング対策のためだそうです)

[Effective C#] 項目25 型はできるだけシリアル化可能とすること

最近ペースが落ちてますので、今日からまた頑張ります。本日の Effective C# は「項目25 型はできるだけシリアル化可能とすること」です。

これはちょっと疑問に思いました。シリアル化の必要が出てからシリアル化可能にすればいいんじゃないかと。

独自に作成した型がシリアル化を適切にサポートしていない場合、その型をメンバとして使用したり、親クラスとして実装したい開発者に余計な手間をかけさせることになるでしょう。型がシリアル化をサポートしないのであれば、型を使用する側でなんとかしてシリアル化の対象とできるよう独自の実装を行うことになります。しかし型を使用する側では型の内部に定義された private メンバへアクセスすることはできないため、シリアル化を適切にサポートできるはずもありません。型の開発者自身がシリアル化をサポートしない限り、外部からシリアル化をサポートできるようにすることはほぼ不可能です。

つまりは、特に Framework みたいなものを作る場合、それらがシリアル化不可能な場合、それを使う人がシリアル化したいと思っても、難しいので、とりあえずやっとけみたいな感じですね。

ReSharper の Code Generation で Equals()/GetHashCode() メソッドの実装を行う

ReSharperCode Generation が便利すぎです。

ソースコードの型の上で Alt + INS を押してください。ポップアップメニューが出てきます。

メンバを指定して、コンストラクタを生成したりは序の口です。

"Generate Formatting Members" を選ぶと、選択したメンバを利用して、ToString() メソッドを実装してくれます。メンバの数が多い場合に、ToString() メソッドを実装することは大変な労力なので、これは助かります。

一番驚いたのが、"Generate Equality Members" です。これは、指定したメンバを利用して、Eqals()/operator==()/operator!=() を実装してくれます。さらには、GetHashCode() まで実装してくれます。

[Effective C#] 項目24 命令型プログラミングよりも宣言型プログラミングを選択する

本日の Effective C# は「項目24 命令型プログラミングよりも宣言型プログラミングを選択する」です。

この項目は長いので書籍を読んでください。(笑)

要約すると、属性を用いた宣言型プログラミングをやろうねってことです。たぶん。

宣言型プログラミングとは、命令を記述するのではなく、ふるまいを宣言することによってプログラムを作成する方法です。

カスタム属性を作ることで、クラスやメンバに情報を入れ込むことができます。これにより、さまざまなことが可能になります。

[Effective C#] 項目23 クラス内のオブジェクトの参照を返さないようにすること

本日の Effective C# は「項目23 クラス内のオブジェクトの参照を返さないようにすること」です。

これ大事なんですけどね。守りたいんですが、ついつい面倒で…。

[Effective C#] 項目22 イベントにより発信インターフェイスを定義する

本日の Effective C# は「項目22 イベントにより発信インターフェイスを定義する」です。

まあ、なんらかの通知をする場合はイベントを使用した方がいいですよー。というお話なんですが、ひとつチンプンカンプンなところがありました。

(ほとんどの Windows コントロールのように) 非常に多くのイベントを必要とするクラスも少なくありません。その場合、ひとつのイベントに一つのイベントフィールドを定義することはほぼ不可能です。たとえ多くのイベントを定義したとしても、実際には定義されたイベントのうちの一部だけがアプリケーション内で使用されていることでしょう。このような状況に遭遇した場合、実行時に必要となるイベントオブジェクトだけを定義するよう設計を見直すべきです。

ここの意味がさっぱりわかりません。

Windows コントロールはイベントごとにイベントフィールドを用意していますし、それじゃあかんと言われても…。なぜ見直すべきかの理由も書いていないですし…。

ページ

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