我有以下代码,它位于一个大小写中,在一个开关语句中。它的目标是在相应的班级中使用集合将一个学生添加到学科中。
我试图使代码尽可能可读性,但我确信有一个更好的方法。
System.out.println("Adding a Pupil...");
String AddPupilSubj;
do {
UserInput.prompt("\nEnter the Subject Code to add the Pupil to, or enter 'list' to list all Subjects: ");
AddPupilSubj = UserInput.readString();
if(AddPupilSubj.equals("list"))
school.listSubjects();
} while(AddPupilSubj.isEmpty() || AddPupilSubj.equals("list"));
Boolean found = false;
// Locate the Subject
for(Object obj : school.getSubjects()) {
Subject subj = (Subject) obj;
if(subj.getCode().equals(AddPupilSubj)) {
found = true;
// Get the ID of the Pupil
UserInput.prompt("Enter Pupil ID: ");
int id = UserInput.readInt();
// Get the Pupil's Name
UserInput.prompt("Enter Pupil Name: ");
String name = UserInput.readString();
// Get the Address of the Pupil
UserInput.prompt("Enter Pupil Address: ");
String address = UserInput.readString();
String date; Boolean valid;
do {
// Get the Pupil's Date of Birth
UserInput.prompt("Enter Pupil Date of Birth (dd/mm/yyyy): ");
date = UserInput.readString();
valid = validDOB(date);
} while(!valid);
// Get the Pupil's email address
UserInput.prompt("Enter Pupil Email: ");
String email = UserInput.readString();
DateTime dob = DateTime.forDateOnly(Integer.parseInt(date.substring(6, 10)),
Integer.parseInt(date.substring(3, 5)),
Integer.parseInt(date.substring(0, 2)));
DateTime admitted = DateTime.today(TimeZone.getDefault());
Pupil Pupil = new Pupil(id, name, address, dob, email, admitted);
if(subj.addPupil(Pupil)) {
System.out.println(
String.format("\nPupil, %s, has been added to the %s Subject.",
Pupil.getName(),
subj.getName()));
} else {
System.out.println(
String.format("Pupil #%s is already in the Subject!",
Pupil.getID()));
}
break;
}
}
if(!found) {
System.out.println(
String.format("A Subject with code, %s, doesn't exist!",
AddPupilSubj));
}发布于 2011-11-20 19:23:30
函数应该做一件事,完全完成它,并且做好它。长函数是很难推理的。
将主题和瞳孔数据输入到单独的函数中,以隔离功能,并简化主线代码。
我假设存在String getSubjectCode()和Pupil getPupilInformation()方法,每个方法都包含当前位于超级函数中的代码。
次要的,但是您调用了Pupil类Pupil的一个实例,它充其量是令人困惑的,最糟糕的是具有误导性。非静态-最终变量应始终以小写字母开头。
School.getSubjects()应该返回一个List<Subject> (或Collection)。(或者至少有一个类型正确的数组;与ObjectS无关。)
中的代码数量
代码块中有很多代码循环在学校的科目上,其中大部分是在发现主题时使用的代码块。
为了理解如果没有找到主题会发生什么,我必须向下滚动到那个块的末尾,确保我正确地阅读了缩进(假设缩进是正确的),结果发现没有任何东西。
在这种情况下,不妨做一个负测试和continue,稍微“平平”循环的内脏。(代码的侧边不是一个图,它是多么令人敬畏;)
也就是说,这个功能在contains方法中是可用的--在主线代码中循环是不必要的。看下一个。
例如,决定一所学校是否有一门给定科目的课程应该移到School课程中:
public class School {
// ... existing functionality elided ...
/** Returns subject with given code, or null if not found. */
public Subject findSubjectByCode(String code) {
for (Subject s : subjects) {
if (s.getCode().equals(code)) {
return s;
}
}
return null;
}
}所有这些都将主线代码转换为以下内容:
System.out.println("Adding a Pupil...");
String subjectCode = getSubjectCode();
Subject schoolSubject = school.findSubjectByCode(subjectCode);
if (schoolSubject == null) {
System.out.printf("A Subject with code, %s, doesn't exist!%n", subjectCode);
return;
}
Pupil pupil = getPupilInformation();
if (schoolSubject.addPupil(pupil)) {
System.out.printf("%nPupil, %s, has been added to the %s Subject.%n", pupil.getName(), subj.getName());
} else {
System.out.printf("Pupil #%s is already in the Subject!%n", pupil.getID());
}我想这是更多的交流,更干净,更容易理解。
发布于 2011-11-28 17:21:26
这里有很多工作要做!我试着让你开始重构这个:
我在这里没有看到类或方法的定义。请至少声明其中一个,以便向读者提供有关此代码试图做什么的线索。
提取类和方法名称的一种方法是检查日志记录或println。
“增加一个学生……”
啊哈!因此,您的第一步是创建一个名为“瞳孔”的类和一个方法"add“(或"addPupil")。确保方法“添加”将一个瞳孔添加到瞳孔对象的列表中。
注:如果你有一种有趣的感觉“增加一个学生到一个学生”,这看起来是多么奇怪,记下来,然后再回来,因为我们还没有完成!(也就是说,也许还有更多的抽象概念要找.)
这里的目标是创建适当的抽象。您可以使用的一个指导原则是单一责任原则,类应该有一个改变的原因。我将继续搜索您的println/注释以寻找可能的提示。
*Address应该是它自己的类,其中包含street1、street2、city、state和zip的单独字段。
*最终将dateOfBirth转换为日期格式;我看到您使用的是DateTime。
中
将方法从现有条件中提取出来,并将其放在适当的类中。如果您没有适合它的类,那么创建一个新类。
例如,这个代码片段可以封装在一个方法中:
DateTime dob = DateTime.forDateOnly(Integer.parseInt(date.substring(6, 10)),
Integer.parseInt(date.substring(3, 5)),
Integer.parseInt(date.substring(0, 2)));进行一些小的更改,比如重命名字段、移动字段声明(限制局部变量范围),或者使用辅助函数来提高代码的可读性。
发布于 2011-11-18 16:07:58
在我看来,你在这里有几个需要退出的功能:
其他问题:
https://codereview.stackexchange.com/questions/6139
复制相似问题