2011-06-24 14 views
36

Zastanawiam się, czy istnieje specjalna zasada programowania (Demeter?), Która wspiera ideę, że pomocnicy Railsa nigdy nie powinni używać zmiennych instancji kontrolera, a raczej powinni otrzymywać takie zmienne, jak parametry funkcji. Załóżmy na przykład, że moja akcja ChickensController#squawk tworzy zmienną instancji o nazwie @egg. Ponadto zakładamy, że widok squawk zawiera wezwanie do pomocnika nazwie cockadoodledoo, zrealizowaną tak:Czy pomocnicy Railsów powinni założyć, że istnieje zmienna instancji, czy też powinni otrzymać ją jako parametry?

def cockadoodledoo 
    @egg.to_s 
end 

byłoby lepiej lub niepotrzebnie gadatliwy przekazać @egg jako parametr tak, że widok wywołuje cockadoodledoo(@egg) i pomocnika przypominać:

def cockadoodledoo(egg) 
    egg.to_s 
end 

mam nadzieję, że jeden z was szczęśliwe hakerów jest wystarczająco nudzić w piątek po południu dochodzić odpowiedź. Cockadoodledoo!

This question here is similar, but was never accurately answered.

+0

Oooh tak wiele miłych odpowiedzi i tylko jeden znacznik wyboru, aby dać .... Dziękuję wszystkim. – ybakos

Odpowiedz

29

otrzymać je jako param. W przeciwnym razie, gdy aplikacja będzie się powiększać, bardzo trudno będzie prześledzić, gdzie są ustawione wariatory instancji podczas refaktoryzacji, rozwiązywania problemów itp.

Sądzę, że istnieje ogólna najlepsza praktyka używania tylko odwzorowań instancji w widokach w początkowej fazie. szablon ... i stamtąd powinieneś przekazać var ​​do pomocników i innych części.

+0

Ktoś wie, gdzie wspomniano o tej najlepszej praktyce lub jak się nazywa? – ybakos

+2

Najlepsze praktyki w zakresie publikowania i nazywania są takie "90s ... –

+5

Fabio, nie zgadzam się.Na pewno nie chcemy wymuszać drakońskich reguł w ramach Art of Programming, ale jest wielka wartość w nazywaniu rzeczy. Na przykład "zasada DRY". – ybakos

16

Powiedziałbym zawsze należy przekazać zmienne wyraźnie do pomocnika dla 2 powodów:

  • kontrolować dokładnie co robisz

  • Przede wszystkim można przetestować pomocnika

+3

Nie myślałem o testability. Uh, czy mnie złapały moje spodnie? (Tak, powinienem napisać więcej testów.) – ybakos

+0

Poprawa umiejętności testowania pomocnika tutaj jest kluczowa. Dziękuję za wyraźne zgłoszenie. – kries

7

Ponieważ komunikaty pomocnicze są mieszane z wszystkimi kontrolerami, a więc dostępne dla wszystkich widoków (w tym części i układów), zawsze mądrze jest ustanowić wyraźną umowę - Parametry.

Jedyny wyjątek, jaki mogłem wymyślić, to fakt, że zmienna instancji jest dostępna również dla wszystkich widoków i kontrolerów, takich jak menu lub coś podobnego.

+0

Dlaczego wyjątek? – ybakos

+2

Nie ma powodu, po prostu starałem się go znaleźć (no wiesz, każda reguła ma wyjątek), ale myślę, że mogłem zbyt mocno naciskać. –

11

Nie wiem, czy istnieje jakaś zasada rządząca tego typu rzeczami, ale podałbym argument. Argument ten ułatwi nie tylko przetestowanie helpera, ale także ułatwi śledzenie przepływu danych w aplikacji, ale pozwoli także na użycie jednego helpera dla pojedynczej instancji oraz listy; jeśli przejdą argument następnie zarówno:

<%= cockadoodledoo @egg %> 

oraz:

<% @eggs.each do |egg| %> 
    <%= cockadoodledoo egg %> 
<% end %> 

będzie działać zgodnie z oczekiwaniami, nie wprowadzając specjalną cockadoodledoo który obsługuje listę w @eggs zamiast pojedynczego @egg.

+2

To miła ilustracja jakiejś bezpłatnej wszechstronności, dziękuję. – ybakos

Powiązane problemy