> Used consistently and well, method categories are not only a
> navigation aid, helping you to find methods you do not know the names
> of, but a helpful documentation aid.  For example, #runningMeans: is
> in the 'summarising' category.  In my Smalltalk, that means
> - it inspects every element of the collection
> - it does not change the collection
> - the result is somehow a summary or distillation of the elements

Great. If only categories were more first class, we could store such 
information. 

I agree that a proper name is important but this is kind of hell to do bu 
yourself as minait no help. 

From you definition, I see that the category can be associated to tests that 
might eventually auto categorize.

Anyway, with such artefact, this is before being a tool artefact, a discipline  
one (convetions). I just have headaches each time I have to write my categories 
^^especially with the UI.

Shouldn’t category by more like tags ?  And first class object (more source 
oriented even if some could be helpful at runtime like private methods) ?

Cheers,
Cédrick


> Of course, to get the most from method categories, the method
> categories need to be documented, and you need to keep them as up to
> date as any other part of the source code.
> 
> I can say that the discipline of trying to come up with meaningful
> categories and use them consistently has improved the quality of my
> code.
> 
> On Mon, 13 Apr 2020 at 00:38, Cédrick Béler <cdric...@gmail.com> wrote:
>> 
>> Fully agree on proper names.
>> 
>> === I don’t know if this is because of free confinement time but I can keep 
>> on asking questions so I share some I hope will make sense (for the sake of 
>> discussion).
>> 
>> For instance, I'm wondering if tests on conditions so as to raise proper 
>> exceptions is a good practice (for instance if the  width object does not 
>> make sense, like a float) #doesNotMakeSense btw would be a cool name for the 
>> « maybe » cases Richard was talking.
>> 
>> Then I asked myself what are the drawbacks (especially on performance) on 
>> adding extra information to source code (a bit like longer variable names) ?
>> 
>> There is the raw code and the sources code file that helps separating 
>> concerns. At least we don’t mind at all having longer literals (variables 
>> names, …).
>> 
>> I cannot help is what about pragmas. I kind see roughly how they work. But 
>> is it possible to distinguish between runtime / source only pragmas (not 
>> sure I’m clear here but it seems to me that some are important for 
>> documentation purposes that are not needed at runtime) ?
>> 
>> Also, I’ve never really liked method categories. I don’t really see how 
>> there are implemented but they don’t feel nice to me.
>> Could they be only pragmas ?
>> 
>> 
>> 
>> 
>> 
>> Happy eater Sunday, stay all preserved (sad day for the game of life),
>> 
>> Cédrick
>> 
>> 
>> 
>>> Le 12 avr. 2020 à 14:22, Sven Van Caekenberghe <s...@stfx.eu> a écrit :
>>> 
>>> 
>>> 
>>>> On 12 Apr 2020, at 13:53, Cédrick Béler <cdric...@gmail.com> wrote:
>>>> 
>>>> Beautiful ^^
>>> 
>>> I also like it.
>>> 
>>> But why the single letter variable names ? Why not:
>>> 
>>> SequenceableCollection>>#runningMeans: width
>>> | means sum index |
>>> means := Array new: self size - width + 1.
>>> sum := 0.
>>> 1 to: width do: [ :each |
>>>   sum := sum + (self at: each) ].
>>> index := 1.
>>> means at: index put: sum / width.
>>> width + 1 to: self size do: [ :each |
>>>   sum := sum - (self at: index) + (self at: each).
>>>   index := index + 1.
>>>   means at: index put: sum / width ].
>>> ^ means
>>> 
>>> A good comment, a correct initial bounds check and unit tests are also 
>>> needed.
>>> 
>>>> I would vote for inclusion in the base image ?
>>>> With your explanation as comments.
>>>> 
>>>> I’ll play with it.
>>>> 
>>>> Thanks
>>>> Cedrick
>>>> 
>>>>> Le 12 avr. 2020 à 12:19, Richard O'Keefe <rao...@gmail.com> a écrit :
>>>>> 
>>>>> 
>>>>> I have coded and benchmarked 8 different running mean algorithms.
>>>>> In the presence of inexact numbers it is not as accurate as
>>>>> redoing the sums, but it's pretty close, and it's fast.
>>>>> If "width" is not an integer or is out of range, an error
>>>>> will be reported by #new: or #at:[put:].  It's based on Welford's
>>>>> stable update.
>>>>> 
>>>>> Of course this approach does NOT work for trimmed or Winsorised
>>>>> means or for medians or any kind of robust estimate of location.
>>>>> 
>>>>> SequenceableCollection
>>>>> methods for: 'summarising'
>>>>>  runningMeans: width
>>>>>    |a m d|
>>>>>    a := Array new: self size - width + 1.
>>>>>    m := 0.
>>>>>    1 to: width do: [:i |
>>>>>      m := (self at: i) + m].
>>>>>    m := m / width.
>>>>>    d := 1.
>>>>>    a at: d put: m.
>>>>>    width + 1 to: self size do: [:i |
>>>>>      m := ((self at: i) - (self at: d)) / width + m.
>>>>>      d := d + 1.
>>>>>      a at: d put: m].
>>>>>    ^a
>>>>> 
>>>>> 
>>>>> 
>>>>> 
>>>>> 
>>>> 
>>> 
>>> 
>> 
>> 
> 


Reply via email to