Posted
Filed under Action Script

[원문] : http://koko8829.tistory.com/304

싱글톤 패턴 사용하기 미투데이로 한마디트위터로 한마디

인사이드플렉스 2008/01/02 22:47

translate this to English (via Google)
この文を日本語で翻訳 (NAVERを通じて)
소스를 보다가 싱글톤 패턴이 적용된 내용을 보았습니다.
저야 아이들 아빠니깐 그다지 싱글에는 관심이 없었지만..ㅎㅎ
(새해부터 죄송합니다. 이런 무리한 글을..ㅠㅠ)

사실 패턴 관련해서는 GoF 의 디자인 패턴부터 Java 언어로 배우는.., 자바디자인패턴과 리팩토링 등등 많은 책을 보유하고 있으나 제대로 읽고 적용해본 내용이 없더군요.
그나마 최근 읽고 있는 '패턴 그리고 객체지향적 코딩의 법칙/문우식/한빛미디어' 에서
위안이 되는 글을 찾았습니다.

더 정확히 이야기하면 불필요한 부분에 패턴을 적용하기 위해 머리를 싸매지 마라.
여러분들은 객체지향 프로그래밍을 하는 것이지 패턴 프로그래밍을 하는 것이 아니다.
경험이라는 이름의 시행착오를 거치지 않고는 아무리 패턴을 많이 사용해도 절대 좋은 코드를 얻을 수 없다는 점을 알아야 한다.

그래 아직 경험이 부족한 탓이구나...~~ 라고..

본론을 이야기하면 ActionScript 3 에서는 싱글톤 패턴을 구현할때 Java 와 같이 구현할 수가 없습니다.
일반적으로 Java 에서는 생성자에서 private 을 사용하여 싱글톤 패턴을 만든다고 하더군요.
하지만 ActionScript 3 에서는 생성자에서 public 을 사용하여야만 합니다.
private 나 protected 를 사용하지 못한다는 것이지요.
때문에 싱글톤 패턴을 구현하기 위하여 일종의 꽁수가 들어갑니다.

이렇게 된 원인(?)은 ActionScript 3 개발당시에 ECMA 4th edition(자바스크립트 2) 의 스펙이 아직 확정되지 않았기때문에 잠정적인 위험을 배제하기 위하여 어쩔 수 없는 선택이었던것 같습니다.
AS3 -- on the lack of private and protected constructors
http://weblogs.macromedia.com/sho/archives/2006/04/as3_--_on_the_l.cfm

하지만 아직 자바스크립트 2 의 스펙이 다 제정된것은 아니지만 해당 생성자에 대한 부분은
처리가 된것 같군요.
해당 부분을 어떻게 처리할지 모르겠으나 조만간 반영이 되지 않을까 생각해봅니다.
(Resolved) Private constructors are useful, common, and need to be supported
http://bugs.ecmascript.org/ticket/166

하지만 아직은 지원되는게 아니니깐.
필요하시다면
AS3.0 Better Singletons
http://blog.pixelbreaker.com/flash/as30-better-singletons/
  1.     
  2. package 
  3. {  
  4.     public class Singleton  
  5.     {  
  6.         public static var instance:Singleton;  
  7.  
  8.         public static function getInstance():Singleton  
  9.         {  
  10.             if( instance == null )  
  11.             {  
  12.                 instance = new Singleton( new SingletonEnforcer() );  
  13.             }  
  14.             return instance;  
  15.         }  
  16.  
  17.         public function Singleton( pvt:SingletonEnforcer )  
  18.         {  
  19.             // init class  
  20.         }  
  21.     }  
  22. }  
  23.  
  24. internal class SingletonEnforcer{}  


