设计Java类的最佳方法是什么?

时间:2016-07-29 10:05:33

标签: java class

我希望我提出正确的问题。这只是出于好奇,因为我不是一个经验丰富的开发人员,我只是想听听你们在设计课程时有什么好方法。是否有任何标准方法或任何一种方法可以实施?我只是想知道创建课程的传统方式是什么,或者你的方式是什么?

选项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);

7 个答案:

答案 0 :(得分:1)

嗯......首先要做的事情...... a StudentList<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:

创建一个只负责一件事的类:

  • 将学生表示为java模型的StudentClass
  • 代表课程的课程(可能为参加课程的学生提供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)

您可以尝试这样的事情:

  1. 创建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
    }
    
  2. 创建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) {
    
        }
    
        ...
    }
    
  3. 最后你可以像这样使用它:

    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示例的模式的良好参考。