1
@Override
public void onMotionSensingEvent( MotionSensingEvent arg0) {

    double gradient = 1.38;
    double speed;

    float testpitch = 0;
    testpitch = arg0.getOrientation().getPitch();

    float testroll = 0;
    testroll = arg0.getOrientation().getRoll();


    if (testroll > 16 && flyingControl)
    {
        speed = gradient*testroll-22.1;
        System.out.println("kanan = " + speed);
        ardrone.goRight(speed);
    }
    else if (testroll < (-24) && flyingControl)
    {
        speed = gradient*testroll*-1 - 22.1;
        System.out.println("kiri = " + speed);
        ardrone.goLeft(speed);
    }
    else if (testpitch < (-20) && flyingControl)
    {
        System.out.println("go up");
        ardrone.up();
    }
    else if (testpitch > 20 && flyingControl)
    {
        System.out.println("go down");
        ardrone.down();
    }       
}

@Override
public void onExpansionEvent(ExpansionEvent e)
{
    JoystickEvent joy = getJoystickEvent(e);

    float gradient =64;
    float speed;

    float angle = 0;
    angle = joy.getAngle();
    float magnitude = joy.getMagnitude();


    if ((angle > 340 || angle < 20) && magnitude > 0.49 && flyingControl)
    {
        speed = gradient*magnitude-19;

        ardrone.forward(speed);
    }
    else if ((angle > 160 && angle < 200) && magnitude > 0.49 && flyingControl)
    {
        speed = gradient*magnitude-19;

        ardrone.backward(speed);
    }
    else if ((angle > 70 && angle < 110) && magnitude > 0.7 && flyingControl)
    {
        System.out.println("turn right ");
        ardrone.spinRight();
    }
    else if ((angle > 250 && angle < 290) && magnitude > 0.7 && flyingControl)
    {
        System.out.println("turnleft ");
        ardrone.spinLeft();
    }
}

我有这段代码,我需要帮助将所有这些 IF-ELSE 东西从主类中删除,使其进入 OOP,但我不知道一个好的开始方法。我的主管说了一些关于听众的事情,但我不明白。仅供参考,我有那些听众,但我不包括在这个问题中。

那么,谁能告诉我从主类中删除所有这些 IF ELSE 的步骤?多谢!!

4

4 回答 4

1

使用责任链怎么样?然后可以将此处不同的行为封装在它们自己的类中。

在这种情况下,这些专门的课程将像您的老师所想的那样充当听众。

if/else 块中的每个语句序列都将封装在一个特定对象中。

这将极大地有助于继续遵循开放/封闭原则

当多个对象可能处理一个请求并且事先不知道实际的处理程序时,您可以使用责任链。

一些与您类似的示例(来自 GUI 的事件):http ://www.dcs.bbk.ac.uk/~oded/OODP13/Sessions/Session6/Chain.pdf

于 2013-06-21T09:47:41.127 回答
0

我让它更干净一些。但还有更多。

  @Override
    public void onMotionSensingEvent( MotionSensingEvent arg0) {

        double gradient = 1.38;
        double speed;

        float testpitch = 0;
        testpitch = arg0.getOrientation().getPitch();

        float testroll = 0;
        testroll = arg0.getOrientation().getRoll();

       if( flyingControl){

           if (testroll > 16 )
           {
               speed = gradient*testroll-22.1;
               System.out.println("kanan = " + speed);
               ardrone.goRight(speed);
           }
           else if (testroll < (-24) )
           {
               speed = gradient*testroll*-1 - 22.1;
               System.out.println("kiri = " + speed);
               ardrone.goLeft(speed);
           }
           else if (testpitch < (-20) )
           {
               System.out.println("go up");
               ardrone.up();
           }
           else if (testpitch > 20 )
           {
               System.out.println("go down");
               ardrone.down();
           }       

       }

    }

    @Override
    public void onExpansionEvent(ExpansionEvent e)
    {
        JoystickEvent joy = getJoystickEvent(e);

        float gradient =64;
        float speed;

        float angle = 0;
        angle = joy.getAngle();
        float magnitude = joy.getMagnitude();

        if( flyingControl){

        }
        if ((angle > 340 || angle < 20) && magnitude > 0.49)
        {
            speed = gradient*magnitude-19;

            ardrone.forward(speed);
        }
        else if ((angle > 160 && angle < 200) && magnitude > 0.49)
        {
            speed = gradient*magnitude-19;

            ardrone.backward(speed);
        }
        else if ((angle > 70 && angle < 110) && magnitude > 0.7 )
        {
            System.out.println("turn right ");
            ardrone.spinRight();
        }
        else if ((angle > 250 && angle < 290) && magnitude > 0.7)
        {
            System.out.println("turnleft ");
            ardrone.spinLeft();
        }

     }
    }
于 2013-06-21T09:37:09.077 回答
0

将这些逻辑放在对象的 getter 或 setter 中怎么样?假设您有一个名为平面的对象,该速度是它的私有属性,我想您可以在速度属性的 getter 或 setter 中实现这些逻辑。

public plane{

private double gradient = 1.38;
private double speed;
private float testroll = 0;

public plane(MotionSensingEvent arg0){
    testroll = arg0.getOrientation().getRoll();
}

public getSpeed(){
    this.speed =  gradient*testroll-22.1;
    return speed;
}

}

于 2013-06-21T09:39:39.650 回答
0

在这里,您有角度和幅度字段用于比较,因此创建一个接受这两个作为参数并将值传递给这些方法并返回适当的字符串以打印的方法

于 2013-06-21T09:34:18.203 回答