또는 아래 에서 제안하는 형식을 따라주면 될것 같습니다.
AS3 Singletons, the other way
http://www.nulldesign.de/2007/11/20/as3-singletons-the-other-way/
  1.    
  2. package {  
  3.     public class Singleton {  
  4.         private static var instance:Singleton;  
  5.         private static const checker:Object = {};  
  6.  
  7.         public function Singleton(initObj:Object) {  
  8.             if(initObj != checker) {  
  9.                 throw new Error("Private constructor!");  
  10.             }  
  11.         }  
  12.  
  13.         public static function getInstance():Singleton {  
  14.             if(instance == null) {  
  15.                 instance = new Singleton(checker);  
  16.             }  
  17.             return instance;  
  18.         }  
  19.     }  
  20. }  
2010/04/26 10:55 2010/04/26 10:55
Posted
Filed under Action Script
[원문]: http://marumushi.com/tags/as3


package {
   import flash.display.MovieClip;
   import flash.display.StageAlign;
   import flash.display.StageScaleMode;
   public class Test extends MovieClip {
      // be sure this is pointing to an image in your hardrive
      [Embed(source='c:\images\whatsup.jpg')] public var MyImage:Class;
      public function Test() {
         stage.align     = StageAlign.TOP_LEFT;
         stage.scaleMode = StageScaleMode.NO_SCALE;
         var img:MyImage = new MyImage();
         addChild(img);
      }
   }
}
2010/04/26 10:16 2010/04/26 10:16
Posted
Filed under Action Script
[원문]: http://marumushi.com/tags/as3

package {

import flash.util.describeType;
import flash.display.MovieClip;
import flash.display.TextField;
import flash.text.TextFormat;
import flash.text.AntiAliasType;
 
   public class Test extends MovieClip {
   
      // be sure this is pointing to a ttf font in your hardrive
      [Embed(source="C:\WINDOWS\Fonts\somefont.ttf", fontFamily="foo")]
      public var bar:String;
     
      public function Test() {
               
          var format:TextFormat      = new TextFormat();
          format.font      = "foo";
          format.color                = 0xFFFFFF;
          format.size                 = 130;

          var label:TextField         = new TextField();
          label.embedFonts            = true;
          label.autoSize              = TextFieldAutoSize.LEFT;
          label.antiAliasType         = AntiAliasType.ADVANCED;
          label.defaultTextFormat     = format;
          label.text                  = "Hello World!";
          addChild(label);
       }
    }
}
2010/04/26 10:15 2010/04/26 10:15
Posted
Filed under Action Script

[원문]: http://club.filltong.net/codingdojo/23224


