Beste mede-Tweakers
Ik heb het sinds jaar en dag soms moeilijk om code conceptueel juist uit te denken. ik heb het gevoel dat ik altijd een compromis moet maken tussen twee slechte keuzes, en dat terwijl ik geen code schrijf die baanbrekend nieuw is. Ik loop nu tegen een conceptueel probleem aan, waarbij ik voel dat mijn Encapsulation en Seperatino of concerns tegen elkaar botsen. Even een paar aannames, het zou kunnen dat ik al fout zijn bij deze premises (waarvan ik denk dat ik ze geleerd heb op de hogeschool, een tijd terug):
-Classes moeten zoveel mogelijk self-contained zijn, het is niet de bedoeling dat je 30 classes in een project moet importeren om er eentje van te gebruiken.
-Classes moeten niet meer doen dan je ervan verwacht. Niet meer, niet minder: Seperation of concerns.
Nu een praktijkvoorbeeld dat ik gisteren tegenkwam. Ik heb een database met daarin een 'users' tabel, waar allemaal users inzitten. In m'n OOP taal heb ik dus een database class, om te verbinden met de database en bewerkingen te doen en een User class.
Maar nu, stel ik wil een manipulatie doen op een User instantie. Bijvoorbeeld een nieuw wachtwoord geven aan de user. Een nieuw wachtwoord geven houdt in: Het aanmaken van een nieuwe random salt, wachtwoord en salt hashen, de waarde wegschrijven naar de database én de hash aan het wachtwoord member van de user instantie toewijzen (dat laatste is niet echt nodig, maar het komt goed uit om mijn 'probleem' te schetsen)
Nu kan ik (denk ik) twee kanten op:
Optie 1) Ik maak een method op de User class 'User.SetNewPassword(string)' en de user een private database instantie geven zodat deze verbinding maakt met de database en zelf de queries e.d. afhandeld.
Problemen:
1) Seperation of concerns: Een User class moet in principe alleen een user representeren, een user weet niet wat een database is, en zou ook geen wachtwoorden van databases moeten bevatten of queries uitvoeren.
2) Performance: als er 1000 gebruikers zijn, zijn er potentieel 1000 open connecties naar de databank, wat eigenlijk overkill is.
Optie 2) Ik geef de databaseclass een bepaalde awareness voor de User class, zodat deze de user class gebruikt en manipuleert: 'db.SetUserNewPassword(userinstantie, string)'. In dit geval zal de database zelf de queries uitvoeren en de 'User.PasswordHash' veranderen.
Problemen:
1) De database class en de User class zijn onlosmakelijk met elkaar verbonden. Ik dat de databaseclass dus niet hergebruiken zonder de user class.
2) De database class veranderd de User.PasswordHash waarde, dus moet deze public settable zijn, wat betekend dat elke andere class deze ook kan aanpassen, dit kan dus de integriteit van mijn data betekenen, de PasswordHash kan namelijk anders zijn in mijn instantie dan in de database.
Hebben jullie ideeën? Wat is een goede methode, zijn er andere manieren (waarschijnlijk) die logischer zijn en ik niet zie of vergeet?
Hartelijk dank voor jullie input.
Ik heb het sinds jaar en dag soms moeilijk om code conceptueel juist uit te denken. ik heb het gevoel dat ik altijd een compromis moet maken tussen twee slechte keuzes, en dat terwijl ik geen code schrijf die baanbrekend nieuw is. Ik loop nu tegen een conceptueel probleem aan, waarbij ik voel dat mijn Encapsulation en Seperatino of concerns tegen elkaar botsen. Even een paar aannames, het zou kunnen dat ik al fout zijn bij deze premises (waarvan ik denk dat ik ze geleerd heb op de hogeschool, een tijd terug):
-Classes moeten zoveel mogelijk self-contained zijn, het is niet de bedoeling dat je 30 classes in een project moet importeren om er eentje van te gebruiken.
-Classes moeten niet meer doen dan je ervan verwacht. Niet meer, niet minder: Seperation of concerns.
Nu een praktijkvoorbeeld dat ik gisteren tegenkwam. Ik heb een database met daarin een 'users' tabel, waar allemaal users inzitten. In m'n OOP taal heb ik dus een database class, om te verbinden met de database en bewerkingen te doen en een User class.
Maar nu, stel ik wil een manipulatie doen op een User instantie. Bijvoorbeeld een nieuw wachtwoord geven aan de user. Een nieuw wachtwoord geven houdt in: Het aanmaken van een nieuwe random salt, wachtwoord en salt hashen, de waarde wegschrijven naar de database én de hash aan het wachtwoord member van de user instantie toewijzen (dat laatste is niet echt nodig, maar het komt goed uit om mijn 'probleem' te schetsen)
Nu kan ik (denk ik) twee kanten op:
Optie 1) Ik maak een method op de User class 'User.SetNewPassword(string)' en de user een private database instantie geven zodat deze verbinding maakt met de database en zelf de queries e.d. afhandeld.
Problemen:
1) Seperation of concerns: Een User class moet in principe alleen een user representeren, een user weet niet wat een database is, en zou ook geen wachtwoorden van databases moeten bevatten of queries uitvoeren.
2) Performance: als er 1000 gebruikers zijn, zijn er potentieel 1000 open connecties naar de databank, wat eigenlijk overkill is.
Optie 2) Ik geef de databaseclass een bepaalde awareness voor de User class, zodat deze de user class gebruikt en manipuleert: 'db.SetUserNewPassword(userinstantie, string)'. In dit geval zal de database zelf de queries uitvoeren en de 'User.PasswordHash' veranderen.
Problemen:
1) De database class en de User class zijn onlosmakelijk met elkaar verbonden. Ik dat de databaseclass dus niet hergebruiken zonder de user class.
2) De database class veranderd de User.PasswordHash waarde, dus moet deze public settable zijn, wat betekend dat elke andere class deze ook kan aanpassen, dit kan dus de integriteit van mijn data betekenen, de PasswordHash kan namelijk anders zijn in mijn instantie dan in de database.
Hebben jullie ideeën? Wat is een goede methode, zijn er andere manieren (waarschijnlijk) die logischer zijn en ik niet zie of vergeet?
Hartelijk dank voor jullie input.