methods vs. properties, and tests and code reference (Re: [Bf-python] API overhaul - ircmeeting?)

Gilbert, Joseph T. jgilbert at tigr.ORG
Mon Jan 9 16:34:38 CET 2006


This is a bit more complicated.
Bone.matrix does exist as a struct attribute and can be set with
tp_getset.

However....
Bone.matrix is a computed value based on head,tail,roll. Therefore in
the past I have allowed a getter but no setter. 
In the current code I have I have a work around to decompose the matrix
to head/tail/roll and Bone.matrix = Matrix() works but internally
doesn't actually set the matrix.

It would be pointless to have Bone.getMatrix() and Bone.setMatrix()
where you can simply provide Bone.matrix.
I see the value of tp_methods to incorporate things that are complex
enough to take multiple arguments or have not 'setter' corollary. 

-----Original Message-----
From: bf-python-bounces at projects.blender.org
[mailto:bf-python-bounces at projects.blender.org] On Behalf Of Toni
Alatalo
Sent: Sunday, January 08, 2006 10:09 AM
To: Blender Foundation Python list
Subject: methods vs. properties,and tests and code reference (Re:
[Bf-python] API overhaul - ircmeeting?)

On Sunday 08 January 2006 15:43, Michael Reimpell wrote:
> some tests (aka "use cases"). For example, take the Key module. You
have

if we get the api to be complete, these tests would in a way work as
tests for 
blender itself too. except that as things are refactoring the c parts
just 
breaks the py api, but well, at least the tests would point that out..
:/

but i am all for test driven development, first time did it last summer
in the 
ipython notebook project and it was beneficial, especially for
refactoring

> make life easier. That is, although the BPy class attributes are
limited to
> the C-struct elements, there can (and should) be getters or setters
for
> derived values. For example an armature bone could have a setter
> setTransformation(matrix) which changes the head, tail and roll values

i dont think the bpy instance attributes should be limited to the c
struct 
elements. instead of bone.setTransformation(matrix), why would we not
have a 
modifiable bone.matrix? it is still a thin wrapper (manipulating bpy
bone 
matrix actually modifies the internal rotation things), just via a
different 
interface (which is friendlier to e.g. importers).

> value" has the same information as no documentation at all. C
developers
> may even start to look into the BPy documentation to see what the C
struct
> elements mean.

i think the bpy api code may even work as a reference to the c code,
like: how 
to create a new ipo in blender in c? look at bpy Ipo
constructor/initializer 
to see! at least i tend to do that :)

> Also, I don't understand the "attributes above methods" philosophy.
Don't
> let a language dictate your design. In the proposed design attributes
have
> a clear meaning  as Blender's internal data, and this meaning fits
very
> well with Blender's data driven design.

aha, so you object bone.matrix because Blender does not have it
internally. 
ok, i promise to consider that point seriously. hmhm.

the reason why attributes/properties are usually preferred is that it ..
well, 
they are standard. if an object has an attribute, the standard way to
set it 
by using the Python setting operator, '='. you dont have to remember a 
special method for setting the attribute, you just use the normal
operator.

the reason why in some other languages, like Java (and C++ i suppose),
there 
are so-called 'setter' and 'getter' methods is that if some attribute 
requires some special code, like getting the value of it from a database
or 
calculating it based on some other internal attributes, it has to be
called 
as a method for it to be able to include the code to do that. Python
does not 
anymore have that limitation so all necessary values can be exposed
normally.

i do agree it is always not clear what should be a property, and what a 
method. while it is possible to have every method that returns only a
single 
value, and every method that takes no arguments, as a property (which
looks 
identical to attributes for a user), it does not make sense. like it
never 
crossed my mind to make something.update() a something.update =
'whatever' 
that magically runs the update code for an object. i did once do a
system 
where networked objects have a thing.changed property, which returns
True if 
the thing has changed after the previous call to that property, and it
was 
nice to use but scary too (perhaps even bad design). the case with
'update' 
is clear: it is command, a function in that sense, so it is best as
callable. 
'changed' .. is clearly not a command, but a state/value of the object,
so 
perhaps it is good as a property.

but 'transformation' and 'matrix' are not commands, they should not be 
callable. they are values, so their values are to be gotten by writing 
'thing.matrix' and assigned by 'thing.matrix = xxx'. even tho Blender
does 
not store it internally like that, it does not change the fact that
'matrix' 
is still an attribute of a bone - just in a different format (a
different 
view to the same data, one might say). 

i guess that is my argument. sorry for the long post, and thank you for
the 
interesting point. i do accept that am not too much of an expert in
this, so 
am not hurt by any kinds of flames and rants bashing potential stupid 
thinking there :)

and in this particular case, adding bone.matrix is not about writing
extra 
bloat to the api code under some assumption on the usage, but a response
to a 
direct request by armature import writers, right?

> Michael

~Toni
_______________________________________________
Bf-python mailing list
Bf-python at projects.blender.org
http://projects.blender.org/mailman/listinfo/bf-python



More information about the Bf-python mailing list