package
{
  import flash.utils.ByteArray;

  public class FindPermutation
  {
    protected var s:String = "abcdefgh";
    protected var dict:Array = [];

    public function FindPermutation()
    {
      makeDict();
    }

    public function makeDict():void
    {
      var arr:Array = s.split("");
      dict = permutation(arr)
      dict.map(function(element:*, index:int, arr:Array):void { arr[index] = (element as Array).join("") });
    }

    public function find(words:String):Number
    {
      return dict.indexOf(words) + 1;
    }

    protected function permutation(array:Array):Array
    {
      if(array.length == 1) {
        return [array];
      }

      var result:Array = [];

      array.forEach(function(element:*, index:int, arr:Array):void {
        var tmp:Array = cloneArray(arr);
        tmp.splice(index,1);
        permutation(tmp).forEach(function(e:*, i:int, a:Array):void {
          result.push([element].concat(e));
        });
      });
      return result;
    }

    protected function cloneArray(src:*):* {
      var result:ByteArray = new ByteArray();
      result.writeObject(src);
      result.position = 0;
      return(result.readObject());
    }
  }

2010/04/23 19:54 2010/04/23 19:54
Posted
Filed under Action Script
flash에 서 파일 다운로드  by php

ac2.0
getURL("dl.php?file=chat6.zip", "_self");
ac3.0
NavigateToURL()

<?
// downloading a file use http://somewhere.com/download.php?filename=name of file

$filename = $_GET['file'];
if(!$filename){ echo "ERROR: No filename specified. Please try again."; }
else {

// fix for IE catching or PHP bug issue
header("Pragma: public");
header("Expires: 0"); // set expiration time
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
// browser must download file from server instead of cache

// force download dialog
header("Content-Type: application/force-download");
header("Content-Type: application/octet-stream");
header("Content-Type: application/download");

// use the Content-Disposition header to supply a recommended filename and
// force the browser to display the save dialog.
header("Content-Disposition: attachment; filename=".basename($filename).";");

header("Content-Transfer-Encoding: binary");

$root_path = "./audio/";

$myfile = $root_path . $filename;

//header("Content-Length: ".filesize($myfile));

readfile("$myfile");
exit();
}

?>
2010/04/23 11:48 2010/04/23 11:48
Posted
Filed under Action Script
flash에 서 파일 다운로드  by php

ac2.0
getURL("dl.php?file=chat6.zip", "_self");
ac3.0
NavigateToURL()

<?

// downloading a file use http://somewhere.com/download.php?filename=name of file

$filename = $_GET['file'];
if(!$filename){ echo "ERROR: No filename specified. Please try again."; }
else {

// fix for IE catching or PHP bug issue
header("Pragma: public");
header("Expires: 0"); // set expiration time
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
// browser must download file from server instead of cache

// force download dialog
header("Content-Type: application/force-download");
header("Content-Type: application/octet-stream");
header("Content-Type: application/download");

// use the Content-Disposition header to supply a recommended filename and
// force the browser to display the save dialog.
header("Content-Disposition: attachment; filename=".basename($filename).";");

header("Content-Transfer-Encoding: binary");

$root_path = "./audio/";

$myfile = $root_path . $filename;

//header("Content-Length: ".filesize($myfile));

readfile("$myfile");
exit();
}

?>
2010/04/23 11:47 2010/04/23 11:47
Posted
Filed under Action Script

[원문] : http://www.isgoodstuff.com/2008/06/10/actionscript-30-buttons-and-drag-drop/
 
actionscript 3.0에서 ....

MovieClipName.addEventListener(MouseEvent.MOUSE_DOWN,DragStart);
MovieClipName.addEventListener(MouseEvent.MOUSE_UP,DragStop);
function DragStart(event:Event){
	trace("Drag Started!");
	event.target.startDrag(false);
}
 
function DragStop(event:Event){
	trace("Drag Stoped!");
	event.target.stopDrag();
}
2010/04/20 15:44 2010/04/20 15:44
Posted
Filed under Action Script


ac3.0 에서 포커스를 설정 하기 위해서 스테이지에 있는 포커스 타겟을 지정 해 줘야 한다.

stage.focus = DisplayObject

2010/04/15 14:41 2010/04/15 14:41
Posted
Filed under Action Script
[원문] http://livedocs.adobe.com/flash/9.0/ActionScriptLangRefV3/String.html
 actionscript 3.0작업중 trim 관련 함수를 찾아 보다 . 라이브러리에서 trim, replace  함수 구현 되어 있는
것을 발견 하게 되었음 .

package {
    import flash.display.Sprite;

    public class StringExample extends Sprite {
        public function StringExample() {
            var companyStr:String = new String("     Company X");
            var productStr:String = "Product Z Basic     ";
            var emptyStr:String = " ";
            var strHelper:StringHelper = new StringHelper();

            var companyProductStr:String = companyStr + emptyStr + productStr;
            trace("'" + companyProductStr + "'");    // '     Company X Product Z Basic     '

            companyProductStr = strHelper.replace(companyProductStr, "Basic", "Professional");
            trace("'" + companyProductStr + "'");    // '     Company X Product Z Professional     '

            companyProductStr = strHelper.trim(companyProductStr, emptyStr);
            trace("'" + companyProductStr + "'");    // 'Company X Product Z Professional'
        }
    }
}

class StringHelper {
    public function StringHelper() {
    }

    public function replace(str:String, oldSubStr:String, newSubStr:String):String {
        return str.split(oldSubStr).join(newSubStr);
    }

    public function trim(str:String, char:String):String {
        return trimBack(trimFront(str, char), char);
    }

    public function trimFront(str:String, char:String):String {
        char = stringToCharacter(char);
        if (str.charAt(0) == char) {
            str = trimFront(str.substring(1), char);
        }
        return str;
    }

    public function trimBack(str:String, char:String):String {
        char = stringToCharacter(char);
        if (str.charAt(str.length - 1) == char) {
            str = trimBack(str.substring(0, str.length - 1), char);
        }
        return str;
    }

    public function stringToCharacter(str:String):String {
        if (str.length == 1) {
            return str;
        }
        return str.slice(0, 1);
    }
}

StringHelper 클래스의 함수들이 static 타입이 아님으로 이렇게 사용 하면 오류가 발생 한다.
static타입으로 선언후 사용 하자 .



class StringHelper {
 
  public static function replace(str:String, oldSubStr:String, newSubStr:String):String {
   return str.split(oldSubStr).join(newSubStr);
  }
 
  public static function trim(str:String, char:String):String {
   return trimBack(trimFront(str, char), char);
  }
 
  public static function trimFront(str:String, char:String):String {
   char = stringToCharacter(char);
   if (str.charAt(0) == char) {
    str = trimFront(str.substring(1), char);
   }
   return str;
  }
 
  public static function trimBack(str:String, char:String):String {
   char = stringToCharacter(char);
   if (str.charAt(str.length - 1) == char) {
    str = trimBack(str.substring(0, str.length - 1), char);
   }
   return str;
  }
 
  public static function stringToCharacter(str:String):String {
   if (str.length == 1) {
    return str;
   }
   return str.slice(0, 1);
  }
 }

2010/04/15 13:08 2010/04/15 13:08
Posted
Filed under Action Script

'allowFullScreen', 'false',

'allowScriptAccess','sameDomain',

'movie', 'passtest',

'salign', "

); //end AC code

}

