[Harbour-users] Re: OOP ORMs etc
dougf at people.net.au
dougf at people.net.au
Wed Mar 17 21:39:35 EDT 2010
Hi all
Re the naming of classes:
Prefixing class names with a T I think originates with Borland
products. The main reason I adopted it was that at one point in time at
least Harbour treated it as an error if your source file and class had the
same name. That is you couldn't have a file named patient.prg containing
a class patient. One solution was to name the source file
patient_class.prg but in the end I adopted the T prefix for the class name
instead. It's probably not still an issue with Harbour - I just haven't
checked - but the habit has stuck.
As for readability I personally find MedicalPractice easier to "read"
than medicalpractice so thats how I name them (actually I use a prefix so
an object would be obj_MedicalPractice. Of course xBase folds everything
to upper case anyhow so people can share classes and adopt their own
conventions.
I know my prefixes are longer ( I use obj_ whereas I guess "the norm" -
if there is one - would be just o. So I would have obj_Person rather
than oPerson or if you don't like capitalisation I guess operson or drop
the prefix and just have person. Again the latter might be a tad
confusing if that is also the name of your class. I like to use a wide
range of prefixes - for example I will usr fh_ for a file handle (a
specilaised form of int_), dlg_ for a dialog (a specialised form of obj_)
etc
I'm not tyrying to push my way of doing things (which has changed over
the years so my older code doesn't match the new style) but rather just
explain the reasons I have reached the style I use now.
Re the structure of my client-server data base back end (presumably much
in common with a client server ORM)
Will take a number of posts to explain. Data (for a single item) is
transmitted as a two dimensional array contained in a wrapper array.
Looking at the inner two dimensional array first.
Assume I have a class as follows:
CLASS Person
DATA FamilyName
DATA GivenName
DATA Gender
DATA DOB
ENDCLASS
Now if I have an array as follows:
arr_MyData := { { "FamilyName", "Citizen" }, { "GivenName", "Joe" }, {
"Gender", "M" }, { "DOB", "19601231" } }
I can set all the properties of an object of class Person with
__ObjSetValueList( self, arr_MyData )
[I have assumed that code is in a member function of class Person if not
then assuming we have obj_ThisPerson you would have
__ObjSetValueList( obj_ThisPerson, arr_MyData ) ]
That is the basic mechanism my code uses.
However we have to allow for the back end encountering a problem so I
wrap this array up as the second element of an array, the first element
of which is an array containing success and / or failure information. So
the back end can flag success, a problem that might make retrying
worthwhile or one that is unrecoverable. And I allow for a series of
error messages / warnings.
This wrapper array is built on the back end, then the function
HB_Serialize() is used to convert to a binary string which is then
transmitted to the client using IP sockets where assuming success is
indicated the data array is recreated using HB_Deserialize() and used to
update the properties of the object as per the above discussion.
This approach has proved to be robust and can be used with front and back
end on a single machine or a cross a network or VPN.
My back end "knows" that the contents of field PN_SURNAME should be
returned paired with the expected property name "FamilyName" .
I can share how that works in a further post if anyone is interested.
Regards to all
xProgrammer
More information about the Harbour-users
mailing list