这些方法中的一种或两种都遵循单一责任原则吗?

时间:2014-08-13 13:46:39

标签: oop solid-principles single-responsibility-principle

我有一个School课程,其中包含学生列表,Student课程包含奖项和成绩列表,如下所示:

public class School
{
    List<Student> Students {get;set;}
}

public class Student
{
    List<Grade> Grades {get;set;}
    List<Award> Awards{get;set;}
}

我有一个复制方法,可以将Student's Awards and/or Grades从一个School复制到另一个Student to a new school or the Student and his/her Awards and/or Grades。您可以选择仅处理Single Responsibility Principle。以下哪一项遵循Grades and Awards,为什么它遵循它,如果两者都没有,为什么不呢?第一个示例复制学生并使用布尔值来确定是否应复制CopyStudent(Student student, bool copyGrades, bool copyAwards) { //Copy Student if(copyGrades) { //Copy Grades } if(copyAwards) { //Copy Awards } }

Grades

以上内容包括Awards类中CopyStudentSRP的复制。这是遵循CopyGrades(List<Grade> grades) { //Copy grades } CopyAwards(List<Award> awards) { //Copy awards } 还是更好地将应对成绩和奖励分解为单独的方法,例如:

CopyStudent

因此,将从{{1}}方法调用上述方法。

1 个答案:

答案 0 :(得分:0)

正如Jeroen在评论中已经提到的那样,分离方法总是一个好主意,所以第二种方法乍一看似乎更好。

你可以争辩说,在某些情况下你只是想“复制一个学生” - 不多也不少。在这些情况下 - to avoid code duplication - 您需要CopyStudent()之类的内容,就像您的第一种方法一样。另一方面,标志copyGradescopyAwards有点smelly。这两种方法仍然不一定相互矛盾。怎么样:

CopyGrades(List<Grade> grades)
{
    //Copy grades
}

CopyAwards(List<Award> awards)
{
    //Copy awards
}

CopyStudent(Student student)
{
   CopyGrades(student.grades)
   CopyAwards(student.awards)
}

总的来说,我发现SRP很难掌握。在某些情况下, 难以确定是否满足。一些提示和启发式:

  • 描述所做的功能/方法/类/模块。这是由它的名字代表的吗?你需要不止一个句子(用“和”,“或”,“但是”连接)?如果第二个答案为“是”,请重新考虑您的设计。
  • A responsibility is a reason to change(Robert C. Martin)
  • “李叔叔”的
  • Another view,这一次强调人和设计(当然还有代码)