</script>

<noscript>

<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,0,0" width="550" height="400" id="passtest" align="middle">

<param name="allowScriptAccess" value="sameDomain" />

<param name="allowFullScreen" value="false" />

<param name="movie" value="passtest.swf" /><param name="quality" value="high" /><param name="bgcolor" value="#ffffff" /> <embed src="passtest.swf" quality="high" bgcolor="#ffffff" width="550" height="400" name="passtest" align="middle" allowScriptAccess="sameDomain" allowFullScreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" />

</object>

</noscript>

Assuming you want to pass the variable kittens=wonderful, because they are, this needs to be changed to (note changes in bold text):

<script language="javascript">

if (AC_FL_RunContent == 0) {

alert("This page requires AC_RunActiveContent.js.");

} else {

AC_FL_RunContent(

'codebase', 'http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,0,0',

'width', '550',

'height', '400',

'src', 'passtest',

'quality', 'high',

'pluginspage', 'http://www.macromedia.com/go/getflashplayer',

'align', 'middle',

'play', 'true',

'loop', 'true',

'scale', 'showall',

'wmode', 'window',

'devicefont', 'false',

'id', 'passtest',

'bgcolor', '#ffffff',

'name', 'passtest',

'menu', 'true',

'allowFullScreen', 'false',

'allowScriptAccess','sameDomain',

'movie', 'passtest?kittens=wonderful',

'salign', "

); //end AC code

}

</script>

<noscript>

<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,0,0" width="550" height="400" id="passtest" align="middle">

<param name="allowScriptAccess" value="sameDomain" />

<param name="allowFullScreen" value="false" />

<param name="movie" value="passtest.swf?kittens=wonderful" /><param name="quality" value="high" /><param name="bgcolor" value="#ffffff" /> <embed src="passtest.swf?kittens=wonderful" quality="high" bgcolor="#ffffff" width="550" height="400" name="passtest" align="middle" allowScriptAccess="sameDomain" allowFullScreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" />

</object>

</noscript>

The key bit not mentioned in the documentation is the first change in the first script block. The querystring needs to be appended to the movie (not SRC) parameter, and without the .swf in the filename.

Once this is done the variable kittens will now be available as _root.kittens. You can append several variables as you would in HTML (?thisvar=that&theother=somethingelse), and all must be URL encoded.

And that's it. Normal cats photos / train company problem posts will resume immediately.

Tags: , , , ,

2010/04/09 18:52 2010/04/09 18:52