将一个类分成更小的类?

时间:2014-01-31 13:28:42

标签: actionscript-3 flash class adobe

我有这个想法将我的课程分成具有特定任务的小课程,以便我以后可以更轻松地使用它们。

这是一个要拆分的示例类:

package  {

import flash.display.MovieClip;
import flash.events.Event;
import flash.events.MouseEvent;
import flash.events.KeyboardEvent;
import flash.ui.Keyboard;
import flash.display.Stage;

public class m4w extends MovieClip {
    public var upPressed:Boolean = false;
    public var downPressed:Boolean = false;
    public var leftPressed:Boolean = false;
    public var rightPressed:Boolean = false;
    public var lastMove:String;
    public static var spd:Number=6;
    public var ttt:MovieClip;


    public function m4w(stageRef:Stage, dtct:MovieClip) {
        addEventListener(Event.ENTER_FRAME, fl_MoveInDirectionOfKey);
        stageRef.addEventListener(KeyboardEvent.KEY_DOWN, fl_SetKeyPressed);
        stageRef.addEventListener(KeyboardEvent.KEY_UP, fl_UnsetKeyPressed);
        ttt=dtct;

    }
    //Movement
    public function fl_MoveInDirectionOfKey(event:Event){
        if (leftPressed){
            x -= spd;
            lastMove="left";
            detectPlayer();
            if(wlk.currentFrame < 18 || wlk.currentFrame > 24){
                wlk.gotoAndPlay(17);
            }
        }else
        if (rightPressed){
            x += spd;
            lastMove="right";
            detectPlayer();
            if(wlk.currentFrame < 26 || wlk.currentFrame > 31){
                wlk.gotoAndPlay(25);
            }
        }else
        if (upPressed){
            y -= spd;
            lastMove="up";
            detectPlayer();
            if(wlk.currentFrame < 10 || wlk.currentFrame > 16){
                wlk.gotoAndPlay(9);
            }
        }else
        if (downPressed){
            y += spd;
            lastMove="down";
            detectPlayer();
            if(wlk.currentFrame < 2 || wlk.currentFrame > 8){
                wlk.gotoAndPlay(1);
            }
        }
    }
    public function fl_SetKeyPressed(event:KeyboardEvent):void{
        switch (event.keyCode){
            case 87:
            case 38:{
                upPressed = true;
                break;
            }
            case 83:
            case 40:{
                downPressed = true;
                break;
            }
            case 65:
            case 37:{
                leftPressed = true;
                break;
            }
            case 68:
            case 39:{
                rightPressed = true;
                break;
            }
        }
    }
    public function fl_UnsetKeyPressed(event:KeyboardEvent):void{
        switch (event.keyCode){
            case 87:
            case 38:{
                upPressed = false;
                break;
            }
            case 83:
            case 40:{
                downPressed = false;
                break;
            }
            case 65:
            case 37:{
                leftPressed = false;
                break;
            }
            case 68:
            case 39:{
                rightPressed = false;
                break;
            }
        }
    }
    //Movement
    public function detectPlayer(){
        if (ttt.hitTestPoint(x, y, true)){ 
            if( lastMove == "right"){
                x -= spd;
            }
            if( lastMove == "left"){
                x += spd;
            }
            if( lastMove == "up"){
                y += spd;
            }
            if( lastMove == "down"){
                y -= spd;
            }
        }
    }
}
}

这是一个具有3个任务运动/控制运动图形/碰撞检测的典当类。 现在的问题是专业人士将如何做到这一点?或者它是一个好主意?

另外一个问题是,当我将它们分成不同的类时,最好的方法是将它们的功能主义者添加到一个类中吗?我知道可以让课程相互延伸,直到最后一堂课具有所有属性,但我不认为这是最好的方式。

谢谢^ _ ^

1 个答案:

答案 0 :(得分:1)

该示例类非常小,直接且逻辑上包容。就可重用性而言,您真正在寻找灵活性,这种灵活性是通过类设计和结构来处理的。因此,使用示例类m4w,您可以删除detectPlayer()并将其放在父类中,我将其称为Collidables。然后,您可以将该函数重命名为更通用,看起来像:

class Collidables extends MovieClip {

    public function hitPointCollision( obj:DisplayObject, p:Point, callback:Function=null ):Boolean {
        if ( obj.hitTestPoint( p.x, p.y, true ) ) {
            if ( callback != null ) {
                callback();
            }
            return true;
        }
        return false;
    }
}

这是非常基础的,但是提供了任何继承自Collidables并使用hitPointCollision()的类。

您也可以将处理控件的侦听器移动到一个名为“Controller”的单独类中,该类将决定在按下指定键时要执行的操作。这也是所谓的MVC或模型视图控制器设计模式的开始,您可以在此处找到它:Design Patterns AS3.0 - MVC

当您正在寻找方案的灵活性和可扩展性时,您将从设计模式及其如何用于解决各种问题中受益。上面提到的链接有一些关于设计模式的细节,或者看看GOF(Gang of Four)设计模式,因为它就是这样开始的:Gang of Four: Design Patterns