On Sunday, 29 September 2013 at 15:26:19 UTC, Gary Willoughby
wrote:
On Saturday, 28 September 2013 at 16:39:27 UTC, simendsjo wrote:
I'm very uncertain about several aspects of my design:
* Class vs. struct
* Returned values from MySQL - e.g. should SELECT TRUE return
long as it does in MySQL, or should we interpret it as bool
* Probably a lot I don't remember right now :)
Any comments would be very helpful.
..Or in D terms: DESTROY!
Ok, i've taken a quick look and like where this is going. I'll
try and give you a little guide to what i would do regarding
the above points.
* Class vs. struct
I tend to only use structs where the type is purely a data
type. Something like a record or a type that can be manifested
in different ways (such as an IP address). If i need to model a
real world object like an engine or book, etc., i use a class.
I don't think it's that simple in this case. When I implement
lazy fetching, both methods have it's advantages and
disadvantages.
MySQL doesn't allow multiplexing on a connection. This means a
command must complete before issuing another. If reading rows
lazily and then issuing a new command, the choice is to either
disallow the new command, or invalidate the previous. The simple
way would be to just start a new command and invalidate the
previous, but is this the best way? If we choose to disallow new
commands, that means the user have to explicitly close a lazy
command. If using classes, we can safely have several instances
for a command (is this neccessary?), but then the destructor
wont't be a safe bet, and the user have to call close.
If implemented as a struct, we have to disallow copying.
So... I really don't know what the best design would be.
* Returned values from MySQL - e.g. should SELECT TRUE return
long as it does in MySQL, or should we interpret it as bool
I would return what mysql yields. This would make sure this
framework is not doing to much. Converting ints to bools would
be the next layer's job (DBAL, ORM, etc.).
The problem is that MySQL is inconsistent here, and it depends on
if it's a field or a constant. SELECT TRUE is not the same as
SELECT boolean_field.
Also, it seems every constant integer is returned as LONGLONG.
But.. The fields include a length property..
I have two more suggestions that i think is critical to a
project such as this and that's documentation and unit tests.
Please from the start thoroughly annotate everything with ddoc
to generate nice html docs later. I know this can be a pain
when designing and developing an API but is absolutely
necessary. If you leave documentation until the end it never
gets done!
Yeah, the documentation isn't very good :/
Thought I'd get feedback on the API before spending a lot of time
documenting it.
Write unit tests for everything. I've found that if you find it
hard to write a unit test for any 'unit', etc then it's too
tightly coupled and probably doing too much. Practise good
SOLID design principles and unit tests should be easy to write.
Not only that but unit tests provide developers with a good
understanding of the public interface.
http://en.wikipedia.org/wiki/SOLID_(object-oriented_design)
Most of the code is easy to unittest, but for now I've just
relied on integration tests against a database. I'll improve on
the situation.