Toepassing OO principe DRY

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • martijngr85
  • Registratie: Maart 2009
  • Laatst online: 05-08 10:32
Goedemorgen,

Ik heb wat moeite met het principe Don't Repeat Yourself. Ik heb vele methods waarvan de implementatie veel op elkaar lijken. Een voorbeeld (C#):

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
Database db = new Database; // mijn eigen database class
string query = "SELECT * FROM tabel";
SqlCommand com = new SqlCommand(query);

try
{
  if(db.ExecuteSelectQuery(com))
  {
    DataTable dt = db.GetDataTable;

    List<User> users = new List<User>();

    foreach(DataRow row in dt.Rows)
    {
      User user = new User();

       user.name = row["naam"];
       user.id = row["id"];

       users.add(user);
    }

    return users;
  }

  return null;
}
catch(Exception)
{
  throw;
}


Bovenstaand is enkel even een simpel voorbeeld. Het punt is namelijk dat ik een hoop van zulk soort methods heb, In elke method wordt een instantie van de Database class gemaakt, een SqlCommand object gemaakt en hier de bijhorende query meegegeven. En indien nodig worden bij het SqlCommand object ook de SqlParameters opgegeven. Het idee van deze method is dus steeds hetzelfde. Ik heb het gevoel dat dingen dubbel zit te doen en dat dit eenvoudiger kan, alleen heb ik nog niks kunnen verzinnen. Daarom eigenlijk mijn vraag, hebben jullie een idee om dit te vereenvoudigen? Hoe pakken jullie dit soort dingen aan?

Bedankt alvast,

Martijn.

Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Maak een db abstractie laag welke enkel de resultset teruggeeft? Scheelt de helft van de saaie code en is met andere db's of debugging ook wel erg leuk.

{signature}


Acties:
  • 0 Henk 'm!

  • martijngr85
  • Registratie: Maart 2009
  • Laatst online: 05-08 10:32
Je bedoeld dat de method een DataTable of DataSet retourneert (of null)? En waarom abstract?

Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
abstracte laag != abstract class.

Mag van mij ook 1 op 1 op je specifieke DBMS gericht zijn, maar in theorie zou je op tot dat punt op een dbms onafhankelijke manier kunnne kletsen.

{signature}


Acties:
  • 0 Henk 'm!

  • martijngr85
  • Registratie: Maart 2009
  • Laatst online: 05-08 10:32
Sorry, maar ik ik volg je niet helemaal. Begrijp niet wat je bedoeld.

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Wat je denk ik nog veel beter kunt doen is kijken naar een O/R mapper als LLBLGen of NHibernate ofzo ;) Scheelt een boel werk.

[ Voor 10% gewijzigd door RobIII op 01-07-2009 11:00 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • martijngr85
  • Registratie: Maart 2009
  • Laatst online: 05-08 10:32
Geen flauw idee wat dat is/zijn. Ik ben even google'en...

Acties:
  • 0 Henk 'm!

  • muksie
  • Registratie: Mei 2005
  • Laatst online: 17-09 18:14
Hij bedoelt waarschijnlijk dat je een 'laag' om je database heen maakt, die alle veel gebruikte code bevat. Je hebt nu je eigen Database klasse, en dat je deze bijvoorbeeld uitbreidt met een methode executeSelect, zodat je iets kunt doen als:
code:
1
2
3
rows = db.executeSelect("SELECT * FROM tabel");
List<User> users = new List<User>();
foreach ...

Dan hoef je niet altijd weer de SqlCommand etc. aan te maken. Je kunt dit nog veel verder invoeren. Je zou bijvoorbeeld een functie kunnen schrijven die een rij uit de tabel omzet in een User object, en deze functie in de body van de foreach loop aan roepen. Of je maakt een UsersTable klasse aan, welke al automatisch de User objecten returned.

Acties:
  • 0 Henk 'm!

  • CodeCaster
  • Registratie: Juni 2003
  • Niet online

CodeCaster

Can I get uhm...

muksie schreef op woensdag 01 juli 2009 @ 11:06:
Dan hoef je niet altijd weer de SqlCommand etc. aan te maken. Je kunt dit nog veel verder invoeren. Je zou bijvoorbeeld een functie kunnen schrijven die een rij uit de tabel omzet in een User object, en deze functie in de body van de foreach loop aan roepen. Of je maakt een UsersTable klasse aan, welke al automatisch de User objecten returned.
... of je gebruikt gewoon NHibernate, dat doet al het bovenstaande al voor je. :)

https://oneerlijkewoz.nl
Op papier is hij aan het tekenen, maar in de praktijk...


Acties:
  • 0 Henk 'm!

  • martijngr85
  • Registratie: Maart 2009
  • Laatst online: 05-08 10:32
Iedereen gebruikt hier dus NHibernate?

Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 10:15

Janoz

Moderator Devschuur®

!litemod

Toen ik nog geen O/R mapper gebruikte was ik erg gecharmeerd van het jdbcTemplate van Spring. Deze gaf niet een resultset terug, maar had een mapper nodig die elke row van de resultset omzette naar je domein object (of wat je er ook maar mee wilde doen). Het voordeel is dat niet alleen het aanmaken van de resultset in een aparte class zit, maar ook het uitlezen, weer opruimen en de volledige foutafhandeling van fouten die daarbij op kunnen treden.

Hier wordt vanalles over het jdbcTemplate verteld. Het lijkt me niet lastig om een dergelijke sttructuur ook voor .Net op te kunnen zetten.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
martijngr85 schreef op woensdag 01 juli 2009 @ 11:26:
Iedereen gebruikt hier dus NHibernate?
Natuurlijk niet; het is niet alsof er maar 1 keus is ofzo. Er zijn er wel veel die NHibernate gebruiken hier, maar "iedereen" dus niet; daarbij dien je voor jezelf de keuze te (kunnen) maken welke voor jou het best is.

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • GSteven
  • Registratie: Juli 2004
  • Laatst online: 17-09-2024
Indien je geen NHibernate of iets dergelijks wenst te gebruiken raadt ik zeker en vast aan om het Template Method pattern toe te passen.

Een zeer mooi voorbeeld hiervan komt van Janoz met die jdbcTemplate.

Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Laatst online: 14:03
RobIII schreef op woensdag 01 juli 2009 @ 11:32:
[...]

Natuurlijk niet; het is niet alsof er maar 1 keus is ofzo. Er zijn er wel veel die NHibernate gebruiken hier, maar "iedereen" dus niet; daarbij dien je voor jezelf de keuze te (kunnen) maken welke voor jou het best is.
Niet ? :?
;)

Wat ik niet snap, is dat je een 'Database' class hebt gemaakt, maar dat je nog eens apart (daarbuiten) je IDbCommand objecten etc.. moet gaan maken / aanspreken.
Als ik een database-class zie, zou ik toch verwachten dat dit ge-abstraheerd werd.

https://fgheysels.github.io/

Pagina: 1