I am trying to gain better understanding on SRP and when I was checking out a Pluralsight video by Scott Allen, I saw code like this:
https://github.com/OdeToCode/cs-fundamentals/blob/master/src/GradeBook/Book.cs
https://github.com/OdeToCode/cs-fundamentals/blob/master/src/GradeBook/Statistics.cs
public class DiskBook : Book
{
public DiskBook(string name) : base(name)
{
}
public override event GradeAddedDelegate GradeAdded;
public override void AddGrade(double grade)
{
using(var writer = File.AppendText($"{Name}.txt"))
{
writer.WriteLine(grade);
if(GradeAdded != null)
{
GradeAdded(this, new EventArgs());
}
}
}
public override Statistics GetStatistics()
{
var result = new Statistics();
using(var reader = File.OpenText($"{Name}.txt"))
{
var line = reader.ReadLine();
while(line != null)
{
var number = double.Parse(line);
result.Add(number);
line = reader.ReadLine();
}
}
return result;
}
}
Now here Diskbook
is responsible to manage grades and Statistics
class responsibility is to calculate statistics based on grades but this makes me wonder that having GetStatistics
method in DiskBook
class doesnt break SRP?
Because as per my understanding if there will be some changes inside Statistics
class, then I will have to change logic in GetStatistics
method which means now I have 2 reasons to change DiskBook
class. Clear SRP violation?
Also in .net framework we have DbConnection
class which creates DbCommand
like below:
public abstract class DbConnection : Component, IDbConnection, IDisposable
{
protected abstract DbCommand CreateDbCommand();
}
I know this won't be violating SRP since it is designed and created by .net team but I would like to understand why this is not violating SRP and when does it make sense to do something like this?