如何让这对OOP(How to make this to OOP)

2019-10-18 06:32发布

@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的事从主类,使之成为面向对象的,但我不知道的好方法开始。 我的上司说了一些听众,但我不明白。 仅供参考,我有这些监听器,但我不包括他们在这个问题上。

这样的话,有谁能够告诉我的步骤,以除去所有这些IF ELSE出主类的? 非常感谢!!

Answer 1:

怎么样用一个责任链 ? 这改变这里可能行为随后在自己的课堂上封装。

在这种情况下,这些专用类将作为听众,作为你的老师认为。

在你的if / else语句块中的每一个序列,然后会在一个特定的对象进行封装。

这将大大有助于保持继开/闭原则 。

当多个对象可以处理的请求和实际处理程序事先不知道,你可以使用责任链。

与你相似(从GUI事件)的一些例子在这里: http://www.dcs.bbk.ac.uk/~oded/OODP13/Sessions/Session6/Chain.pdf



Answer 2:

在这里你有角度和大小字段用于对比等创造一个方法,接受这两个作为参数和值传递给这些方法并返回相应的字符串打印



Answer 3:

我把它咬清洁。 但也有更多的。

  @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();
        }

     }
    }


Answer 4:

怎么样把这些逻辑在你的对象的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;
}

}



文章来源: How to make this to OOP