On 23/04/2006, at 18:13, BJörn Lindqvist wrote:
>
>> Non-generic function approach:
>>
>> def do_something(obj):
>> if instance(obj, basestring):
>> do_something_with_string(obj)
>> if instance(obj, int):
>> do_something_with_int(obj)
>> else:
>> do_something_default(obj)
>>
>> Generic-function approach:
>>
>> @generic()
>> def do_something(obj):
>> """Does something fancy with obj"""
>>
>> @do_something.when("isinstance(obj, basestring)")
>> def do_something_with_string(obj)
>> ....
>>
>> @do_something.when("isinstance(obj, int)")
>> def do_something_with_int(obj)
>> ....
>>
>> @do_something.when(default)
>> def do_something_default(obj)
>> ....
>>
>> As you can see, the generic function approach makes you write even
>> more.
>
> So you triple the length of the code.
Yep, for simple things the KISS maxim should be applied.
>
>> However, the biggest benefit, as I see it, is that these rules can be
>> defined anywhere (read: external modules), which basically aids in
>> manteinability because you don't need to touch the original module
>> where the
>> function is defined when you need to tweak it's behavior. Oh, I
>> should also
>
> So with one call:
>
> jsonify(someobj)
>
> You have to look at code all over place to find out what it really
> does? Because there can be some external module which due to the
> coolness of generic functions are allowed to define additional rules.
Or use a debugger
>
>> mention that there's a much smarter algorithm than me taking care of
>> balancing the decision tree on the fly so it remains as efficient as
>> possible.
>
> Premature optimization.
Ok, and when you have 1500 rules? Or when you wan to change the rules
for a different client's install?
>> Also I should note that you don't *need* to undersand how they
>> work in order
>> to *use* them. What can be easier to explain to users than: "To
>> get the JSON
>> representation of A do jsonify(A)"? Of course, to actually define
>> new rules
>> you have to study them a bit, but come on, I'm not that smart and
>> I can make
>> use of them given my limited experience.
>
> Yes and when something goes wrong you have to understand them. And
> when someone asks "But Alberto, what DOES jsonfiy(A) do?" that is not
> an easy question to answer.
import pdb
>> You too make good use of this when you define rules in
>> soprovider.py to
>> jsonify TG_User, etc. How would you have liked to hack on a long
>> list of
>
> I think it is bad use IMHO. The code is:
>
> def jsonify_group(obj):
> result = jsonify_sqlobject( obj )
> result["users"]= jsonify( [u.user_name for u in obj.users] )
> result["permissions"]= jsonify( [p.permission_name for p in
> obj.permissions] )
> return result
> jsonify_group = jsonify.when('isinstance(obj, TG_Group)')
> (jsonify_group)
>
> Why isn't it instead:
>
> class TG_Group(InheritableSQLObject):
> def __json__(self):
> result = jsonify_sqlobject( obj )
> result["users"]= jsonify( [u.user_name for u in obj.users] )
> result["permissions"]= jsonify( [p.permission_name for p in
> obj.permissions] )
> return result
Actually that example would work by grace of
jsonify.jsonify_explicit, flexibility...
Oh, and you might want to jsonify objects built from classes you
cannot directly modify, like from an C extension. Ok, ok.. you can
wrap that C extension's object and provide the __json__ method
yourself... but I *personally* would favor writing a new rule to
overload a generic function. A matter of taste I guess...
>> "elifs" inside an external egg (TurboJSON) making sure it's always
>> up to
>> date, doesn't introduce dead branches and doesn't conflict with
>> previous
>
> With a normal simple if-elif dispatch, it wouldn't have to be an
> external module. It would be 30 lines of Python code in a file named
> jsonify.py. So yeah, I'd definitely prefer to hack in that file over
> the complicated dispatch thingy.
Ok, now you want to distribute your project... with a hacked version
of dependency Y which obliges your users to have Y and Y' on their
systems with the most probably headaches they'll experience.
>> rules? Not to mention that "extenders" of your identity classes
>> can write
>> more specific rules, just below their subclasses, to jsonify them
>> in a
>> different manner...
>
> Why can't they just override __json__()?
C extension example above.
>> The bottom line is that I'm not a good judge here, I'm now biased and
>> blinded by they're beauty, sorry but I cannot agree with you
>> here... ;) The
>> importance generic functions are getting in TG is a plus for me...
>
> Neither am I, but I still like to complain about them. :) They cause
> me pain when I try to send utf8 encoded strings through JSON.
No problem, I still like to defend them ;)
Alberto
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups
"TurboGears" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at http://groups.google.com/group/turbogears
-~----------~----~----~----~------~----~------~--~---