2010-01-19 7 views
1

좋아, 그래서 오픈 소스 라이브러리를 쓰고 있어요. 이 라이브러리의 섹션에서는 2 차원 및 3 차원 공간에서 엔티티를 이동시켜 회전, 위치 등을 조작하는 함수를 처리합니다.도서관 디자인의 곤란

이제는 다른 라이브러리와 특히 잘 작동하도록하고 싶습니다. Papervision3D 및 다른 Flash 3D 엔진과 같은 것들이 있지만 Sprite 또는 Movieclip과 같은 기본 이미지 객체는 잊어 버리지 않습니다.

제 궁금한 점입니다. 엔티티를 조작 할 함수는 기본 모델 데이터의 값을 수정해야합니다 (Sprite, Papervision 객체 등). 내 라이브러리를 유연하게 만들어 여러 데이터 모델을 지원할 수있는 가장 좋은 방법은 무엇입니까? 성능 또한 중요한 측면입니다.

현재 나는이 같은 것을 생각하고

: 그럼

//this is the public function that I expose in my library 
    public function rotate(val:Number,func:Function,objData:*):void 
    { 
func(val,objData); 
    } 

    //example of a function that could be passed in 
    //this one will rotate a MovieClip 
    private function modelFunction1(rot:Number,objData:*):void 
    { 
var myMov:MovieClip = objData as MovieClip; 
myMov.rotation = rot; 
    } 

    //second example of a function that could be pass in 
    //this one will rotate a point 
    private function modelFunction2(rot:Number,objData:*):void 
    { 
    //yes I know this piece of code makes no sense :P 
    var p:Point = objData as Point; 
    p.x = Math.cos(rot); 
    p.y = Math.sin(rot); 
    } 

을이처럼 사용할 수있다 : 나는 클라이언트 코드로, 현실 I에 그를 추가해야

rotate(4,modelFunction2,myPoint) 

//or 

rotate(4,modelFunction1,mySprite); 

, 원 회전 기능을 직접 호출 할 수 없습니다. 대신에 전달하고자하는 rotate 함수는 클래스 멤버로 어딘가에 저장 한 다음 rotate 함수에 의해 호출되어야합니다. 위와 같이 작성하는 코드가 적습니다.

캐스팅과 퍼포먼스가 성능에 미치는 영향이 걱정 스럽지만 (이것은 괜찮을 것입니다.) 다른 사람이 대안을 제안하거나 내가 가장 논리적 인 해결책을 제시 할 수 있습니까? 감사합니다 :)

답변

2

나는 어댑터 패턴을 제안합니다.

경우에 따라 함수 인수 대신 라이브러리에서 기대하는 유형에 대해 유형 안전 정의를 제공하는 인터페이스를 정의 할 수 있습니다. 그러면 라이브러리 인터페이스를 구현하는 어댑터 클래스를 작성하고 예를 들어 papervision 객체를 랩핑하고 인터페이스 메소드에 대한 함수 호출을 papervision 객체에 위임해야합니다.

interface IRotatatable { 
    function rotate(deg : Number) : void 
} 

class YourLibraryClass { 

    public function rotate(r : IRotatatable, val : Number):void { 
     r.rotate(val) 
    } 
} 


class P3DAdapter implements IRotatable { 
    public function P3DAdapter(p3d : SomePaperVisionObject) { 
     _p3d = p3d; 
    } 

    public function rotate(r :Number):void { 
     p3d.rot = r; 
    } 
} 


function someClientCode():void { 
    var adapter : IRotatable = new P3DAdapter(p3d) 
    new SomeLibraryClass().rotate(adapter, val)); 
} 
+0

이것은 정확히 내가 본 것입니다. 감사 :) – Allan