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");
「その都度itemをnewすればよくね?」とか。いやいや、そうすると、クラス「Item」が「NewItem」に変更されたらその部分全部書き換えなきゃいけません。このデザインパターンだと実際にnewしている部分は1ヶ所なので一気に変更できます。DOM使ったことがある人はcreateTextNodeとかもFactoryパターン。
っと、2つ程書いてmakeが終わってしまったので今日はここまで。気が向いたらまた書くかも。
「手続きを渡すメソッドを作って渡せばいくない?」っというツッコミ。
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 + "』");
});
//ローカル変数と内部クラスを使うと
//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() + "」");
}
//単に書きやすいという意味で,デザパタの本質からは
//話がはずれていてすいませんです (^-^;;
//ローカル変数と内部クラスを使うと
//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() + "」");
}
//単に書きやすいという意味で,デザパタの本質からは
//話がはずれていてすいませんです (^-^;;
http://yudai.arielworks.com/memo/2005/02/23/053637.trackback
末尾に「7 + 9」の計算結果を繋げて下さい。例えば計算結果が「17」の場合、「053637.trackback17」です。これは機械的なトラックバックスパムを防止するための措置です。