[Pharo-dev] In-memory FileSystem write streams not being polymorphic

Stéphane Ducasse stephane.ducasse at inria.fr
Wed Nov 13 16:31:30 EST 2013


thanks for this discussion it is interesting. 
I like small api fully implemented vs large and bogus ones

Stef

On Nov 13, 2013, at 6:47 PM, Nicolas Cellier <nicolas.cellier.aka.nice at gmail.com> wrote:

> 
> ---------- Forwarded message ----------
> From: Nicolas Cellier <nicolas.cellier.aka.nice at gmail.com>
> Date: 2013/11/13
> Subject: Re: [Pharo-dev] In-memory FileSystem write streams not being polymorphic
> 
> The long answer is simple: the more responsibility you put in Stream, the more complexity you get.
> The first complexity that I'm speaking of is non-uniformity and random implementation (or un-implementation) of a set of features.
> I mean some streams in the huge hierarchy implement only half of the contract, but hey, what was the contract exactly?
> Ah, yes, there were no contract, just hacks left here and there randomly and concurrently in a big hierarchy.
> I add a new subclass, but don't implement all the features, there are too many of them, and I don't know them all..
> I add a new feature, but don't implement it in all the classes, there are too many of them, and I don't know them all.
> This procedure invariably ends up with a blob of un-maintanable code, were two stream would not even agree on upToEnd behavior - I think you remember it :)
> 
> If the goal is to replicate all the accumulated responsibilities of Squeak Streams, but with a clarified contract, I think this is a dead end: too much cruft to support, too many features, too many undefined or not well defined behaviors to be clarified.
> 
> Xtreams takes the opposite path: concentrate on constructing a common, simple and uniform API, concerning streams, just basic stream methods.
> Some specialized streams then implement some specialized behavior, and you can compose them (by wrapping) when you need the specific API.
> This way, you ain't got to implement/maintain feature A into a few dozen of classes.
> And your brand new SpecialFeatureBStream only has to implement a few well known behaviours and your Special Feature B.
> 
> The short answer is even more simple : a stream does not have a name, like a collection does not have a name, because we ain't gonna need it.
> If we really need a name, then we'll create a XTNamedReadStream and a XTNamedWriteStream responding to #name, but I doubt we'll do.
> 
> 
> 2013/11/13 Chris Muller <ma.chris.m at gmail.com>
> On Wed, Nov 13, 2013 at 9:58 AM, Nicolas Cellier <nicolas.cellier.aka.nice at gmail.com> wrote:
> Yes, a Wrapper would provide the legacy API.
> 
> And yes, the name of a stream should better not be part of the API.
> Most stream don't have a name, and adding such API adds all sort of un-needed complexity.
> It's an internal detail that can eventually help for reporting error if accessible, but nothing more.
> 
>  
> I know nothing about Xtreams but, IMO, this obsession with sterility borders on mental illness.
> 
> "All sort of un-needed complexity?"  That's overstating it a bit, don't you think?
> 
> So you must really feel stressed that ALL Object's, in fact, have a #name, huh?  I admit this seems to push the limits but... 
> 
> what's the point of having any kind of different streams at all then?  It's the _differences_ between them that makes composing them useful.  Compression, encryption, filtering, sockets, files, circular, etc.  You think you'll be able to do all that and get away with all of them having exactly the same API?
> 
> IMHO working around that, passing extra objects around, sounds more stressful than letting a stream on a _file_ know its filename..
> 
> If it really need it, the application certainly can retrieve the name from a higher level object (a FIleReference, FileDirectory or whatever).
> 
> How does that solution allow uniformity in stream-using code?
> 
> 
> 
> 
>  
> 
> 
> 2013/11/13 Chris Muller <asqueaker at gmail.com>
> On Tue, Nov 12, 2013 at 7:31 AM, Nicolas Cellier
> <nicolas.cellier.aka.nice at gmail.com> wrote:
> > It's just a matter of selecting a strategy. I've proposed two:
> > A) create a wrapper class for legacy Stream compatibility selectors
> > B) create extensions for Legacy Stream compatibility selectors
> > My preference goes to A)
> 
> By wrappers you mean the Xtreams are the innards doing the work and
> the wrappers providing the legacy API?
> 
> This would be a great way to test Xtreams.
> 
> > The legacy support MUST be minimal (next nextPut: nextPutAll: peek upTo:
> > ...), otherwise we will import all the cruft in Xtream and would go back to
> > our starting point...
> > Once the minimal support written (a few hours should be enough), we should
> > gradually switch each every legacy Stream usage -> Xtream.
> >
> > An area which require more work is those Streams that have mixed conventions
> > (one portion is interpreted as text, another as binary).
> > In theory that's easy, we just have two streams and they both wrap on a low
> > level binary stream, but that means we have to be very cautious with buffers
> > and caches.
> >
> > Another area of work is usage of ugly selectors like name (we try to access
> > the file name from the Stream API, arghh). Those usages are bad and require
> > a rewrite.
> 
> Are you saying a FileStream knowing its #name or #filename is bad?
> 
> 
> 
> 
> 

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.pharo.org/pipermail/pharo-dev_lists.pharo.org/attachments/20131113/f25fa9d7/attachment-0002.html>


More information about the Pharo-dev mailing list