# SOLID Single Responsibility Priciple Frage



## Chebura (3. Dez 2022)

Hallo, 
das Single Responsibility Princple lässt mir in letzter Zeit keine Ruhe.
Ich habe eine  UserService-Klasse, die diverse Operationen am User durchführt (Login, Registrierung, Aktivierung, Passwort-Änderung, Mail-Kontakt).
Alles dreht sich um den User. Deswegen habe ich so eine UserService-Klasse gebaut.
Nun laut dem SRP sollte eine Responsibility haben. 
In meinen Augen ist die Responsibility in diesem Fall der User. Dadurch ergeben sich aber dann Methoden wie "sendeWillkommensNachrichtAnDenUser" oder "ändereUserMail".
Methode sendeWillkommensNachrichtAnDenUser ruft den Mail-Service, der nur email verschickt. Wäre das schon der Bruch von RSP?
Methode "ändereUserMail" arbeitet mit dem User-Repository und mit dem Mail-Service. Wäre das schon der Burch von RSP?
Muss man vllt. nicht den User in den Mittelpunkt des Services stellen, sondern was eigentlich gemacht wird:
Login ->LoginService
Registrierung ->RegiterService
User aktivieren -> UserActivationService
User verändern -> UserChangeService

Lg


----------



## yfons123 (4. Dez 2022)

das SOLID sollte mit Sinn eingesetzt werden um den code zu verbessern und nicht krampfhaft versucht


wenn du bei google einen Account erstellst, wer registriert dich dann in der Datenbank, du oder der Service?
Der "Service" macht es für dich, du bist einfach nur da
Die Services schaufeln dich immer hin und her, tun musst du nur wenig

Das einzige was du tun musst ist die Credentials ( Passwort name ) übergeben und sagen was du willst, das hin und her schaufeln machen die services


```
class User{
    private string name;
    private int id = new Random();
    // blabla
}

class MailService{
 
    void Send(User user,MailMessage message)
    void SendHellomessage(User user){
        Send(user,"Hello Mister");       
    }
}
class RegistryService{
    public List<User> EindeutigKeineDatenbank = new ArrayList<User>();
    void Register(string name){
        EindeutigKeineDatenbank.add(new User(name));
    }
    void RemoveRegister(User user){
        EindeutigKeineDatenbank.remove(user);
    }
}
```

dann hast du noch einen "ServiceProvider" der die 4 services hat und sie dirigiert... dann hast du eine schnittstelle UND alle modernen fancy wörter die man so in der IT heutzutage hat auch noch benutzt.. naja gut REST und Framework und WebApplication fehlt noch aber das kriegt man auch noch irgendwo unter

und SOLID sind alle 5 sachen in einem, 1es alleine ist relativ mager.. wenn man alles single responsible gemacht hat und die anderen 4 punkte gar nicht dann hilft mir das auch nicht weiter


----------



## osion (19. Dez 2022)

Das Single Responsibility Principle (SRP) besagt, dass jedes Modul (z.B. eine Klasse) nur eine Verantwortung haben sollte. In Bezug auf deine UserService-Klasse könnte man argumentieren, dass die Verantwortung des Users tatsächlich der Fokus der Klasse ist. Allerdings gibt es in deinem Beispiel mehrere Operationen, die durchgeführt werden (Login, Registrierung, Aktivierung, Passwort-Änderung, Mail-Kontakt), die möglicherweise besser in separate Klassen ausgelagert werden sollten, um dem SRP zu entsprechen.

Methoden wie "sendeWillkommensNachrichtAnDenUser" oder "ändereUserMail", die andere Services aufrufen, könnten darauf hinweisen, dass die UserService-Klasse möglicherweise mehr als eine Verantwortung hat. Wenn der Mail-Service nur für das Versenden von E-Mails verantwortlich ist, könnte es sinnvoller sein, diese Methode in eine separate MailService-Klasse auszulagern.

Es könnte sinnvoll sein, deine UserService-Klasse zu überdenken und gegebenenfalls in mehrere kleinere Klassen aufzuteilen, die sich um spezifischere Aufgaben kümmern. Durch die Trennung von Verantwortlichkeiten in separate Klassen kannst du den Code besser strukturieren und Wartung und Änderungen in der Zukunft vereinfachen.


----------

