Hi Matthew, On Wed, Aug 17, 2011 at 8:44 AM, Matthew Pocock < turingatemyhams...@gmail.com> wrote:
> Hi, > > Before I start, I'd love to see a binary compatible codec release with the > Beider Morse code in, and for generics to be dealt with in a later release. > I think this is where we are going, see previous emails and threads. > What I'm not quite sure about is why introducing generics will necessarily > cause breaking changes. > I can break things depending on the new design... we'll have to all discuss. See the branch in SVN for my first cut. https://svn.apache.org/repos/asf/commons/proper/codec/branches/generics > It seems to me that the Encoder/Decoder interfaces are screaming out to be > generified, Yes! :) > and the current sub-interfaces should be removed unless there's > a compelling reason for them e.g. if they add extra methods. It is no > hardship in your code to write Encoder<String, String> rather than > StringEncoder. I realise that in any one application it may be the case > that > they use only one family of encoders (e.g. String => String), but I don't > see why this means we should be introducing a Java interface explicitly for > this use case. > I had not thought about it that way and I do like the idea since there are no new methods there. If you look at the branch I have: interface Encoder<I,O> with "O encode(I)" and interface SymmerticEncoder<T> extends Encoder<T, T> interface StringEncoder extends SymmerticEncoder<String> I could see doing away with StringEncoder. This would hopelessly break compatibility but I like it because it uses generics in the most natural way IMO. > We could have StringEncoder extends Encoder<String, String> if we wished. > The problem with this is that not every Encoder<String, String> is a > StringEncoder. It isn't a type alias. By introducing an extra interface, > we're introducing an extra layer of contract. Right now StringEncoder does > introduce an extra contract - it provides an over-loaded encode method > specialised to String, and it is possible for implementations to do > different work in the two different methods. > > In the specific case of the BeiderMorse encoder, the natural sig is > Encoder<String, Set<String>>. I expect this is the case for some other > StringEncoder implementations that deal with phonetic encodings. Would we > then introduce yet another interface, FuzzyStringEncoder to capture this? > I hope not! > All seems a bit messy to me. > > Java does not allow you to implement the same interface with different > generic type arguments. So, you can't have Foo implements Encoder<Object, > Object>, Encoder<String, String>. Yep, that's the only problem I ran into when adding generics to the branch > Because of this, you can't provide > different behaviour for the two different cases. This is sort of what the > current situation requires. However, look at what javap says has been > generated in these scenarios. > AH, it looks like you decompiled the branch ;) Gary > > ## java > public interface Encoder<ENC, DEC> { > public ENC encode(DEC dec); > } > > ## javap > public interface Encoder{ > > public abstract java.lang.Object encode(java.lang.Object); > > } > > ## java > public interface StringEncoder extends Encoder<String, String> {} > > ## javap > public interface StringEncoder extends Encoder{ > > } > > ## java > public class IdE implements Encoder<String, String> { > public String encode(String in) { > return in; > } > } > > ## javap > > public class IdE extends java.lang.Object implements Encoder{ > public IdE(); > public java.lang.String encode(java.lang.String); > public java.lang.Object encode(java.lang.Object); > } > > ## java > public class IdSe implements StringEncoder { > public String encode(String in) { > return in; > } > } > > ## javap > public class IdSe extends java.lang.Object implements StringEncoder{ > > public IdSe(); > > public java.lang.String encode(java.lang.String); > > public java.lang.Object encode(java.lang.Object); > > } > > > ## java > public interface StringEncoder2 extends Encoder<String, String> { > @Override > public String encode(String in); > } > > ## javap > public interface StringEncoder2 extends Encoder{ > public abstract java.lang.String encode(java.lang.String); > } > > ## java > public class IdSe2 implements StringEncoder2 { > public String encode(String in) { > return in; > } > } > > ## javap > public class IdSe2 extends java.lang.Object implements StringEncoder2{ > public IdSe2(); > public java.lang.String encode(java.lang.String); > public java.lang.Object encode(java.lang.Object); > } > > So, I guess I'm wondering what the breaking changes are that definitely get > introduced by generification, and if there are a significant number that > can't be dealt with by a bit of judicious use of deprecation and deprecated > interfaces. > > Matthew > > On 17 August 2011 06:24, Gary Gregory <garydgreg...@gmail.com> wrote: > > > On Aug 16, 2011, at 23:47, sebb <seb...@gmail.com> wrote: > > > > > On 17 August 2011 04:30, Gary Gregory <garydgreg...@gmail.com> wrote: > > >> On Tue, Aug 16, 2011 at 11:14 PM, sebb <seb...@gmail.com> wrote: > > > > > > ... > > > > > >> FYI: > > >> > > >> What would need to be reversed out of trunk for a 1.6 binary > compatible > > with > > >> 1.5 is: > > >> > > >> [image: Error]Method 'public StringEncoderComparator()' has been > removed > > >> org.apache.commons.codec.StringEncoderComparatorpublic > > >> StringEncoderComparator()[image: Error]Method 'public boolean > > >> isArrayByteBase64(byte[])' has been removed > > >> org.apache.commons.codec.binary.Base64public boolean > > >> isArrayByteBase64(byte[])[image: Error]Class > > >> org.apache.commons.codec.language.Caverphone removed > > >> org.apache.commons.codec.language.Caverphone > > >> [image: Error]Method 'public int getMaxLength()' has been removed > > >> org.apache.commons.codec.language.Soundexpublic int > > getMaxLength()[image: > > >> Error]Method 'public void setMaxLength(int)' has been removed > > >> org.apache.commons.codec.language.Soundexpublic void > > setMaxLength(int)[image: > > >> Error]Field charset is now > > >> finalorg.apache.commons.codec.net.URLCodeccharset[image: > > >> Error]Method 'public java.lang.String getEncoding()' has been removed > > >> org.apache.commons.codec.net.URLCodecpublic java.lang.String > > getEncoding() > > > > > > DIfficult to read, but looks like the Clirr report I generated. > > > > Yep, that's what the build generates. > > > > Gary > > > > > > > >> Gary > > >> > > >>> > > >>>> Gary > > >>>> > > >>>>> > > >>>>>> Gary > > >>>>>> > > >>>>>> > > >>>>>>> > > >>>>>>>> Gary > > >>>>>>>> > > >>>>>>>> > > >>>>>>>> > > >>>>>>>>> > > >>>>>>>>> Here is one thought in favour of removing them, at least from > > >>> Base64: > > >>>>>>>>> sometimes I copy Base64.java into my own projects as a > > copy/paste. > > >>> I > > >>>>>>>>> change the namespace. Then I remove references to other parts > of > > >>>>>>>>> commons-codec that I am not bringing in, but that Base64.java > > refers > > >>>>>>>>> to (typically Encoder, Decoder, and EncoderException). The > > smaller > > >>> my > > >>>>>>>>> delta after the copy/paste, the easier it is for me copy the > > newest > > >>>>>>>>> version in the future to keep my fork up to date. > > >>>>>>>>> > > >>>>>>>>> I like doing this because it can make the difference between > > needing > > >>> a > > >>>>>>>>> jar dependency and having no dependencies at all in some of my > > other > > >>>>>>>>> work. > > >>>>>>>>> > > >>>>>>>>> > > >>>>>>>>> Of course I am pretty focused on Base64. I have never used the > > >>> soundex > > >>>>>>>>> stuff. > > >>>>>>>>> > > >>>>>>>>> > > >>>>>>>>> I'm torn. On the one hand, I suspect the Encoder/Decoder > > interfaces > > >>>>>>>>> have been mostly unused, and analyzing the Maven2 repository > > could > > >>>>>>>>> shed light on that. Removing the interfaces makes sense if > they > > are > > >>>>>>>>> not really used, but on the other hand, improving them, making > > them > > >>>>>>>>> actually useful, also makes sense. > > >>>>>>>>> > > >>>>>>>>> > > >>>>>>>>> > > >>>>>>>>> > > >>>>>>>>> > > >>>>>>>>> -- > > >>>>>>>>> yours, > > >>>>>>>>> > > >>>>>>>>> Julius Davies > > >>>>>>>>> 604-222-3310 (Home) > > >>>>>>>>> > > >>>>>>>>> $ sudo apt-get install cowsay > > >>>>>>>>> $ echo "Moo." | cowsay | cowsay -n | cowsay -n > > >>>>>>>>> http://juliusdavies.ca/cowsay/ > > >>>>>>>>> > > >>>>>>>>> > > >>> --------------------------------------------------------------------- > > >>>>>>>>> To unsubscribe, e-mail: dev-unsubscr...@commons.apache.org > > >>>>>>>>> For additional commands, e-mail: dev-h...@commons.apache.org > > >>>>>>>>> > > >>>>>>>>> > > >>>>>>>> > > >>>>>>>> > > >>>>>>>> -- > > >>>>>>>> Thank you, > > >>>>>>>> Gary > > >>>>>>>> > > >>>>>>>> http://garygregory.wordpress.com/ > > >>>>>>>> http://garygregory.com/ > > >>>>>>>> http://people.apache.org/~ggregory/ > > >>>>>>>> http://twitter.com/GaryGregory > > >>>>>>>> > > >>>>>>> > > >>>>>>> > > --------------------------------------------------------------------- > > >>>>>>> To unsubscribe, e-mail: dev-unsubscr...@commons.apache.org > > >>>>>>> For additional commands, e-mail: dev-h...@commons.apache.org > > >>>>>>> > > >>>>>> > > >>>>>> > > --------------------------------------------------------------------- > > >>>>>> To unsubscribe, e-mail: dev-unsubscr...@commons.apache.org > > >>>>>> For additional commands, e-mail: dev-h...@commons.apache.org > > >>>>>> > > >>>>>> > > >>>>> > > >>>>> > --------------------------------------------------------------------- > > >>>>> To unsubscribe, e-mail: dev-unsubscr...@commons.apache.org > > >>>>> For additional commands, e-mail: dev-h...@commons.apache.org > > >>>>> > > >>>> > > >>>> > --------------------------------------------------------------------- > > >>>> To unsubscribe, e-mail: dev-unsubscr...@commons.apache.org > > >>>> For additional commands, e-mail: dev-h...@commons.apache.org > > >>>> > > >>>> > > >>> > > >>> --------------------------------------------------------------------- > > >>> To unsubscribe, e-mail: dev-unsubscr...@commons.apache.org > > >>> For additional commands, e-mail: dev-h...@commons.apache.org > > >>> > > >>> > > >> > > >> > > >> -- > > >> Thank you, > > >> Gary > > >> > > >> http://garygregory.wordpress.com/ > > >> http://garygregory.com/ > > >> http://people.apache.org/~ggregory/ > > >> http://twitter.com/GaryGregory > > >> > > > > > > --------------------------------------------------------------------- > > > To unsubscribe, e-mail: dev-unsubscr...@commons.apache.org > > > For additional commands, e-mail: dev-h...@commons.apache.org > > > > > > > --------------------------------------------------------------------- > > To unsubscribe, e-mail: dev-unsubscr...@commons.apache.org > > For additional commands, e-mail: dev-h...@commons.apache.org > > > > > > > -- > Dr Matthew Pocock > Visitor, School of Computing Science, Newcastle University > mailto: turingatemyhams...@gmail.com > gchat: turingatemyhams...@gmail.com > msn: matthew_poc...@yahoo.co.uk > irc.freenode.net: drdozer > tel: (0191) 2566550 > mob: +447535664143 > -- Thank you, Gary http://garygregory.wordpress.com/ http://garygregory.com/ http://people.apache.org/~ggregory/ http://twitter.com/GaryGregory