逻辑问题 - Java

时间:2011-01-14 20:04:41

标签: java unit-testing logic

我有一个家谱应用程序,允许您构建节点。我遇到了一个需要编辑成员出生日期的问题。出生日期只是一个字符串,格式如下dd-mm-yyyy。在检查出生日期是否有效时(即任何父母不能比孩子年龄小),我的问题就出现了。因此,如果节点同时具有父节点和子节点,并且用户选择编辑它的出生日期,则该函数必须不断检查以查看是否已添加两个日期之间的年龄。我遇到的问题是使用我定义的方法进行连续检查。我希望有人理解这一点并且可以提供帮助。注意checkDOb也会设置dob。我的命名不好。

这是代码:

private void dateCheck(FamilyMember node) {
    String dob = enterDateOfBirth();
    if (node.hasChildren()) {
        node.setDob(dob);
        checkDob(node, node.getOldestChild(), 0);            
    }

    FamilyMember parent = null;
    if (node.hasMother() && node.hasFather()) {
        if (node.getMother().getAge() > node.getFather().getAge()) {
            parent = node.getFather();
        } else {
            parent = node.getMother();
        }
        checkDob(parent, node, 1);
    } else {
        //single parent
        if (node.hasMother()) {
            parent = node.getMother();
            checkDob(parent, node, 1);
        }

        if (node.hasFather()) {
            parent = node.getFather();
            checkDob(parent, node, 1);
        }
    }
}

private void checkDob(FamilyMember parent, FamilyMember child, int member) {
    out.println(parent.getYear());
    out.println(child.getYear());
    while (parent.getYear() > child.getYear()) {
        out.println("Invalid Date - The Oldest Child of " + parent.getFullName()
                + "(" + child.getFullName() + ")\n cannot older than his/her parents. Try Again.");
        out.println();
        if (member == 0) {
            parent.setDob(enterDateOfBirth());
        }
        if (member == 1) {
            child.setDob(enterDateOfBirth());
        }
    }
}

private String enterDateOfBirth() {
    out.print("Enter Year Of Birth (0 - 2011): ");
    String y = in.nextLine();

    out.print("Enter Month Of Birth (1-12): ");
    String m = in.nextLine();
    if (m.trim().equals("")) {
        m = "0";
    }
    if (m.length() == 1) {
        m = "0" + m;
    }
    m += "-";

    out.print("Enter Date of Birth (1-31): ");
    String d = in.nextLine();

    if (d.trim().equals("")) {
        d = "0";
    }
    if (d.length() == 1) {
        d = "0" + d;
    }
    d += "-";

    String dob = d + m + y;
    while (!DateValidator.isValid(dob)) {
        out.println("Invalid date. Try again.");
        dob = enterDateOfBirth();
    }
    return (dob);
}

提前致谢。

3 个答案:

答案 0 :(得分:0)

解析日期的标准方法是使用SimpleDateFormat。但我不认为这对你的情况有帮助,所以我不会去那里。

但是当你谈论日期时,你应该使用Date对象(或者,正如其他人会说的那样:使用JodaTime的DateTime对象),这会让事情变得更容易。

Date类型设为dob

并交换此代码:

String dob = d + m + y;

为此:

Calendar cal = Calendar.getInstance();
cal.set(Calendar.YEAR, Integer.parseInt(y));
cal.set(Calendar.MONTH, Integer.parseInt(m)-1);
cal.set(Calendar.DATE, Integer.parseInt(d));
Date dob = cal.getTime();

(你应该丢失所有的if (m.length() == 1)内容,因为带有前导零的字符串将被解析为八进制值)

现在您只需验证parentBirthDate.compareTo(childBirthDate)>0

即可

另外,为了更精确,您应该截断小于白天的所有字段:

cal.set(Calendar.HOUR, 0);
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.SECOND, 0);
cal.set(Calendar.MILLISECOND, 0);

另外:不要使用System.out.println(),请使用Log4J或SLF4J等日志框架。

哦,顺便说一句,确认孩子比父母年轻还不够。您可能需要验证差异是12年或更长时间: - )

答案 1 :(得分:0)

它可以像smt一样

//return true if one of arguments is true!
private boolean bornBefore(FamilyMember first, FamilyMember second){
    if(first == null || second == null){
        return true;
    }
    return /*your magic date comaparator*/;
}
private boolean validDate(FamilyMember node, MagicDate date) {
    return bornBefore(node, node.getOldestChild())
            && bornBefore(node.getFather(), node)
            && bornBefore(node.getMother(), node); 
    }
}

答案 2 :(得分:0)

您应该分离验证和数据输入。首先,您的树模型包含当前值和要输入的新字符串以更改值。

bool checkDOB(String date, FamilyMember node) {
  //return true if date is more recent than any parents of node and
  //older than any children of node
}

现在你有一个独立的验证方法,你应该在你想要添加一个新节点或编辑一个新节点的时候调用它。在验证之前,请勿更改实际数据模型中的任何值。这意味着您的树将始终处于有效状态,编辑只是本地操作。