我希望我提出正确的问题。这只是出于好奇,因为我不是一个经验丰富的开发人员,我只是想听听你们在设计课程时有什么好方法。是否有任何标准方法或任何一种方法可以实施?我只是想知道创建课程的传统方式是什么,或者你的方式是什么?
选项1:
public class Student{
private String name;
private String address;
public Student(String name, String address){
this.name = name;
this.address = address;
}
public void addStudent(){
//add name and address to database.
}
}
选项2:
public class Student{
public void addStudent(String name, String address){
//add name and address to database.
}
public void addAllStudent(List Student){
//loop and add each student to database
}
}
方法调用:
//option 1:
Student s = new Student("abc","xyz");
s.addStudent();
//for list,
for(int i=0;i<list.length;i++){
Student s = new Student(list[i].name, list[i].address);
s.addStudent();
}
//option 2:
Student s = new Student();
s.addStudent("abc","xyz");
s.addAllStudent(list);
答案 0 :(得分:1)
嗯......首先要做的事情...... a Student
和List<Student>
通常你会创建一个班级Student
public class Student{
private String name;
private String address;
public Student(String name, String address){
this.name = name;
this.address = address;
}
// and some getter
}
以及代码中的其他地方,您可以使用java List(不在您的Student-Class中)
List<Student> students = new ArrayList<Student>();
Student peter = new Student("Peter", "somewhere");
Student frank = new Student("Frank", "somewhere else");
students.add(peter);
students.add(frank);
此代码剪辑可能在您的SubscribeStudentToCourseService
左右......
您想要做的是 - SingleResponsibility:
创建一个只负责一件事的类:
List<Student>
字段答案 1 :(得分:1)
选项2并不好,因为这两种方法都与它们所属的Student对象没有任何关系。你可以将这两种方法保持为静态。选项1是Student
类的“正确”方式,但方法addStudent()
是错误的。您可以在数据库中使用方法并调用database.addStudent(objStudent)
。
您还可以将addStudent
课程中的Student
方法更改为addToDatabase(Database db)
甚至
static void addToDatabase(Student student, Database db)
在List as Database的特定情况下,根本不需要自定义add方法,因为List allready具有add方法。
在最简单的情况下,一切归结为:
List<Student> students = new ArrayList<Student>();
students.add(new Student("Max", "###"));
如果您认为第二行太复杂,可以在Student中创建一个静态方法:
public static void addStudent(String name, String address, List<Student> students)
{
students.add(new Student(name, address);
}
然后你可以像这样使用它:
List<Student> students = new ArrayList<Student>();
Student.addStudent("Max", "###", students);
从个人喜好来看,我不会做后者。它让我觉得有点不对,就方法实际对列表的作用而言,它不够透明。在第一种情况下简单地使用列表的add方法没有任何问题。
答案 2 :(得分:1)
正如你所看到的,对这个问题有很多意见,所以我去添加另一个;)
有人评论说在创建类的新实例时没有“银弹”。这几乎击中了牛市。有许多方法,直接通过构造函数,通过静态方法或包含在工厂中。通过reflections
创建实例甚至有很好的参数。
如何将学生保存到数据库中也是如此。有许多模式可能有效。只需确保您了解该模式的工作原理以及有哪些优点和缺点。同样重要的是,在整个代码中使用它。
关于您的代码,如果您更改为建模透视图,则选项2没有意义。将学生添加到学生?除非你不想创造一堆人,否则你最好把学生添加到课程,课堂,学校......
答案 3 :(得分:0)
您似乎使用同一个班级为学生提供模板,也可以存储学生。
你真的需要将学生存放在同一个班级吗?这将导致一些令人困惑的设计,在那里你有一个学生课程,存储其他实际代表学生的学生课程。
也许添加学生的功能可以在一个单独的课程中,例如学校?或者您只需在任何需要的地方创建一个通用的学生列表。因此,addStudent函数可能会从类中删除并存储在其他位置。
答案 4 :(得分:0)
您可以尝试这样的事情:
创建Student
bean
public class Student {
private String name;
private String address;
public Student(String name, String address) {
this.name = name;
this.address = address;
}
// generate the getters and setters
}
创建DAO
类
public class StudentDaoIml {
public void addStudent(Student student) {
// do the add student job here
}
public void addAll(List<Student> students) {
// the code goes here
}
public void deleteStudent(Student student) {
}
...
}
最后你可以像这样使用它:
StudentDaoIml stDao = new StudentDaoIml();
for(int i=0;i<someValue; i++){
Student s = new Student(list[i].name, list[i].address);
stDao.addStudent(s);
}
答案 5 :(得分:-1)
这是评论中的好方法和一些解释。
public class Student{
private String name;
private String address;
public Student(String name, String address){
this.name = name;
this.address = address;
}
public void save(){
//save this instance to database.
}
public static void saveAll(List<Student> students){
//Either iterate and call save
// or do better batch insert for better performance
}
}
就命名方法而言,类方法是根据其行为命名的。可以把它想象成一个学生的实例,然后将自己保存到DB&#39;。在DB&#39;中可能还有一种方法,比如&#39; go和 update 。
当您处理列表时,列表本身不应该是Student类的一部分。将列表保留在其他位置。但是,Student类可以有一个静态方法,它可以获取学生列表并一次性保存。
例如,学生可以在学校上课。然后
Student.saveAll(class5A.getStudents());
创建一些并保存它们:
List<Student> students = new ArrayList<>();
for(int i=0;i<10;i++){
Student s = new Student("Student" + i, "Student address " + i);
students.add(s);
}
Student.saveAll(students);
更进一步,学生班可能不应该大量拯救学生。所以,让我们解除它的责任,让BatchOfClass来处理它。
public class Student{
private String name;
private String address;
public Student(String name, String address){
this.name = name;
this.address = address;
}
public void save(){
//save this instance to database.
}
}
public class BatchOfClass{ //Students who are in grade 6 in 2016
private String className;
private String batchName;
private List<Student> students;
public BatchOfClass(...){
}
public void save(boolean saveStudents){
//save this instance to database.
//This would also save the students to DB if saveStudents==true
}
}
答案 6 :(得分:-1)
在很大程度上取决于您计划如何实施该计划。一种广泛使用的模式是MVC(模型 - 视图 - 控制器),其中Model表示具有数据和控制器的类并且保存&#39;他们到数据库,模型没有“访问权限”。到db。您可以使用多种设计模式。可以在Github上找到有关Java示例的模式的良好参考。