Friday, July 7, 2017

Friday Challenge #1: Data Access

Today, I'm going to do a whole different kind of post - a Friday Challenge! Here's how it works: I'll post a challenge, you take up the challenge (usually by writing some code) and post the results or a link to the resulting repository in the comments. Discussions ensue. We share information. I'll put one up every Friday if there's interest. It's fun and engaging, what can go wrong? With that, here we go:

First Friday Challenge.

Your Quest is to write data access code using 3 different "patterns". I'll try to be a language agnostic as possible, the one requirement is to use a SQL based database.


Background:

In software there are many ways to perform the same functional operation, some are better than others when it comes to change, re-use, and readability.

Scenario:

You have a `users` table with the following columns: id IDENTITY/AUTOINCREMENT INT, name VARCHAR(255). You have the user's id and need to lookup the name of the user.

Example:

Given the following users:

|id|name|
|1|Marquart Flitshema|
|2|Loriens Blakens|
|3|Ashima Kithra|

When I look up a user with the id 1,
Then I should get the name "Marquart Flitshema".

When I look up a user with the id 3,
Then I should get the name "Ashima Kithra".

Challenge:

Pattern 1: Everything in 1 class/method/function (this is actually an anti-pattern).

Pattern 2: Pass the SQL and some mapping class/method/function into a different construct (class/method/function) to handle execution. Could be a base class (abstract or not), could be a prototype, any other construct will do so long as it is distinct from the construct that handles the SQL string and the mapping.

Pattern 3: Pass an entire construct into a different construct which handles the execution (by passing the database connection into the first construct).


Each pattern should be consumed similar to the following depending on language:

Pattern 1:

db->GetUserName(1);
db.GetUserName(1);
db.getUserName(1);
DataBase.getUserName 1.

 Pattern 2:

  users->GetName(1);
  users.GetName(1);
  users.getName(1);
  Users.GetName 1

  OR

  users.->Get(1).name;
  users.Get(1).Name;
  users.get(1).getName();
  users.get(1).name;
  Users.Get 1
  |> user.name.
(getName (dbQuery getUser 1))

consider the advantages and disadvantages of both approaches.

Pattern 3:

db->Query(userNameQuery);
db.Query(userNameQuery);
db.query(userNameQuery);
Db.Query UsersQueries.NameQuery 1

OR

db->Query(userQuery)->Name;
db.Query(userQuery).Name;
db.query(userQuery).getName();
...

again consider advantages and disadvantages

Those are just examples in various language formats or pseudo-language formats. I tried to be inclusive, though I'm not as well versed in some languages (for a bit of language fun look up DerpCode). Feel free to use due dilligence such as null checking, exception handling whatever else you would like, but try not to muddle up the point too much with all that for now...don't let it get you off track is what I mean.

The code doesn't need to work completely, but if consumed by other code it should work (hint: you could use Unit Tests to drive the code and mock out the database but there should be some sort of `connect`, `open`, `close` and whatever else your SQL DB of choice normally has in the mock).

So that's it, the first Friday Challenge...go forth on your quest! If you need any tips, explainations, etc...feel free to put those in a comment and I (or anyone else who feels enlightened to do so) will do our best to get back to you as soon as we can. You should create a repo in GitHub, Bitbucket, JsBin, *Bin, someother online platform or whatever you do then share your work in the comments. Please don't link to file downloads, dropbox, etc...those aren't really for sharing code the way your should be sharing it for this.

No comments:

Post a Comment