2

我有一个程序,其中包含一些if与我将要介绍给您的语句类似的语句。我想知道你们是否可以帮助我以任何方式简化这个等式。我问的原因是因为在我的 Notepad++ 中,它会继续显示 443 列,如果需要,编辑起来真的很令人沮丧,而且随着我不断添加变量,它会变得越来越长。基本上,对于我的许多类似语句之一的这个示例if,我只想在( ) 等于或小于 0SliderBars时尝试提高价值时执行操作。我用来查找的方法如果滑块值上升,则将其当前值与与滑块关联的值进行比较,并检查结果是否为正。intrpg.StatisticPointsint

if (rpg.StatisticPoints <= 0 && 
((rpg.WillSlider.getValue() - rpg.Will) < 0) &&
((rpg.PerceptionSlider.getValue() - rpg.Perception) < 0) && 
((rpg.StrengthSlider.getValue() - rpg.Strength) < 0) && 
((rpg.DexteritySlider.getValue() - rpg.Dexterity) < 0) && 
((rpg.ConstitutionSlider.getValue() - rpg.Constitution) < 0) && 
((rpg.CharismaSlider.getValue() - rpg.Charisma) < 0) && 
((rpg.IntelligenceSlider.getValue() - rpg.Intelligence) < 0))
{
//Do actions
}

我知道这里有很多你不熟悉的变量,因为你没有看到我的完整代码,但我的完整源代码是 100 行长,我的问题只是基于后勤问题,而不是语法问题.

4

7 回答 7

13

您当前解决方案的问题不仅仅是一条很长的线路,还在于人们很难阅读和理解实际正在验证的内容。

if您可以创建一个辅助方法来构建该boolean验证的值,同时给它一个有意义的名称,而不是使用语句中的所有条件。

例如:

private boolean isValidSomething(){

    boolean result = firstCondition;
    result &= secondCondition;
    ...

    return result;

}

这样,您的所有支票都将集中在一个地方,并且可读性更高,因为您if将成为:

 if(isValidSomething()) {...}

当然,使用在您的应用程序中有意义的名称创建方法。

如果您要验证几个有意义的不同条件,请加倍努力,将它们分解到自己的方法中。

主要是将逻辑分解成有意义的部分,例如:

private boolean validStatistics() {
     return statistics > 0;
}


private boolean validWill() {
     return will > 0;
}

....

您的主要验证类似于:

private boolean validCharacter() {
     boolean valid = validStatistics();
     valid &= validWill();
     ...
     return valid;
}
于 2013-05-21T12:09:49.957 回答
4

关于什么

if (rpg.StatisticPoints <= 0 &&
   (rpg.WillSlider.getValue() < rpg.Will) &&
   (rpg.PerceptionSlider.getValue() < rpg.Perception) &&
   (rpg.StrengthSlider.getValue() <  rpg.Strength) &&
   (rpg.DexteritySlider.getValue() < rpg.Dexterity) &&
   (rpg.ConstitutionSlider.getValue() < rpg.Constitution) &&
   (rpg.CharismaSlider.getValue() < rpg.Charisma) &&
   (rpg.IntelligenceSlider.getValue() < rpg.Intelligence))
{
  //Do actions
}

此外,您可以将一些代码移动到单独的函数中:

bool CheckSliderValue(TypeOfSlider slider, TypeOfSliderValue value)
{
   return slider.getValue() < value;
}

CheckSliderValue(rpg.WillSlider, rpg.Will)并通过aso调用它这样您可以用最小值扩展检查或轻松将“<”更改为“<=”或类似名称。

于 2013-05-21T12:09:52.473 回答
3

您可以创建新变量,例如:

int will = rpg.WillSlider.getValue() - rpg.Will;

那么你的测试会更短:

if ( ( rpg.StatisticPoints <= 0 ) && ( will < 0 ) && ( Perception < 0 )  ... ) {}

您也可以将测试分开到新行:

if ( ( rpg.StatisticPoints <= 0 )
  && ( will < 0 )
  && ( perception < 0 )  ... ) {}
于 2013-05-21T12:11:05.203 回答
2

您可以删除大部分()s:

rpg.StatisticPoints <= 0 &&
rpg.WillSlider.getValue() - rpg.Will < 0 &&
rpg.PerceptionSlider.getValue() - rpg.Perception < 0 &&
rpg.StrengthSlider.getValue() - rpg.Strength < 0 &&
rpg.DexteritySlider.getValue() - rpg.Dexterity < 0 &&
rpg.ConstitutionSlider.getValue() - rpg.Constitution < 0 &&
rpg.CharismaSlider.getValue() - rpg.Charisma < 0 &&
rpg.IntelligenceSlider.getValue() - rpg.Intelligence < 0

编辑

请参阅有关运算符优先级的 Java 教程。

于 2013-05-21T12:10:13.217 回答
2
if (rpg.StatisticPoints <= 0 
    && ((rpg.WillSlider.getValue() - rpg.Will) < 0)
    && ((rpg.PerceptionSlider.getValue() - rpg.Perception) < 0)
    && ((rpg.StrengthSlider.getValue() - rpg.Strength) < 0) 
    && ((rpg.DexteritySlider.getValue() - rpg.Dexterity) < 0) 
    && ((rpg.ConstitutionSlider.getValue() - rpg.Constitution) < 0)
    && ((rpg.CharismaSlider.getValue() - rpg.Charisma) < 0)
    && ((rpg.IntelligenceSlider.getValue() - rpg.Intelligence) < 0)){
    //Do actions
}
于 2013-05-21T12:11:00.433 回答
1
boolean state= (rpg.StatisticPoints <= 0 && ((rpg.WillSlider.getValue() - rpg.Will) < 0) && ((rpg.PerceptionSlider.getValue() - rpg.Perception) < 0) && ((rpg.StrengthSlider.getValue() - rpg.Strength) < 0) && ((rpg.DexteritySlider.getValue() - rpg.Dexterity) < 0) && ((rpg.ConstitutionSlider.getValue() - rpg.Constitution) < 0) && ((rpg.CharismaSlider.getValue() - rpg.Charisma) < 0) && ((rpg.IntelligenceSlider.getValue() - rpg.Intelligence) < 0));


if(state){/*do actions*/}

或者

 s1=(rpg.StatisticPoints <= 0);
 s2=((rpg.WillSlider.getValue() - rpg.Will) < 0);
 ...
 ...

 if(s1&&s2&&s3...){/* work*/}
于 2013-05-21T12:11:22.703 回答
0

在您的情况下,您需要的不仅仅是“内联”条件。在某处,通常的编程对于您的情况来说不是正确的做法。

也许你可以使用Observer pattern. 如果你组织好你的类并添加一个会引发标志的信号。例如:One of the condition is false

这将带回到您的主要条件,它将检查是否曾经由Observer pattern.

检查有关Observer pattern. 如果您的项目规模很大,我认为这会很有帮助。

如果您只添加一个变量,那么您只需要以非常简单的方式为新变量编写条件。

于 2013-05-21T12:15:30.200 回答