Концептуальный вопрос: слабая связь - PullRequest
2 голосов
/ 25 ноября 2008

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

Основной класс - это Board, который является канвой, отвечающей за обработку событий мыши при рисовании фигур. Он также имеет переменные контекста, такие как currentShape или snapFlag, для активации магнетизма сетки.

Для обработки перемещения / изменения размера / поворота фигур они наследуются от стороннего инструмента с открытым исходным кодом под названием ObjectHandles (flex).

У меня есть базовый класс BaseShape, расширяющий ObjectHandles для переопределения некоторых его внутренних функций, например, функции onMove.

При создании фигуры (мышь вниз, движение, мышь вверх) Совет обрабатывает ее и знает о своем собственном флаге привязки.

var mouseUpPoint: Point = boardCanvas.globalToLocal (новая точка (event.stageX, event.stageY)); var snapMouseUpPoint = snapPoint (mouseUpPoint.x, mouseUpPoint.y);

В моем методе overidden onMove я бы хотел, чтобы фигура знала флаг привязки Board и когда он менялся. Как мне это сделать?

Передать ли я Board в качестве параметра в конструкторе basicShape, чтобы я мог проверить привязку?

Передам ли я флаг как параметр и каким-то образом заставлю все формы прислушиваться к изменениям?

Какое самое чистое решение?

Большое спасибо.

Ответы [ 7 ]

1 голос
/ 25 ноября 2008

Не зная вашего приложения:

Возможно ли для Shape когда-либо иметь свое собственное "привязанное" поведение? То есть форма может быть исключена из привязки, а другие нет? Если это так, сделайте snapFlag членом Shape. Когда SnapFlag установлен на доске, выполните итерацию ваших фигур и установите или не устанавливайте в соответствии с вашими правилами.

Если поведение привязки применяется ко всем фигурам на плате, рассмотрите модель, управляемую событиями (если она доступна - я Flex noob). Когда Shape перемещается, он вызывает событие OnMove. Затем Правление может ответить и принять решение «привязать» Форму к месту, если это необходимо.

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

1 голос
/ 25 ноября 2008

Я бы подошел к этому под немного другим углом. Я предполагаю, что объект Board сначала отлавливает события мыши, чтобы он мог решить, на какой фигуре щелкнули. Я хотел бы, чтобы движения ловушки на доске также передавали правильные (привязанные или не привязанные) координаты «вниз» к выбранному Shape объекту, а не позволяли объекту формы выяснить это.

Это оставляет обработку привязки сетки к Board, и ваш метод Shape объекта onMove остается свободным от беспорядка.

0 голосов
/ 19 марта 2010

Используйте ObjectHandles версии 2, а затем создайте ограничение, чтобы делать то, что вы хотите.

0 голосов
/ 25 ноября 2008

Решил это так:

Поскольку я переопределил onMouseMove в своем классе baseShape и использую платформу PureMVC, я только что сообщил baseShape о моем BoardMediator.

переопределить защищенную функцию onMouseMove (событие: MouseEvent): void { [...]

// added on override
var board:BoardMediator = ApplicationFacade.getInstance().retrieveMediator(BoardMediator.NAME) as BoardMediator;

Тогда

desiredPos = board.snapPoint(desiredPos.x, desiredPos.y);

Может быть, не очень красиво, но это работает, о Переопределение метода globalToLocal в моем представлении на плате тоже сработало, но внутри onMouseMove было выполнено еще несколько вычислений, в результате чего произошло мгновенное перемещение вне выравнивания.

0 голосов
/ 25 ноября 2008

OnMouseMove ObjectHandles

        protected function onMouseMove(event:MouseEvent) : void
    {
        if( ! visible ) { return; }

        if( ! event.buttonDown )
        {
            setMouseCursor( event.stageX, event.stageY );
            return;
        }

        if(parent == null )
        {
            return;
        }


        var dest:Point = parent.globalToLocal( new Point(event.stageX, event.stageY) );
        var desiredPos:Point = new Point();
        var desiredSize:Point = new Point();
        var desiredRotation:Number = 0; 

... plenty more
then 

            if( wasMoved ) {    dispatchMoving() ; }
            if( wasResized ) {  dispatchResizing() ; }
            if( wasRotated ) {  dispatchRotating(); }

Так что я не могу прослушать событие перемещения и сказать доске, чтобы оно щелкнуло, поскольку фигура уже свободно перемещается. Я должен добавить оснастку здесь:

var dest: Point = parent.globalToLocal (новая точка (event.stageX, event.stageY));

Все фигуры следуют правилу привязки, один и тот же щелчок не может быть, а другой свободен.

0 голосов
/ 25 ноября 2008

Передача флага в качестве параметра для конструктора фигур. Но это не будет хорошо, так как флаг будет меняться, и я должен сделать каждую фигуру, чтобы обновить копию своего флага при изменении.

Это правда, что ответственность за форму не в том, чтобы уметь обрабатывать события мыши. Но это то, что делают ObjectHandles: реагируют на события, обновляют параметр поворота ширины по высоте фигуры.

Может быть, я должен передать часть библиотечного кода в моем классе доски для обработки выбора формы и перемещения / изменения размера / вращения.

0 голосов
/ 25 ноября 2008

Просто пытаюсь думать вместе с тобой .. Я не вижу ничего особенного в Shapes, имеющих интерфейс IBoard. Хотя мне не нравится идея, что они должны проверять флаг на доске ...

Как бы вы передали флаг в качестве параметра? В методе OnMove ()? не очень хорошо понял это ... не могли бы вы расширить?

Хотя .. Если вы попытаетесь немного подумать о SRP - принципе единой ответственности ... какова ответственность классов Shape? Да, это то, что eJames уже написал.

Мне кажется, что их главная ответственность, вероятно, не в том, чтобы обрабатывать события мыши ... здесь нужно больше узнать о вашем приложении, но мое общее чувство заключается в том, почему никто другой не сломает эту мышь, а затем выяснит, что должна делать форма делать с ним, например, вызывать Draw () для Shape с новыми координатами?

Допустим, вы хотите применить что-то вроде составного шаблона (фигуры внутри фигур ...), и вы хотите, чтобы они могли сами обрабатывать эти события мыши ... но потом Тогда было бы логично, если бы они воспринимали это событие мыши в своих локальных координатах, но тогда я думаю, что вы должны предоставить всю информацию через это событие (локальные координаты, состояние мыши ...), чтобы им не приходилось запрашивать " глобальные переменные на доске ...

...