我有一个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
类中CopyStudent
和SRP
的复制。这是遵循CopyGrades(List<Grade> grades)
{
//Copy grades
}
CopyAwards(List<Award> awards)
{
//Copy awards
}
还是更好地将应对成绩和奖励分解为单独的方法,例如:
CopyStudent
因此,将从{{1}}方法调用上述方法。
答案 0 :(得分:0)
正如Jeroen在评论中已经提到的那样,分离方法总是一个好主意,所以第二种方法乍一看似乎更好。
你可以争辩说,在某些情况下你只是想“复制一个学生” - 不多也不少。在这些情况下 - to avoid code duplication - 您需要CopyStudent()
之类的内容,就像您的第一种方法一样。另一方面,标志copyGrades
和copyAwards
有点smelly。这两种方法仍然不一定相互矛盾。怎么样:
CopyGrades(List<Grade> grades)
{
//Copy grades
}
CopyAwards(List<Award> awards)
{
//Copy awards
}
CopyStudent(Student student)
{
CopyGrades(student.grades)
CopyAwards(student.awards)
}
总的来说,我发现SRP很难掌握。在某些情况下, 难以确定是否满足。一些提示和启发式: