Thanks for sharing.  A similar thing might be useful for dealing with
"quality" of Process Variable measurement in industrial situations -
where instruments fail from time to time.

I'm not sure of all the pros and cons, but btw an alternative to
hanging special behaviour on a method, would be to hang special
behaviour on a MissingValue class that you could #initialize any
instance variable to.

  Object subclass: #MissingValue
    instanceVariableNames: ''
    classVariableNames: ''
    package: 'AAAA'

   MissingValue >> * dummyValue
      self inform: 'debug trace - got here'.
      ^self

   MissingValue >> adaptToNumber: rcvr andSend: selector
       ^self perform: selector with: rcvr

  Collection >> sumProtected
    ^ self
        inject: 0
        into: [ :sum :each |  sum + each value]

Usage...

c := {1.1 * MissingValue new.   1.2 * 10.   MissingValue new * 1.3.   10 * 1.4}.
 "==> an Array(aMissingValue 12.0 aMissingValue 14.0)"

c sumExcludeMissing
 "==> 26.0"

cheers -ben

On Sun, Dec 18, 2016 at 6:45 PM, Юрий Мироненко <assargad...@gmail.com> wrote:
> Imagine, you have some object with amount and price variables.
> And you want to calculate total, put this totals to collection and calculate
> grand total.
>
> Naive implementation will be something like
> total := amount * price for the first task
> and something like
> grandTotal := totals sum for the latter one.
>
> But what if amount or price are nil's?
> You can add nil checks, of course: total := (amount ifNil:[0]) * (price
> ifNil: [0]).
> And then what if totals will be empty? More checks.
> Is it really wise to have total to be zero if amount is nil? More
> ifTrue:ifFalse: code.
> And then you want to add amount := total / price calculation, and you
> realize that both total and price may be nil, and price may be zero.
> More and more and more checks.
>
> Protego (http://www.smalltalkhub.com/#!/~assargadon/Protego) adds
> "protected" versions of common operators and methods.
>
> So, you just put
> total := amount *@ price
> and
> grandTotal := totals sum_protected
> into your code - and everything just works.
>
> total will be nil if any of the operands are nil. grandTotal will be
> calculated normally, even for empty totals collection (will return nil for
> empty collection).
> Collection can hold nil's and it will work anyway. If all elements of the
> collection is nil, result will be nil.
>
> Protected version of addition and subtraction will treat nil's as zeros
> until both operands are nil - then it will return nil.
> There are protected versions of comparisions, too.
>
> It's quite simple idea, which is still very useful, and it makes code much
> more readable, clean and self-commenting.
>
> That's why I have extracted this part of SmallPOS framework, and have
> published it as separate package to use it in other, non-SmallPOS
> applications.

Reply via email to