关于班级结构的建议

时间:2016-02-21 03:46:56

标签: c# .net oop

我有一个类Student,需要持久保存在数据库中。我有创建和更新这些学生的方法(CreateStudent,UpdateStudent),现在,这个Student类的结构是:

public class Student
{
    public int ID { get; set; }
    public string FirstName { get; set; }
}

现在我在想的是我的CreateStudent接受了一个Student对象:

public int CreateStudent(Student newStudent);

但是,由于该学生是新学生,因此该ID不会被持久化(或者不应该被持久化)到数据库中。但该方法的用户似乎不清楚这是如何工作的。例如,我使用CreateStudent但传递的Student.ID为6,CreateStudent方法将忽略ID,因为这是创建学生。但是,我试图找到更清楚的东西。我现在想要尝试的是将ID分离到一个接口,该接口仅在学生已存在于数据库中时才可用。有点像这样:

public IEntity
{
    int ID { get; set; }
}

public interface IUnknownStudent
{
    string FirstName { get; set; }
}

public interface IStudent : IUnknownStudent, IEntity
{
}

然后在使用CreateStudent时,我传递了一个IUnknownStudent(没有ID)。 只有在检索或更新时才会使用带ID的实现。但我不确定这是否有任何问题,因为我第一次尝试它,我想知道这里经验丰富的人是否可以给出一些建议。

修改

CreateStudent()位于一个单独的类StudentLogic上。

1 个答案:

答案 0 :(得分:1)

我看到的一件事是你可能想要一个单独的StudentData类,你有方法

public int createStudent(Student s){
//TODO: Implement method here
}

我认为您应该有另一个类来容纳createStudent方法的原因是因为您不必实例化Student来访问createStudent方法。可以这样想,比如我创建我的班级学生

public class Student 
{
    public string firstName { get; set; }
    //rest of class
}

当我在课堂上使用createStudent方法创建学生时,我不得不说:

Student s = new Student();
s.createStudent(s);

这不是我们想要创造的东西,对吗?如果你想保持更新,那么这段代码将很难阅读和理解。

我同意您希望将ID作为单独的类或接口实现,具体取决于您的需要,并且您可能希望在“未知新学生”出现时为“ID”设置默认值创建。这样,当您返回新学生的ID时,它始终是相同的,直到用户输入学生的新ID或自动选择下一个ID。我建议的主要内容是使用StudentData类来容纳createStudent方法并保存主要功能(如果有的话)。这样,您将使用更多的MVC(模型 - 视图 - 控制器)开发风格,其中Student和他们的ID作为模型,View和Controller由StudentData类处理。一旦你理解了它,它就是一种简单的结构化方法。