On Mar 14, 2010, at 5:21 PM, Marvin Humphrey wrote:

On Sun, Mar 14, 2010 at 02:30:48PM -0500, Peter Karman wrote:
I like this approach. It's more work for KS developers, in terms of managing api versions, but that's good work to do, since it requires making the api
changes very explicit.

I understand that this sounds attractive in theory, but it's not practical. Certainly having two versions run side by side won't ever work. We can't search-and-replace within compiled XS objects to substitute "KinoSearch" for "KinoSearch3". Does Query_Is_A(query, ORQUERY) pass, fail, or segfault when "query" was created under KinoSearch3, but ORQUERY is a VTable owned by KinoSearch4, aliased to KinoSearch? What should factory methods spit out, and how will they know? How will type checking across the Perl/C border work?

I don’t understand all of what you are saying, but I had in mind making KinoSearch an alias for KinoSearch4, and not vice versa. Running multiple versions in the same process I don’t consider a necessity. Does that change anything?


Changing up behaviors using an api_version key can work within a single
object, using one of the following strategies:

* Store api_version as a member variable and switch up behavior based on
   its value.  That's what HTML::Parser does, I believe.
* Have the constructor dispatch based on api_version and return objects
   blessed into different classes.
* Store an API-specific object within the main object and dispatch to that.

However, KinoSearch is a highly performance-sensitive library with hundreds of classes and lots of interaction between all the various parts. Furthermore, it doesn't use hash-based method dispatch, but compile time binding -- which is much faster, but also means that invoking an invalid method on an object results in a memory error rather than a catchable exception. At best that's a
segfault, at worst it's a security hole.

Marvin Humphrey


_______________________________________________
kinosearch mailing list
[email protected]
http://rectangular.com/cgi-bin/mailman/listinfo/kinosearch

Reply via email to