指向性メモ::2005-02-23::JavaScriptでデザインパターン

ページ情報
制作日
2005-02-23T05:36:37+09:00
最終更新日
2005-10-07T09:02:41+09:00
ページ内目次

Adaのクロスコンパイラをmakeしている間暇だったので試しに書いてみた。JavaScriptの復習もかねて。

まずはIterator。

function BookShelf() {
    this.books = new Array("空ノ鐘の響く惑星で", "半分の月がのぼる空", "君の嘘、伝説の君");
}

function BookShelf.prototype.getIterator() {
    return new BookShelfIterator(this);
}

function BookShelfIterator(of) {
    this.shelf = of;
    this.counter = 0;
}

function BookShelfIterator.prototype.hasNext() {
    if (this.counter < this.shelf.books.length) {
        return true;
    } else {
        return false;
    }
}

function BookShelfIterator.prototype.next() {
    var value = this.shelf.books[this.counter];
    this.counter++;
    return value;
}


// 実際に使う側の処理
var ShelfDemo = new BookShelf();
var ItrDemo = ShelfDemo.getIterator();

while (ItrDemo.hasNext()) {
    print("『" + ItrDemo.next() + "』"); // printは適当に定義するべし
}

「配列booksを返すメソッドを作って回せばいくない?」っというツッコミもあるだろうけど、もしデータの格納方法を配列じゃなくて違うオブジェクトにした場合、配列専用の構文で書いてあると、その部分を変更しなくちゃならなくなる。その点、Iteratorを使えば回す部分の処理は常に一定なので安心。

次、よく使うFactory。

function Factory() {
}

function Factory.prototype.create() {
    return new Item();
}

function Item() {
    this.name;
}

function Item.prototype.setName(newName) {
    this.name = newName;
}


// 実際に使う側の処理
var fact = new Factory();

var item1 = fact.create();
item1.setName("Item1");
var item2 = fact.create();
item2.setName("item2");

「その都度itemnewすればよくね?」とか。いやいや、そうすると、クラス「Item」が「NewItem」に変更されたらその部分全部書き換えなきゃいけません。このデザインパターンだと実際にnewしている部分は1ヶ所なので一気に変更できます。DOM使ったことがある人はcreateTextNodeとかもFactoryパターン。

っと、2つ程書いてmakeが終わってしまったので今日はここまで。気が向いたらまた書くかも。

Comments

Name
ANONYMOUS
Datetime
2005-04-25T15:27:00+09:00
Message

「手続きを渡すメソッドを作って渡せばいくない?」っというツッコミ。

function BookShelf() {

this.books = new Array("空ノ鐘の響く惑星で", "半分の月がのぼる空", "君の嘘、伝説の君");

}

BookShelf.prototype.each = function (proc) {

for (var i = 0; i < this.books.length; i++)

proc(this.books[i]);

};

// 実際に使う側の処理

var shelfDemo = new BookShelf();

shelfDemo.each(function (book) {

print("『" + book + "』");

});

Name
tara
Datetime
2005-10-07T08:52:21+09:00
Message

//ローカル変数と内部クラスを使うと

//thisやprototypeの山をすっきり無くせます

//メモリは使いますけど....(^-^;

//java使いにはわかりやすくなります

BookShelf=function(){

var books = ["空ノ鐘の響く惑星で", //ローカル変数

"半分の月がのぼる空",

"君の嘘、伝説の君"]

this.getIterator=function(){

return new BookShelfIterator();

}

var BookShelfIterator=function() {//内部クラス

var counter = 0;

this.hasNext=function(){

if(counter<books.length){

return true;

} else {

return false;

}

}

this.next=function() {

var value = books[counter];

counter++;

return value;

}

}

}

// 実際に使う側の処理

var ShelfDemo = new BookShelf();

var ItrDemo = ShelfDemo.getIterator();

while(ItrDemo.hasNext()) {

alert("「"+ ItrDemo.next() + "」");

}

//単に書きやすいという意味で,デザパタの本質からは

//話がはずれていてすいませんです (^-^;;

Name
tara
Datetime
2005-10-07T09:02:41+09:00
Message

//ローカル変数と内部クラスを使うと

//thisやprototypeの山をすっきり無くせます

//メモリは使いますけど....(^-^;

//java使いにはわかりやすくなります

BookShelf=function(){

var books = ["空ノ鐘の響く惑星で", //ローカル変数

"半分の月がのぼる空",

"君の嘘、伝説の君"]

this.getIterator=function(){

return new BookShelfIterator();

}

var BookShelfIterator=function() {//内部クラス

var counter = 0;

this.hasNext=function(){

if(counter<books.length){

return true;

} else {

return false;

}

}

this.next=function() {

var value = books[counter];

counter++;

return value;

}

}

}

// 実際に使う側の処理

var ShelfDemo = new BookShelf();

var ItrDemo = ShelfDemo.getIterator();

while(ItrDemo.hasNext()) {

alert("「"+ ItrDemo.next() + "」");

}

//単に書きやすいという意味で,デザパタの本質からは

//話がはずれていてすいませんです (^-^;;

Trackbacks

Trackback Ping URI

http://yudai.arielworks.com/memo/2005/02/23/053637.trackback

末尾に「7 + 9」の計算結果を繋げて下さい。例えば計算結果が「17」の場合、「053637.trackback17」です。これは機械的なトラックバックスパムを防止するための措置です。

Post a comment

Name (optional)
Email address or URI (optional)
Do the math below (required to filter comment spams)
7 + 9 + 6 =
Message (required)
Submit
連絡先、リンク、転載や複製などについては『サイト案内』をご覧ください。Powered by HIMMEL

I ♥ Validator