# Be Brave

**URL:** <https://www.ruby-forum.com/t/be-brave/242903>\
**Category:** IT\
**Created:** [August 6, 2015, 12:12pm UTC](https://www.ruby-forum.com/t/be-brave/242903 "2015-08-06T12:12:16Z")\
**Posts on this page:** 20\
**Page:** 1

<div class="post-metadata">

**Author:** ![Rafa\_F](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/r/958977/32.png) [@Rafa\_F](https://www.ruby-forum.com/u/Rafa_F)\
**Post date:** [August 6, 2015, 12:12pm UTC](https://www.ruby-forum.com/t/be-brave/242903/1 "2015-08-06T12:12:16Z")

</div>

Un altro episodio della serie “cose che solo io trovo utili”

[http://playersgonnaplay.it/be-brave-in-ruby-land](http://playersgonnaplay.it/be-brave-in-ruby-land)

---

<div class="post-metadata">

**Author:** ![olistik](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/o/9de0a6/32.png) [@olistik](https://www.ruby-forum.com/u/olistik)\
**Post date:** [August 6, 2015, 12:15pm UTC](https://www.ruby-forum.com/t/be-brave/242903/2 "2015-08-06T12:15:11Z")

</div>

Conosco almeno un altro sviluppatore che lo avrebbe trovato utile HINT  
HINT

---

<div class="post-metadata">

**Author:** ![olistik](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/o/9de0a6/32.png) [@olistik](https://www.ruby-forum.com/u/olistik)\
**Post date:** [August 6, 2015, 12:16pm UTC](https://www.ruby-forum.com/t/be-brave/242903/3 "2015-08-06T12:16:56Z")

</div>

:high-five:

2015-08-06 12:14 GMT+02:00 Elia S. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid):

---

<div class="post-metadata">

**Author:** ![olistik](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/o/9de0a6/32.png) [@olistik](https://www.ruby-forum.com/u/olistik)\
**Post date:** [August 6, 2015, 2:05pm UTC](https://www.ruby-forum.com/t/be-brave/242903/4 "2015-08-06T14:05:36Z")

</div>

Fino a poco tempo fa lavoravo su una code base Rails 3 composta per un  
terzo di rescue nil, perché il capo si lamentava che c’erano troppi  
errori… una tortura.  
Insomma, questa è roba da professionisti, i niubbi non provino a rifarla  
a casa! 🙂

Inviato da iPhone

---

<div class="post-metadata">

**Author:** ![olistik](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/o/9de0a6/32.png) [@olistik](https://www.ruby-forum.com/u/olistik)\
**Post date:** [August 6, 2015, 2:11pm UTC](https://www.ruby-forum.com/t/be-brave/242903/5 "2015-08-06T14:11:27Z")

</div>

Più che da professionisti, è una cosa da fuori di testa xD fin quando si  
scherza si scherza, ma exceptions as control flow… brividi!

Il giorno gio 6 ago 2015 14:05 Luca P. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)  
ha  
scritto:

---

<div class="post-metadata">

**Author:** ![olistik](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/o/9de0a6/32.png) [@olistik](https://www.ruby-forum.com/u/olistik)\
**Post date:** [August 6, 2015, 2:14pm UTC](https://www.ruby-forum.com/t/be-brave/242903/6 "2015-08-06T14:14:57Z")

</div>

Mi permetto di correggere, perché qui stiamo parlato di missed exception  
control to keep the flow ◕ ◡ ◔

---

<div class="post-metadata">

**Author:** ![olistik](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/o/9de0a6/32.png) [@olistik](https://www.ruby-forum.com/u/olistik)\
**Post date:** [August 6, 2015, 2:24pm UTC](https://www.ruby-forum.com/t/be-brave/242903/7 "2015-08-06T14:24:18Z")

</div>

Giusto, ascrivibili al gruppo “usare le eccezioni per far altro che non  
sia  
gestire eccezioni”

Il giorno gio 6 ago 2015 14:14 Elia S. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) ha scritto:

---

<div class="post-metadata">

**Author:** ![olistik](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/o/9de0a6/32.png) [@olistik](https://www.ruby-forum.com/u/olistik)\
**Post date:** [August 6, 2015, 2:27pm UTC](https://www.ruby-forum.com/t/be-brave/242903/8 "2015-08-06T14:27:13Z")

</div>

class NilClass  
def method\_missing(\*)  
self  
end  
end

---

<div class="post-metadata">

**Author:** ![olistik](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/o/9de0a6/32.png) [@olistik](https://www.ruby-forum.com/u/olistik)\
**Post date:** [August 6, 2015, 2:30pm UTC](https://www.ruby-forum.com/t/be-brave/242903/9 "2015-08-06T14:30:09Z")

</div>

Ecco, monkey patch di questo tipo mi fanno davvero paura 😃  
Preferisco un approccio meno invasivo 🙂

2015-08-06 14:26 GMT+02:00 Elia S. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid):

---

<div class="post-metadata">

**Author:** ![olistik](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/o/9de0a6/32.png) [@olistik](https://www.ruby-forum.com/u/olistik)\
**Post date:** [August 6, 2015, 2:25pm UTC](https://www.ruby-forum.com/t/be-brave/242903/10 "2015-08-06T14:25:28Z")

</div>

Mah, sono abbastanza serio 🙂  
Il caso d’uso è ben circoscritto e sarei ben lieto di usare soluzioni  
altrettanto concise anche se ad ora non ne vedo.  
La try chain è scomoda e poco leggibile quando si gestiscono accessi ad  
Hash:

params.try(:[], :profile).try(:[], :resume).try(:tempfile).try(:path)

Così come la boolean chain:

if params[:profile] && params[:profile][:resume] &&  
params[:profile][:resume].try(:tempfile).try(:path)

Come affronteresti questo specifico caso?

@luca: da maneggiare con attenzione, ovviamente 🙂 Un uso ad-minchiam è  
potenzialmente letale.

2015-08-06 14:10 GMT+02:00 Maurizio De Santis  
[removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid):

---

<div class="post-metadata">

**Author:** ![olistik](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/o/9de0a6/32.png) [@olistik](https://www.ruby-forum.com/u/olistik)\
**Post date:** [August 6, 2015, 3:13pm UTC](https://www.ruby-forum.com/t/be-brave/242903/11 "2015-08-06T15:13:58Z")

</div>

Ok, allora rispondo seriamente 🙂

Usare le eccezioni per controllare il flusso è un noto antipattern:

> <https://softwareengineering.stackexchange.com/questions/189222/are-exceptions-as-control-flow-considered-a-serious-antipattern-if-so-why>

Ho avuto a che fare con questo tipo di approccio con un collega a cui  
piaceva, e l’aveva usato un bel po’ in giro nel codice di un progetto.  
Dopo  
averne parlato siamo giunti alla conclusione che crea più problemi che  
altro, per i seguenti motivi:

- viola il principio di minima sorpresa: le eccezioni sono fatte per  
gestire errori, non per gestire un flusso previsto
- la logica ha la priorità sulla concisione: se del codice richiede  
della  
complessità logica in sé, non puoi sacrificarla per amor di concisione
- ti perdi le eccezioni rescuate: questo è un grande problema, perché se  
la  
parte di codice wrappata genera un’eccezione che non pensavi potesse  
spuntare fuori te la perdi, non viene loggata e cominciano a verificarsi  
i  
tanto classici quanto temuti fenomeni paranormali informatici

Inoltre, nel codice postato usi rescue Exception, che rescua anche da  
eccezioni di sistema:

> <https://stackoverflow.com/questions/10048173/why-is-it-bad-style-to-rescue-exception-e-in-ruby>

Nel caso da te citato userei una delle soluzioni che hai scritto, magari  
estraendola a metodo privato. Sarà meno elegante, ma è più logica e  
manutenibile.

Il giorno gio 6 ago 2015 14:29 maurizio de magnis \<  
removed\_email\_address@domain.invalid\> ha scritto:

---

<div class="post-metadata">

**Author:** ![olistik](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/o/9de0a6/32.png) [@olistik](https://www.ruby-forum.com/u/olistik)\
**Post date:** [August 6, 2015, 3:36pm UTC](https://www.ruby-forum.com/t/be-brave/242903/12 "2015-08-06T15:36:10Z")

</div>

+1 per StandardError al posto di Error (ho aggiornato il post) e +1  
anche  
per il fatto di non usare le eccezioni come strumento di gestione del  
flusso di codice.

Ora, nel caso menzionato gestisco _solo_ questi fallimenti:

- NoMethodError: undefined method `[]’ for nil:NilClass
- NoMethodError: undefined method `XXX’ for “YYY”:String

L’obiettivo che mi sono posto, limitando volontariamente lo scope di  
Brave.be, è ottenere una syntactic sugar per recuperare un valore  
nestato  
in una struttura dati. Di fatto, a parte l’essere più o meno bello da  
vedere, non comporta le stesse sorprese della magia nera da  
Metaprogrammazione.

2015-08-06 15:13 GMT+02:00 Maurizio De Santis  
[removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid):

---

<div class="post-metadata">

**Author:** ![olistik](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/o/9de0a6/32.png) [@olistik](https://www.ruby-forum.com/u/olistik)\
**Post date:** [August 6, 2015, 3:26pm UTC](https://www.ruby-forum.com/t/be-brave/242903/13 "2015-08-06T15:26:14Z")

</div>

FY(possible?)I: [https://youtu.be/J1jYlPtkrqQ?t=6m57s](https://youtu.be/J1jYlPtkrqQ?t=6m57s)

–  
:: Andrea P.  
:: email: [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)  
:: mobile: +44 747 3090534

On 6 August 2015 at 14:13:46, Maurizio De Santis  
([removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)) wrote:

Ok, allora rispondo seriamente 🙂

Usare le eccezioni per controllare il flusso è un noto antipattern:  
[http://programmers.stackexchange.com/questions/189222/are-exceptions-as-control-flow-considered-a-serious-antipattern-if-so-why](http://programmers.stackexchange.com/questions/189222/are-exceptions-as-control-flow-considered-a-serious-antipattern-if-so-why)

Ho avuto a che fare con questo tipo di approccio con un collega a cui  
piaceva, e l’aveva usato un bel po’ in giro nel codice di un progetto.  
Dopo  
averne parlato siamo giunti alla conclusione che crea più problemi che  
altro, per i seguenti motivi:

- viola il principio di minima sorpresa: le eccezioni sono fatte per  
gestire errori, non per gestire un flusso previsto
- la logica ha la priorità sulla concisione: se del codice richiede  
della  
complessità logica in sé, non puoi sacrificarla per amor di concisione
- ti perdi le eccezioni rescuate: questo è un grande problema, perché se  
la  
parte di codice wrappata genera un’eccezione che non pensavi potesse  
spuntare fuori te la perdi, non viene loggata e cominciano a verificarsi  
i  
tanto classici quanto temuti fenomeni paranormali informatici

Inoltre, nel codice postato usi rescue Exception, che rescua anche da  
eccezioni di sistema:  
[http://stackoverflow.com/questions/10048173/why-is-it-bad-style-to-rescue-exception-e-in-ruby](http://stackoverflow.com/questions/10048173/why-is-it-bad-style-to-rescue-exception-e-in-ruby)

Nel caso da te citato userei una delle soluzioni che hai scritto, magari  
estraendola a metodo privato. Sarà meno elegante, ma è più logica e  
manutenibile.

Il giorno gio 6 ago 2015 14:29 maurizio de magnis \<  
[removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)\> ha scritto:

> > > params.try(:, :profile).try(:, :resume).try(:tempfile).try(:path)  
> > > potenzialmente letale.
> > > 
> > > > > casa! 🙂
> > > > > 
> > > > > > > Conosco almeno un altro sviluppatore che lo avrebbe trovato utile
> > > > > > > 
> > > > > > > > Maurizio ಠ\_ಠ My profile
> > > > > 
> > > > > Ml mailing list
> > 
> > [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)  
> > [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)  
> > [http://lists.ruby-it.org/mailman/listinfo/ml](http://lists.ruby-it.org/mailman/listinfo/ml)

* * *

Ml mailing list  
[removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)  
[http://lists.ruby-it.org/mailman/listinfo/ml](http://lists.ruby-it.org/mailman/listinfo/ml)

---

<div class="post-metadata">

**Author:** ![olistik](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/o/9de0a6/32.png) [@olistik](https://www.ruby-forum.com/u/olistik)\
**Post date:** [August 6, 2015, 4:00pm UTC](https://www.ruby-forum.com/t/be-brave/242903/14 "2015-08-06T16:00:42Z")

</div>

Ecco, questa è una soluzione molto, molto elegante 🙂  
Nonostante non sia un patito di method\_missing, lo preferisco ad un  
begin/rescue  
+1

2015-08-06 15:26 GMT+02:00 Andrea P. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid):

---

<div class="post-metadata">

**Author:** ![olistik](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/o/9de0a6/32.png) [@olistik](https://www.ruby-forum.com/u/olistik)\
**Post date:** [August 6, 2015, 4:03pm UTC](https://www.ruby-forum.com/t/be-brave/242903/15 "2015-08-06T16:03:38Z")

</div>

La mancanza di Optional/Maybe nel 2015 in un linguaggio come Ruby è  
piuttosto preoccupante.

2015-08-06 15:59 GMT+02:00 maurizio de magnis  
[removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid):

---

<div class="post-metadata">

**Author:** ![olistik](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/o/9de0a6/32.png) [@olistik](https://www.ruby-forum.com/u/olistik)\
**Post date:** [August 6, 2015, 4:52pm UTC](https://www.ruby-forum.com/t/be-brave/242903/16 "2015-08-06T16:52:42Z")

</div>

@maurizio: Revolution! XD

ecco il repository con l’implementazione di Tom S. delle monad  
Optional, Many ed Eventually:

> **[GitHub - tomstuart/monads: Simple Ruby implementations of some common monads.](https://github.com/tomstuart/monads)**
>
> Simple Ruby implementations of some common monads. - GitHub - tomstuart/monads: Simple Ruby implementations of some common monads.

2015-08-06 16:09 GMT+02:00 Maurizio De Santis  
[removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid):

---

<div class="post-metadata">

**Author:** ![olistik](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/o/9de0a6/32.png) [@olistik](https://www.ruby-forum.com/u/olistik)\
**Post date:** [August 6, 2015, 5:00pm UTC](https://www.ruby-forum.com/t/be-brave/242903/17 "2015-08-06T17:00:18Z")

</div>

O se vuoi solo un wrapper per quei due casi… fai un wrapper!

comunque +1 per Tom S.

PS. il tuo post oramai è una wiki 😛

---

<div class="post-metadata">

**Author:** ![olistik](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/o/9de0a6/32.png) [@olistik](https://www.ruby-forum.com/u/olistik)\
**Post date:** [August 6, 2015, 4:10pm UTC](https://www.ruby-forum.com/t/be-brave/242903/18 "2015-08-06T16:10:03Z")

</div>

Comics time: [The Philosophy of the Science of Poker - Existential Comics](http://existentialcomics.com/comic/49)

Il giorno gio 6 ago 2015 16:03 Stefano P.  
[removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)  
ha scritto:

---

<div class="post-metadata">

**Author:** ![olistik](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/o/9de0a6/32.png) [@olistik](https://www.ruby-forum.com/u/olistik)\
**Post date:** [August 6, 2015, 5:06pm UTC](https://www.ruby-forum.com/t/be-brave/242903/19 "2015-08-06T17:06:09Z")

</div>

Piccola nota: dovrei convertire params in una OpenStruct (o similare)  
per  
poter gestire la chain tramite Optional.

2015-08-06 16:59 GMT+02:00 Elia S. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid):

> O se vuoi solo un wrapper per quei due casi… fai un wrapper!

Mmh, espandi un po’. Cosa intendi?

comunque +1 per Tom S.

> 

Già, tanta roba. 🙂

PS. il tuo post oramai è una wiki 😛

> 

ghgh, lo prendo come un complimento 🙂

---

<div class="post-metadata">

**Author:** ![olistik](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/o/9de0a6/32.png) [@olistik](https://www.ruby-forum.com/u/olistik)\
**Post date:** [August 6, 2015, 5:20pm UTC](https://www.ruby-forum.com/t/be-brave/242903/20 "2015-08-06T17:20:45Z")

</div>

class InfiniteHash  
def initialize(hash = nil)  
@hash = hash  
end

def value  
@hash  
end

def [] key  
value = @hash[key]  
return Value.new(value) unless value.nil? or value.is\_a?(Hash)  
InfiniteHash.new(value)  
end

class Value \< Struct.new(:value)  
def [] key  
self  
end  
end  
end

hash = {a: 1, b: {c: 2}}  
p InfiniteHash.new(hash)[:a].value  
p InfiniteHash.new(hash)[:b][:c].value  
p InfiniteHash.new(hash)[:b][:c][:d][:e][:f].value

# \>\> 1

# \>\> 2

# \>\> 2

Ma tutto sommato mi sa che una specializzazione di quello che fa TS

[Next page](https://www.ruby-forum.com/t/be-brave/242903.md?page=2)
