2010-08-05 17 views
5

Zastanawiam się, czy należy sprawdzić, czy argumenty przekazane do metody należą do określonej klasy.Sprawdzanie poprawności argumentów w Ruby?

np.

def type(hash = {}, array = []) 
    # validate before 
    raise "first argument needs to be a hash" unless hash.class == Hash 
    raise "second argument needs to be an array" unless array.class == Array 

    # actual code 
end 

Czy to jest mądre, czy jest to po prostu uciążliwe i marnowanie czasu na walidację wszystkich przekazanych argumentów?

Czy są okoliczności, w których chciałbyś mieć dodatkowe zabezpieczenie i okoliczności, kiedy nie będziesz się tym przejmował?

Podziel się przeżyciami!

Odpowiedz

9

Nie poleciłbym tego konkretnego podejścia, ponieważ nie można uwzględnić klas udostępniających semantykę hash lub tablicę, ale nie jest to klasa. Jeśli potrzebujesz tego rodzaju sprawdzania poprawności, lepiej użyć nazwy respond_to? z nazwą metody. Arrays implementuje metodę: [], o ile jest warta.

OpenStruct ma semantykę hashową i semantykę metody dostępu atrybutów, ale nie zwróci wartości true dla warunku hash.class==Hash. W praktyce będzie działało jak hash.

Ujmując to w perspektywie, nawet w nie-dynamicznym języku, nie chcielibyście robić tego w ten sposób; wolałbyś sprawdzić, czy obiekt implementuje IDictionary<T>. Ruby wolałby idiomatycznie wolę, aby w razie potrzeby zweryfikować, że metoda istnieje, ponieważ w takim przypadku deweloper prawdopodobnie zamierza, aby ich obiekt działał podobnie. Możesz zapewnić dodatkową kontrolę nad jednostkowymi testami wokół kodu klienta, co jest alternatywą dla wymuszania niedynamicznych działań.

4

Myślę, że to niepotrzebne. Kiedyś czytałem na blogu coś w stylu "Jeśli chcesz chronić swój kod przed głupimi ludźmi, rubin nie jest dla ciebie językiem".

+1

To prawda. dlaczego waliduj swoich programistów =) –

1

Jeśli chcesz, aby kontrakt wymuszany przez kompilator/środowisko wykonawcze był kontrakty, Ruby nie jest dla ciebie. Jeśli potrzebujesz łatwego w użyciu języka i łatwej testowalności, to Ruby jest.

5

Zazwyczaj nie ma potrzeby sprawdzania, czy argumenty należą do określonej klasy. W Ruby zachęcamy do korzystania z Duck Typing.

1

Odkryłem, że sprawdzanie, czy parametry wejściowe spełniają twoje warunki wstępne, jest bardzo wartościową praktyką. Głupia osoba, od której cię ratuje, to ty. Dotyczy to szczególnie Rubiego, ponieważ nie ma on kontroli czasu kompilacji. Jeśli istnieją pewne charakterystyki wejściowe metody, o których wiesz, że muszą być prawdziwe, oznacza to, że sprawdzają je w czasie wykonywania i generują błędy z istotnymi komunikatami o błędach. W przeciwnym razie kod zaczyna się po prostu wyrzucać śmieci do śmieci i otrzymasz błędną odpowiedź lub wyjątek w dół.

Powiązane problemy