Don Brown wrote:
On 2/22/08, Brian Pontarelli <[EMAIL PROTECTED]> wrote:
 Here's an example... The XWork configuration API changed to the builder
 pattern. This is probably a good thing, but required any plugin using it
 to make significant changes and re-compile. This  change wasn't
 compatible and there are ways to make these types of changes while not
 impacting compatibility. Then it doesn't matter what the version numbers
 are. You deprecate things correctly and then remove them on a defined
 schedule.

I disagree - we should be able to make internal changes between minor
versions without deprecations where necessary and I would consider
this necessary.  By preserving the constructors and setter methods on
the configuration entities, we wouldn't have gained any of the
immutable benefits of the builders, and therefore, the bugs would have
continued to exist.

There is a significant distinction between changing an internal API
and an external one.  The number of people that were affected by this
change was probably less than 10, as most users aren't creating
ActionConfig objects.
Yep and those APIs are now public. They are no longer internal because anyone can plug into the configuration system via a plugin, web.xml, struts.xml, etc. Therefore, they should eventually stop changing and have a well defined API plan for making incompatible changes. It shouldn't matter if 10 or 1,000 people are using them, I feel that once they are public they need to be controlled.

 But, I will say this... Struts 2 doesn't have any compatibility
 definition at all. Versions 2.1.0 and 2.1.1 might be incompatible and
 2.1.5 and 2.2.7 might be compatible. This makes it impossible for tools
 like Ivy and Savant to manage Struts dependencies correctly. Therefore,
 I think it is VITAL that we pick a compatibility model and stick to it.

Well, the Struts project has always had a defined strategy to guide
changes and deprecations, although I can't seem to find it on the
website right now.  Also, each release plan includes notes where
incompatibilities are listed.  What more do you suggest we do?
I don't think this is necessarily true. I couldn't find anything stating how the public APIs would be compatible across versions anywhere. Having worked deeply in dependency management for enormously large applications I can say that projects need to define a compatibility strategy and a versioning scheme that allows tools like Maven, Savant, Ivy, etc to figure out which version to use. Here's an example:

project A -> library B 1.0 -> library C 1.1 -> library D 1.3
project A -> struts 2.0.6

library C -> library F -> struts 2.1.1

library B -> library G -> struts 2.0.12


-> means dependency.

As you can see, these libraries (which might be plugins or whatever) are using different versions of Struts. How is the build supposed to determine which version to use? Which versions are compatible? Should the build complain that 2.1.1 isn't compatible? Should it just pick 2.1.1 because it is the latest version? Should the maintainer of library F revert back to 2.0.12 or some other version?

This is a simple case and I've seen much worse.

The solution is this:

1. Pick a versioning scheme. I suggest that minor numbers indicate compatibility such that 2.1.x are all compatible but 2.1 is not compatible with 2.2. This seems to be the pattern. This is commonly referred to as "patch" compatibility since things are only compatible across patch version numbers like 2.1.1 and 2.1.2.

2. Tell developers that if the minor numbers in the version aren't changing, they can't break any public APIs runtime compatibility.

That should be it. Simple, straight-forward and still allows each release to have its own version number. Then the tools can correctly manage dependencies.

-bp


---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to