The SRP states, that every class/module/unit of work/component should only implement functionality for a single responsibility. Examples: Persistence, Logic, View rendering.
Why is this so important? Why bloating your code, by creating more classes/../components than necessary?
Advantages can be found in: Testing, Collaboration, Deployment
Testing: The more functionality you have in one component the more complex your tests get. Code coverage for a function with one if clause requires 2 tests. Make that 2 and you already need 4 tests. The complexity multiplies and soon you will not be able to cover all paths of your code. When having small units, you can control the complexity and test them easily, with less effort.
Collaboration: Of course it’s also easier to work on a single code basis with several developers, if you have different components. Even in the time of git.
Deployment: More separation means more stability. Having a bug in a component? Fix it and deploy only that component. No need to test the whole system again. This idea stretches from single classes, to microservices.
The consequences of SRP are layered architecture, MVC and even microservices. The implications of this principle are huge and widely overlooked.
An Anti-Pattern for SRP is for example the Active Record Pattern. There persistence logic is build into the domain objects, so you have functions like this:
obj.setProperty();
obj.merge(); // merges the object changes into the database
This makes it very hard to test the persistence layer. In DI Frameworks like Spring you can use reflection to mock the persistence layer, but this is more complicated than necessary and needs lots of insight and time.
Read for more explanations: http://moleseyhill.com/blog/2009/07/13/active-record-verses-repository/
Punchline: SRP has many benefits and implications. Most of my design/architectural problems with legacy code are a result from not following SRP.