Thanks for the feedback guys.

Based on the discussion I propose a different set of changes:

1.
shuffle
        ^ self shuffleBy: Random new

2.
shuffled
        ^ self copy shuffle

3. remove #shuffledBy: (if you're specific enough to use a custom Random 
instance you can also create a copy of the collection yourself if you want to)


I leave the matter of renaming the methods for further discussion. Personally 
I'm for more intention revealing selectors; I quite like #shuffle and 
#shuffleInPlace. If we can agree on a different naming scheme we should then 
apply it to other methods aswell of course (e.g. #sort, #sortInPlace).

Also open for discussion is the use of Collection>>randomForPicking and 
Collection>>mutexForPicking in other methods (such as #atRandom). I think it 
shouldn't be too big a problem to make those methods use individual Random 
instances and to remove the two class variables from Collection.

Cheers,
Max


On 24.09.2013, at 02:33, [email protected] wrote:

> Nicolas Cellier wrote:
>> 
>> The reason why I don't like the explicit "copy", is because this is the
>> default behaviour.
>> In place mutation is an (evil) exception.
>> I'm personnally fine with current conventions:
>> - sort, shuffle, reverse, replace: are imperative, thus you are telling
>> collection, sort yourself !
>> - sorted clearly sounds as a sorted copy for me.
>> If ever a change was to be made, I would much prefer this to happen on
>> opposite naming, sort -> inPlaceSort, or sortYourself :)
>> It's like telling the programmer, hey - a stateful mutation is really what
>> you want, is it?
>>   
> 
> Conventions should encourage good programming practice.  Although it makes 
> perfect sense on hearing it, I was explicitly not aware of the convention 
> between 'sort' and 'sorted'.  For me, the small difference in letters used 
> between the two doesn't provide a wide enough distinction.  Also, regarding 
> not mutating state, I guess I knew that in the back of my head, but it has 
> not generally been an explicit concern of mine while programming.  Convention 
> should encourage good programming.  So I like the suggestion of inPlaceSort & 
> sortYourself.  As well as being more intention revealing, the less desirable 
> methods are made less attractive by using a longer name. Perhaps another 
> naming convention could be mutatedSort, or mutSort as a hint that the 
> programmer should consider using these in conjunction with mutexes, or at own 
> risk.
> 
> cheers -ben
> 
> 
> 
>> 
>> 2013/9/23 Stéphane Ducasse <[email protected]>
>> 
>>   
>>> +1
>>> Now I understand the point of max with the name sort/sorted because this
>>> is not explicit to me too :)
>>> I laways have to think.
>>> 
>>> On Sep 23, 2013, at 6:28 PM, Nicolas Cellier <
>>> [email protected]> wrote:
>>> 
>>> 100% agree.
>>> Do it right > do it fast.
>>> We must not turn usage of the library into something fragile for the sake
>>> of speed.
>>> We already make the code itself fragile more often than not in term of
>>> complexity (harder to understand/test/change).
>>> 
>>> Especially, introduction of shared mutable states (global, class vars,
>>> singleton or any other form) should ring an alarm in reviewers head
>>> (This is some very old Squeak code in this case, so Squeakers are to
>>> blame, but we're all in same bath).
>>> 
>>> 
>>> 
>>> 2013/9/23 Henrik Johansen <[email protected]>
>>> 
>>>     
>>>> On Sep 23, 2013, at 3:33 , Max Leske <[email protected]> wrote:
>>>> 
>>>>       
>>>>>> If a user is going to modify the same object concurrently, he/she
>>>>>>           
>>>> takes care of mutual exclusion.
>>>>       
>>>>> Agreed. BUT: the Random object used by these methods is the same one
>>>>>         
>>>> that is used by #atRandom for instance, hence the race condition. There is
>>>> no way anyone can safely use these methods without the mutex, single
>>>> threaded or not. Calls to methods using that same Random object can be all
>>>> over the place and also in the base system.
>>>> 
>>>> 
>>>> It seems to me an existing Random instance is used in this case mostly*
>>>> for performance.
>>>> One could argue that since the Random in this case is used for a bulk
>>>> operation, for which the object creation cost is largely amortized for
>>>> collection sizes > 20, it's acceptable to instead use Random new by
>>>> default, which wouldn't suffer from the same race conditions.
>>>> While still slower than a mutex-protected version for single-threaded
>>>> code, it would also scale correctly if the users (and vm) are actually
>>>> multi-threaded.
>>>> 
>>>> [#(1 2  3 4 5 6 7 8 9 10 11 12) shuffle] bench '208,000 per second.'
>>>>  '222,000 per second.' '223,000 per second.'
>>>> [#(1 2 3 4 5 6 7 8 9 10 11 12) shuffleWithMutex] bench '188,000 per
>>>> second.'  '186,000 per second.''184,000 per second.'
>>>> [#(1 2 3 4 5 6 7 8 9 10 11 12) shuffleNewRandom] bench '167,000 per
>>>> second.' '166,000 per second.'  '167,000 per second.'
>>>> 
>>>> Cheers,
>>>> Henry
>>>> 
>>>> * Low seed entropy is another issue, but if purely random shuffling is a
>>>> critical requirement, one shouldn't use the default Random generator
>>>> anyways...
>>>> 
>>>> 
>>>> 
>>>>       
>>>     
>> 
>>   
> 

Reply via email to