Библиотечный дизайн - PullRequest
       0

Библиотечный дизайн

1 голос
/ 19 января 2010

Хорошо, поэтому я пишу библиотеку с открытым исходным кодом. Раздел этой библиотеки посвящен перемещению объекта в двух- и трехмерном пространстве, поэтому он будет иметь функции, которые управляют вращением, положением и т. Д.

Теперь, в идеале, я хотел бы, чтобы моя библиотека хорошо работала с другими библиотеками, в частности с такими вещами, как 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);
  }

так что тогда его можно использовать как:

rotate(4,modelFunction2,myPoint)

//or

rotate(4,modelFunction1,mySprite);

Я должен добавить, что в действительности я, как клиентский код, не смогу напрямую вызывать функцию поворота. Вместо этого, функция поворота, которую я хочу передать, должна быть где-то сохранена как член класса, а затем вызвана функцией поворота. Это просто меньше кода для меня, чтобы написать его, как указано выше.

Это мне кажется довольно гибким, хотя влияние производительности на приведение и передачу функций касается меня (но может быть в порядке). Может кто-нибудь еще предложить альтернативу или это то, что у меня есть наиболее логичное решение. Спасибо:)

1 Ответ

2 голосов
/ 19 января 2010

Я предлагаю шаблон адаптера.

В вашем случае вы могли бы определить интерфейсы, которые предлагают безопасные определения типов для того, что ожидает ваша библиотека, вместо того, чтобы иметь аргументы функции. затем вам нужно написать классы адаптера, которые реализуют интерфейсы ваших библиотек и обернуть, например, объект 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));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...