验证来自不同根的对象的方法会重复大多数检查

问题描述

请提供一种使代码更简洁的方法- 为了避免重复类似/相同的动作- 我有一个进行对象验证的方法,但是大多数参数 相似/相同,例如为此使用某种lambda表达式, 但是对象不是来自同一棵树。

我的用例是这样的:

validate.( car );

我在其他地方做

validate.( person );

现在我正在像这样进行验证:

public boolean validate( Object obj ) {
  if ( obj instanceof Car ) {

    Car car = (Car) obj;
    if ( car.getAge() <= 0 ) return false;
    // many other checks which are repeated below

  } else if ( obj instanceof Person ) {

    Person person = (Person) obj;
    if ( person.getAge() <= 0 ) return false;
    // many other check which are repeating those above

  }
  // here I would like to do checks for both objects,but objects are from different roots

return true;
}

解决方法

您可以使用method overloading

import controlP5.*;

ControlP5 cp5;

// range constants
final int RANGE_MIN = 4000;
final int RANGE_MAX = 5000;
// the smallest allowed difference between min/max values
final int RANGE_MIN_DIFFERENCE = 500;
final int RANGE_MID = RANGE_MIN + ((RANGE_MAX - RANGE_MIN) / 2);

int minValue;
int maxValue;

Numberbox inputMin;
Numberbox inputMax;

void setup() {
  size(700,400);

  PFont font = createFont("arial",18);

  cp5 = new ControlP5(this);

  inputMin = cp5.addNumberbox("minValue")
             .setPosition(100,100)
             .setSize(100,20)
             .setFont(font)
             .setScrollSensitivity(1.1)
             // set initial acceptable range
             .setMin(RANGE_MIN)
             .setMax(RANGE_MAX)
             // set default value
             .setValue(4000)
             ;
  
  inputMax = cp5.addNumberbox("maxValue")
             .setPosition(100,150)
             .setSize(100,20)
             .setFont(font)
             .setScrollSensitivity(1.1)
             // set initial acceptable range
             .setMin(RANGE_MIN)
             .setMax(RANGE_MAX)
             // set default value
             .setValue(RANGE_MID + 1)
             ;
  
  
  textFont(font);
}

void draw() {
  constrainRangeInputs();
  background(0);
  fill(255);
  text("minValue: " + minValue + "\n" +
       "maxValue: " + maxValue,10,15);
}

void constrainRangeInputs(){
  int rangeMinInt = (int)inputMin.getValue();
  int rangeMaxInt = (int)inputMax.getValue();
  // 
  if(abs(rangeMaxInt - rangeMinInt) < RANGE_MIN_DIFFERENCE){
    if(rangeMaxInt > RANGE_MID){
      inputMin.setValue(rangeMaxInt - RANGE_MIN_DIFFERENCE);
    }else{
      inputMax.setValue(rangeMinInt + RANGE_MIN_DIFFERENCE);
    }
  }
}

Master是Person和Car的公共父级(我假设有一个公共父级接口/类)。

,

“不要”:

  1. 首先,我强烈建议您尽最大努力避免像现在那样设计方法;
  2. 从逻辑,建模或概念的角度来看,
  3. PersonCar没有共同之处。他们也没有在现实生活中分享任何类似的特征;
  4. 请勿在您的方法中接受Object作为参数。您将很难管理错误和/或保持不可预测的行为。

“做”:

  1. 遵循Single Responsibility Principle来定义您的方法;
  2. 从模型对象的角度考虑-作为行为的方法应该是什么?应该解决什么一个问题?
  3. 尝试将关注点分离到各自的类/文件/块单元中,并尽量避免重叠。

如果您想根据参数的实际实例来表现,最好的方法是使用instanceof检查。

但是,您可以做的是设计一些适当的继承并接受超类型作为方法参数。这样一来,多态性就会开始,您的方法将只有一种逻辑。