package com.loaderProxy
{
import flash.events.Event;
import flash.events.EventDispatcher;
import flash.events.HTTPStatusEvent;
import flash.events.IEventDispatcher;
import flash.events.IOErrorEvent;
import flash.events.ProgressEvent;
import flash.events.SecurityErrorEvent;
public class EventListenerProxy extends EventDispatcher
{
public function EventListenerProxy(target:IEventDispatcher=null)
{
super(target);
}
//event handel method
public var completeHandler:Function = function(event:Event):void {};
public var openHandler:Function = function(event:Event):void{};
public var progressHandler:Function = function(event:ProgressEvent):void{};
public var securityErrorHandler:Function = function(event:SecurityErrorEvent):void{};
public var httpStatusHandler:Function = function(event:HTTPStatusEvent):void{};
public var ioErrorHandler:Function = function(event:IOErrorEvent):void{};
public function addLoaderEventListener(target:IEventDispatcher):void
{
addEventListenerProxy(target , Event.COMPLETE ,completeHandler);
addEventListenerProxy(target , Event.OPEN, openHandler);
addEventListenerProxy(target , ProgressEvent.PROGRESS, progressHandler);
addEventListenerProxy(target , SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler);
addEventListenerProxy(target , HTTPStatusEvent.HTTP_STATUS, httpStatusHandler);
addEventListenerProxy(target , IOErrorEvent.IO_ERROR, ioErrorHandler);
}
public function removeLoaderEventListener(target:IEventDispatcher):void
{
removeEventListenerProxy(target , Event.COMPLETE ,completeHandler);
removeEventListenerProxy(target , Event.OPEN, openHandler);
removeEventListenerProxy(target , ProgressEvent.PROGRESS, progressHandler);
removeEventListenerProxy(target , SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler);
removeEventListenerProxy(target , HTTPStatusEvent.HTTP_STATUS, httpStatusHandler);
removeEventListenerProxy(target , IOErrorEvent.IO_ERROR, ioErrorHandler);
}
//EventListener Proxy
public function addEventListenerProxy(target:IEventDispatcher , type:String, listener:Function, useCapture:Boolean = false, priority:int = 0, useWeakReference:Boolean = false):void
{
target.addEventListener(type, listener, useCapture, priority, useWeakReference);
}
public function removeEventListenerProxy(target:IEventDispatcher , type:String, listener:Function, useCapture:Boolean = false):void
{
target.removeEventListener(type , listener , useCapture );
}
}
}
而更好的話將event handel method所有的method宣告到一個Interface,如此若是需要不同動作處理者,可實作該Interface來實現。
因此可以:
public var handel:IHandelMethod = new LoaderHandelMethod();
addEventListenerProxy(target , Event.COMPLETE ,handel.completeHandler);
如此程式碼可以簡化並能鬆綁個物件間之關係
2011年4月25日 星期一
2011年4月24日 星期日
Bad smells in Code:Duplicated Code
Duplicated Code (重複的程式碼)
Duplicated Code會讓程式不好維護,也會讓程式變的冗長,常見的重複狀況如下:
Duplicated Code會讓程式不好維護,也會讓程式變的冗長,常見的重複狀況如下:
- 一個Class內有兩個個函式具有相同的運算式,這時可以採用Extract Method
將其提煉出來成為一個函式。 - 兩個具有兄弟關係的Class(繼承同一個父類別),兩Class內存在相同運算式的函式,可以使用Pull Up Method方式,將其函式提煉出來放置父類別中,解決Duplicated Code。
- 兩個沒有關係的Class也會出現相同運算式的程式碼,可以考慮將這重複的運算式寫成另外一個Classb讓其運用,這感覺類似使用策略模式,或是過程代理。
2011年4月16日 星期六
MySQL5.1 DataType 日期 (Date)
資料名稱 | byte | 數值範圍 | 格式 | 說明 |
DATE | 3 | '1000-01-01'到'9999-12-31' | 'YYYY-MM-DD' | 日期:允許使用字串或數字為DATE分配值。 |
DATETIME | 8 | '1000-01-01 00:00:00'到'9999-12-31 23:59:59' | 'YYYY-MM-DD HH:MM:SS' | 日期和時間的組合: 允許使用字串或數字為DATETIME分配值。 |
TIMESTAMP(M) | 4 | '1970-01-01 00:00:00'到2037年 | 'YYYY-MM-DD HH:MM:SS' | 時間戳記:TIMESTAMP用於INSERT或UPDATE操作時記錄日期和時間。如果你不分配一個值,表中的第一個TIMESTAMP列自動設置為最近操作的日期和時間。也可以通過分配一個NULL值,將TIMESTAMP列設置為當前的日期和時間。 TIMESTAMP值返回後顯示為'YYYY-MM-DD HH:MM:SS'格式的字符串,顯示寬度固定為19個字符。如果想要獲得數字值,應在TIMESTAMP 列添加+0。註釋:MySQL 4.1以前使用的TIMESTAMP格式在MySQL 5.1中不支持。 |
TIME | 3 | '-838:59:59'到'838:59:59' | 'HH:MM:SS' | 時間:MySQL以'HH:MM:SS'格式顯示TIME值,但允許使用字串或數字為TIME列分配值。 |
YEAR (2|4) | 1 | 二位:70到69(1970~2069)。 四位:1901到2155和0000。 | YYYY | 兩位或四位格式的年。預設是四位格式。在四位格式中,允許的值是1901到2155和0000。在兩位格式中,允許的值是70到69,表示從1970年到2069年。 MySQL以YYYY 格式顯示YEAR值,但允許使用字串或數字為YEAR列分配值。 |
引用與參考資料:
MySQL官方文件
MySQL5.1 DataType 整數與浮點數
說明:
參考資料:
http://dev.mysql.com/doc/refman/5.1/zh/column-types.html#choosing-types
- M:要顯示的位數,最大有效範圍是255。
- D:要顯示的小數位數,最大可能的值是30,但是應該不大於M-2。
- M和D若省略,則會根據計算機硬體來決定。單精度精確約7位小數。
- 數值列指定ZEROFILL,MySQL會自動為該列加上UNSIGNED屬性。
- ZEROFILL,自動填0,若有個int(4)資料型態,若填入一個數值1那他會變成0001。
- UNSIGNED:表示無號數型態。
- 如果指定UNSIGNED,不允許負值。
資料名稱 | bit | 數值範圍 | 選項 | 說明 |
TINYINT (M) | 8 | 有號:-128~127 無號:0~255 | UNSIGNED、 ZEROFILL | |
SMALLINT(M) | 16 | 有號:-32768~32767 無號:0~65535 | UNSIGNED、ZEROFILL | |
MEDIUMINT(M) | 24 | 有號:-8388608~8388607 無號:0~16777215 | UNSIGNED、ZEROFILL | |
INT(M) | 32 | 有號:-2147483648~2147483647 無號:0~4294967295 | UNSIGNED、ZEROFILL | |
INTEGER(M) | 32 | 有號:-2147483648~2147483647 無號:0~4294967295 | UNSIGNED、ZEROFILL | |
BIGINT[(M)] | 64 | 有號:-9223372036854775808~9223372036854775807 無號:0~18446744073709551615 | UNSIGNED、ZEROFILL |
資料名稱 | bit | 數值範圍 | 選項 | 說明 |
FLOAT (M,D) | 32 | -3.402823466E+38到-1.175494351E-38、0和1.175494351E-38到3.402823466E+38。 | UNSIGNED、ZEROFILL | 單精度浮點數 |
DOUBLE (M,D) | 64 | -1.7976931348623157E+308到-2.2250738585072014E-308、0和2.2250738585072014E-308到 1.7976931348623157E+308。 | UNSIGNED、ZEROFILL | 雙精度浮點數 |
DOUBLE PRECISION(M,D) | 64 | UNSIGNED、ZEROFILL | DOUBLE同義詞 | |
REAL(M,D) | 32 | UNSIGNED、ZEROFILL | FLOAT同義詞 | |
FLOAT(p) | UNSIGNED、ZEROFILL | p表示精度(以位數表示),但MySQL只使用該值來確定是否結果列的資料型態為FLOAT或DOUBLE。如果p值是0~24,資料型態將為沒有M或D值得FLOAT。如果p值是25~53,則資料型態將為沒有M或D值得DOUBLE。 | ||
DECIMAL(M,D) | UNSIGNED、ZEROFILL | 壓縮的“嚴格”定點數。 M是小數位數(精度)的總數,D是小數點(標度)後面的位數。小數點和(負數)的'-'符號不包括在M中。如果D是0,則值沒有小數點或分數部分。 DECIMAL整數最大位數(M)為65。支持的十進制數的最大位數(D)是30。如果D被省略, 預設是0。如果M被省略, 預設是10。 | ||
DEC(M,D) | UNSIGNED、ZEROFILL | DECIMAL的同義詞 | ||
NUMERIC(M,D) | UNSIGNED、ZEROFILL | DECIMAL的同義詞 | ||
FIXED(M,D) | UNSIGNED、ZEROFILL | FIXED同義詞適用於與其它服務器的兼容性。 |
參考資料:
http://dev.mysql.com/doc/refman/5.1/zh/column-types.html#choosing-types
2011年4月14日 星期四
PHP字串連接
PHP中字串連接是使用點 .
<?php
$stringA = "Hello World" ;
$stringB = " JT";
echo $stringA . $stringB;
?>
Java & C# & Actionscript 可使用 + 運算子來連接字串
2011年3月28日 星期一
善用API
除非有比API更快速的演算否則請善用底層API
以下將會慢慢紀錄收集下去
養成習慣
計算兩點距離
Point.distance(pt1, pt2);
String的API應用得好遠比你自己寫for迴圈還快,內層API是開發flashPlayer的語言寫出來的,若你用AS3來跑等於多了一層包覆,將會慢了許多。
以下將會慢慢紀錄收集下去
養成習慣
- 當你對API不熟時,養成一種習慣,遇到問題實,可以先看API文件,別急著實作演算出來。
- 有些API演算效能不好,這些需要經驗,如Math系列的取絕對值,這些是可以在網路上搜尋。
- 這些都是可以做實驗驗證的。
- API利用得當將使你少寫很多碼,也使你程式簡潔許多。
計算兩點距離
Point.distance(pt1, pt2);
String的API應用得好遠比你自己寫for迴圈還快,內層API是開發flashPlayer的語言寫出來的,若你用AS3來跑等於多了一層包覆,將會慢了許多。
Pixel Bender RGB 調整Demo
//Pixel Bender 檔名 RGB.pbj
<languageVersion : 1.0;>
kernel RGBFilter
< namespace : "jt.com.tw";
vendor : "jt";
version : 1;
description : "";
>
{
input image4 src;
output pixel4 dst;
//parameter的<>是可無的,有的話是限制輸入數值
parameter float amount
<
minValue: 0.0;
maxValue: 1.0;
defaultValue: 0.5;
>;
parameter float red
<
minValue: -1.0;
maxValue: 1.0;
defaultValue: 0.0;
>;
parameter float green
<
minValue: -1.0;
maxValue: 1.0;
defaultValue: 0.0;
>;
parameter float blue
<
minValue: -1.0;
maxValue: 1.0;
defaultValue: 0.0;
>;
void
evaluatePixel()
{
//取樣32bit
//old method
dst = sampleNearest(src,outCoord());
dst.r += (red*amount);
dst.b += (green*amount);
dst.g += (blue*amount);
}
}
//Flex 程式碼如下
<languageVersion : 1.0;>
kernel RGBFilter
< namespace : "jt.com.tw";
vendor : "jt";
version : 1;
description : "";
>
{
input image4 src;
output pixel4 dst;
//parameter的<>是可無的,有的話是限制輸入數值
parameter float amount
<
minValue: 0.0;
maxValue: 1.0;
defaultValue: 0.5;
>;
parameter float red
<
minValue: -1.0;
maxValue: 1.0;
defaultValue: 0.0;
>;
parameter float green
<
minValue: -1.0;
maxValue: 1.0;
defaultValue: 0.0;
>;
parameter float blue
<
minValue: -1.0;
maxValue: 1.0;
defaultValue: 0.0;
>;
void
evaluatePixel()
{
//取樣32bit
//old method
dst = sampleNearest(src,outCoord());
dst.r += (red*amount);
dst.b += (green*amount);
dst.g += (blue*amount);
}
}
//Flex 程式碼如下
訂閱:
文章 (Atom)