Hvad skal jeg medtage i en databaseklasse
On februar 15, 2021 by admin Jeg er i øjeblikket ved at udvikle en java-applikation, der kommunikerer med en SQL-server. Derfor oprettede jeg klassen Database
som er ansvarlig for open()
og close()
.
Jeg vil være i stand til at tilføje data til databasen. I dette eksempel kaldes tabellen job. Derfor oprettede jeg en klasse Job
. Udover disse job vil der være (mange) forskellige ting, der gemmes i databasen. Mit spørgsmål er: Hvor lægger jeg min metode addJob(Job j)
? Indtil videre kan jeg tænke på tre mulige løsninger:
-
Tilføj metoden
addJob(Job j)
tilDatabase
klasse, der giver abstraktion for resten af programmet. Resten af programmet behøver ikke bekymre sig, hvordan dette implementeres. Ulempen ved dette er, atDatabase
til sidst bliver meget stor. -
Opret en separat klasse
JobHandler
med konstruktørenpublic JobHandler(Database d)
som accepterer en database. I denneJobHandler
planlægger jeg at giveaddJob(Job j)
. Mit problem er her, på hvilket niveau skal jeg interagere medDatabase
, da der i øjeblikket ikke er nogen offentlige metoder undtagenopen()
ogclose()
. Skal jeg oprette en metode, der accepterer rene SQL-udsagn? Dette ser ikke meget godt ud for mig. -
Gør klassen
Database
abstrakt og udvid den, så jeg implementerer de manglende metoder her . Ulempen er, at jeg ikke kan sende databasen rundt og bruge den samme forbindelse til flere forespørgsler af forskellige slags.
Hvad ville man gøre for at løse dette problem? Hvordan skal jeg strukturere mine klasser, så de ikke bliver for store, og heller ikke for meget af databaseklassen skal udsættes for de klasser, der implementerer metoderne til at håndtere dataene?
Rediger Bemærk, at jobbet er en tilfældig klasse, der bare skal tjene som et eksempel på de data, der er gemt i databasen.
Kommentarer
- " Hvad ville man gøre for at løse dette problem? " Der er cirka 9001 modne biblioteker, der gør nøjagtigt alle disse ting. Brug et af dem.
- Kan du venligst give mig et eksempel på et sådant bibliotek. Jeg vil gerne undersøge det.
- Hvad mener du med, at Job kun er et eksempel på data?
- Jeg omordnede sætningen.
- Så find et bedre eksempel, ellers vil folk tro, at Problemet handler om databasejob (planlagte opgaver), uanset om du læser den forklarende redigering. Spørgsmålet er også for br oad og / eller ikke klar.
Svar
Spørgsmålet er meget forvirrende. Hvad der gør det mere forvirrende er det faktum, at du besluttede at bruge Job og Jobhandler som eksempler, der får en til at tænke, at spørgsmålet handler om databasejob (planlagte opgaver). Men efter at have læst redigeringen antager jeg, at du prøver at skrive en DAO og talte om job som i “en stilling”.
Skriv ikke en databaseklasse. Opret bare en JDBC-forbindelse, og send den til DAO.
Du kan enten prøve at skrive en generisk DAO eller skrive individuelle DAOer til hver enhed. DAOer har SQL sætninger inde i det.
Et andet mønster er Active Record Pattern .
DAOs får adgang til databaser, indkapsler SQL og giver dig mulighed for at udfylde forretningsobjekterne. DAOer kan også have metoder, der returnerer lister med data.
Active Record bruges normalt til at implementere forretningsobjekter, der administrerer, skriver og læser deres data fra databasen selv. Dette betragtes som for meget da klasser ikke skal styre deres egen vedholdenhed. Active Records repræsenterer en enkelt række i en tabel.
Dette spørgsmål om refactoring af en Active Record i DAO-form hjælper dig, fordi den har en komplet eksempel på et objekt, der får adgang til databaser og indsætter eller opdaterer, og dets svar forklarer, hvordan man implementerer DAO i stedet.
Kommentarer
- Du kan nævne ORM rammer også.
- @COMEFROM OP er en nybegynder. Han skal lære at svømme, før han kører jetski. ORMer er utroligt komplekse.
- Tak for dit svar. Jeg henviser til " bare opret en databaseforbindelse ". Dette ville betyde at oprette en forbindelse i hovedklassen med al fejlhåndtering osv.? Ville ' ikke denne konflikt med princippet om et enkelt ansvar?
- Hovedklassen overholder ikke ' SRP, fordi det normalt forbereder forudsætningerne, læser konfigurationsfiler osv., åbner hovedvinduet i tilfælde af GUI-apps, eller kalder i det mindste de metoder, der gør det, dets formål er at være et startpunkt for appen. Du kan oprette en funktion, der returnerer forbindelse og kalde den fra main, eller du kan bede om en forbindelse til en forbindelsespoolhåndtering, hvis du bruger en webcontainer, der understøtter forbindelsesbassiner osv.
Skriv et svar