2009年8月17日月曜日

NodeListとHTMLCollection

HTMLDocumentには、document.imagesとかdocument.formsとか、DOM Treeからある要素のみを返すアクセッサがあります。

それとは別に DOM Coreには getElementsByTagName() というメソッドがあります。

これらは同じものだと勘違いしていたのですが、document.xxx はHTMLCollection, getElementsByTagName() は NodeListを返します。


で、HTMLCollection は NodeListを継承しているわけではないのです。

ま、HTMLCollection は NodeListと同じ属性とメソッドを持っているので、JavaScriptから見れば同じとみなしていいのかもしれませんが、どうも違和感が。。。

2009年8月16日日曜日

モジュール性



ちょっと調べたいことがあって
メイヤーの『オブジェクト指向入門』を読んでいたら、モジュール性の5つの基準が書いてあった。
以下抜粋。
  • 分解しやすさ
  • 組み合わせやすさ
  • わかりやすさ
  • 連続性
  • 保護性

お、こんなの知らなかったぞ(汗

で、分解しやすさの説明に(抜粋)
  • 依存関係は最小限に抑えなければならない。そうしなければ、個々のサブシステムの開発がほかのサブシステムの作業の進み具合によって限定される可能性がある。

うぅ、なんだか耳が痛い話。

ほかにも再利用性とか、いろいろためになる&&できていないはなしがちらほら。

分厚い本なので、調べモン程度にしか使わなかったけど、こりゃ一回通読しておいたほうがよさそうだな。

2009年8月15日土曜日

event handler content attributes

onXXXといったイベントハンドラを書ける属性がありますが、

HTML4.01のときは、この属性がかける要素が決まっていました。
HTML4.01のIntrinsic events
これが、HTML5だと、Global attributesとして定義されているので、すべての要素に書けます。

ということは、そのイベントハンドラが呼ばれるかどうかは、その要素にイベントを発火させられるかどうかということになります。

だから、「この要素にこのイベントハンドラを書けるのか」という質問されると、「この要素はフォーカスが当たるからonfocus/onblurが書ける」とか、そういった説明をしなければいけません。
これが、HTML5の要素はかなりあるので、意外と面倒くさいです。

ちなみに、実はHTML4.01では<img>要素にonload属性は書けませんでした。
(書いてあるコンテンツは結構あるみたいですが。)

でも、HTML5では、どの要素にもonload属性が書けるようになったので、リソースをロードする<img>要素ではloadイベントが発火するので、onloadイベントハンドラは呼ばれるのは正しい仕様です。

<img>要素の例を考えると、HTML5の考え方のほうが自然なのかもしれませんね。

2009年8月3日月曜日

はじめてのObjective-C

意味はないけどムシャクシャするので、
Objective-Cでコードを書いてみた。
いや、別にムシャクシャはしていないけど。

ということで、helloWorldを。

hello.m
#import 
#import 

@interface TestClass : Object
  - (void) getMessage;
@end
hello.m

#import "hello.h"

@implementation TestClass
  - (void) getMessage {
  printf("Hello Objective-C World\n");
}
@end

int main(int argc, char *argv[])
{
  id obj = [ TestClass alloc ];
  [ obj getMessage ];

  return 0;
}

Ojbective-Cは @interface で、クラスの定義を行い、@implementationでクラスの実装を行う。

サンプルでは、- (void) getMessage;というメソッドを@interfaceで定義し、@implementationで実装している。 "-"はインスタンスメソッドと言う意味。

一応C言語なので、Cの標準ライブラリをimportすれば使用できる。

で、メソッドの呼び出しは[]で行う。

Objective-Cはsamlltalkと同じメッセージ形式なので、[obj getMessage]は、objに対してgetMessageというメッセージを送信しています。
allocはNewと同じ。

Linuxでのコンパイルは
$gcc -v -Wall -Os -o hello  hello.m -lobjc
とする。-lobjcというのが必要なんですな。

しかし、Objective-Cとかいっても、これじゃどう見てもC言語には見えませんな。