*Now* I understand this rule.

2015-09-02 3:40 GMT+02:00 Eliot Miranda <eliot.mira...@gmail.com>:

>
>
> On Tue, Sep 1, 2015 at 1:29 PM, Nicolai Hess <nicolaih...@web.de> wrote:
>
>> Thank you all for your response,
>> now the interesting question is, what should this rule recommend to use
>> instead? First assign to a block local variable and
>> add a nil check in the unwind block?
>>
>
> No.  I think the pattern modifies this:
>
>     | t |
>     ...
>     [t := initExpr.
>      exprs]
>         ensure: [t msg]
>
> to this
>
>     | t |
>     ...
>     t := initExpr.
>     [exprs]
>         ensure: [t msg]
>
> Control never reaches the block [exprs] isf there is an error in initExpr
> so there's no issue with t being unassigned; control won't get to the
> ensure block, so no need to test for nil.
>
>
>> And maybe we should improve that rule, because in Pharo 5.0 there are 5
>> methods catched by
>> this rule:
>> 3 have an explicit ifnonil check before accessing the variable  - their
>> implementation actually behaves correctly.
>> The other two are just "testdata" used in the unit test for this rule
>>
>>
>>
>> 2015-08-31 15:30 GMT+02:00 Eliot Miranda <eliot.mira...@gmail.com>:
>>
>>> If there's an error in the expression that is assigned to file, and the
>>> stack unwound, file won't have been assigned and the close will get sent to
>>> nil.  The assignment to file should precede the block.
>>>
>>> Sent from my iPhone
>>>
>>> On Aug 31, 2015, at 5:03 AM, Nicolai Hess <nicolaih...@web.de> wrote:
>>>
>>> Anyone? We may remove this rule if no one understands for what this is
>>> good for.
>>> (if anyone knows, please comment that class).
>>>
>>>
>>>
>>> 2014-12-14 11:22 GMT+01:00 Nicolai Hess <nicolaih...@web.de>:
>>>
>>>>
>>>> 2014-11-30 20:54 GMT+01:00 stepharo <steph...@free.fr>:
>>>>>
>>>>> thanks we should open a bug entry to improve the class comment of this
>>>>> rule.
>>>>> Any taker?
>>>>>
>>>>> Stef
>>>>>
>>>>> Le 30/11/14 12:10, Thierry Goubier a écrit :
>>>>
>>>>
>>>> done
>>>> 14618 <https://pharo.fogbugz.com/default.asp?14618>
>>>> Add a comment describing RBFileBlocksRule
>>>>
>>>> now I just need to have a good description for this rule. Please, can
>>>> someone outline the discussion on this thread:
>>>> - describe why code matching this rule is considered back practice
>>>> - describe how the code could be rewritten.
>>>>
>>>> nicolai
>>>>
>>>>
>>>>
>>>>>
>>>>> Le 30/11/2014 12:01, Max Leske a écrit :
>>>>>>
>>>>>>>
>>>>>>> On 30.11.2014, at 11:18, Thierry Goubier <thierry.goub...@gmail.com>
>>>>>>>> wrote:
>>>>>>>>
>>>>>>>> Le 30/11/2014 11:06, Max Leske a écrit :
>>>>>>>>
>>>>>>>>> The code would look like this:
>>>>>>>>>
>>>>>>>>> [ | file |
>>>>>>>>>     file := StandardFileStream forceNewFileNamed: ‘foo’.
>>>>>>>>>     file nextPutAll: ‘bar’ ]
>>>>>>>>>         ensure: [ file close ].
>>>>>>>>>
>>>>>>>>> Why that is considered bad practice however, I can’t tell.
>>>>>>>>>
>>>>>>>>
>>>>>>>> This one would fail because file is a temp to the block (and not
>>>>>>>> visible to the ensure block).
>>>>>>>>
>>>>>>>
>>>>>>> If it weren’t visible, wouldn’t the compiler raise an exception?
>>>>>>>
>>>>>>
>>>>>> In your example, yes.
>>>>>>
>>>>>> But the rule matched:
>>>>>>
>>>>>> | file |
>>>>>> [
>>>>>> file := StandardFileStream forceNewFileNamed: ‘foo’.
>>>>>> file nextPutAll: ‘bar’ ]
>>>>>>     ensure: [ file close ].
>>>>>>
>>>>>> (Hum: wouldn't the compiler complain of file might be nil in the
>>>>>> ensure block?)
>>>>>>
>>>>>> Another problem is that, if you have a failure in forceNewFileNamed:,
>>>>>>>> file is nil and the ensure: fail as well.
>>>>>>>>
>>>>>>>
>>>>>>> True, but that’s a problem this rule doesn’t really cover I guess.
>>>>>>> That one’s up to the developer.
>>>>>>>
>>>>>>
>>>>>> I would expect that rule to flag bad coding practices, and I think it
>>>>>> does ;)
>>>>>>
>>>>>> Thierry
>>>>>>
>>>>>>
>>>>>>
>>>>>
>>>>>
>>>
>>
>
>
> --
> _,,,^..^,,,_
> best, Eliot
>

Reply via email to