2008-10-30 9 views
6

Mam uruchomioną aplikację w języku Ruby, którą chcę udostępnić użytkownikowi, aby udostępnił kod, który będzie działał jako filtr w części procesu. Zasadniczo, aplikacja robi to:Skryptuj aplikację wiersza polecenia ruby; najlepszy sposób to zrobić?

  1. odczytu w niektórych danych
  2. Jeśli filtr jest określony, używać go do filtrowania danych
  3. przetwarzać dane

Chcę proces filtrowania (etap 2) być jak najbardziej elastycznym.

Moje myślenie było to, że użytkownik może dostarczyć plik Ruby, które wyróżniają znana stała się wskazywać na przedmiot wdrożenie interfejsu zdefiniować, np

# user's filter 

class MyFilter 
    def do_filter(array_to_filter) 
    filtered_array = Array.new 
    # do my filtering on array_to_filter 
    filtered_array 
end 

FILTER = MyFilter.new 

moja aplikacja Kod będzie wtedy zrobić coś takiego:

array_that_might_get_filtered = get_my_array() 
if (options.filter_file) 
    require options.filter_file 
    array_that_might_get_filtered = FILTER.do_filter(array_that_might_get_filtered) 
end 

ile to będzie działać, to czuje się tandetnie i wydaje się, że powinien być lepszy sposób to zrobić. Uważałem też, że filtr powinien być w postaci dodania znanej klasy metody znanej nazwy, ale to też nie wydaje się być słuszne.

Czy istnieje lepszy język w tym języku?

Odpowiedz

4

Po prostu użyłbym kombinacji wiersza poleceń i konwencji.

Jeśli filtr jest określony, używać go do filtrowania danych

Jestem zakładając chcesz określić filtr w wierszu polecenia? Więc możesz wywołać aplikację w ten sposób?

ruby dataprocessor.rb custom_filter 

Jeśli tak, można zdefiniować „API”, w którym nazwa klasy musiałby dopasować to, co zostało przekazane w - prawie dokładnie jak opisałeś w swoim przykładzie.

Aby zrobić krok dalej, choć może masz jakąś logikę, który wyglądał dla klasy CustomFilter użyciu Ruby defined?, a jeśli nie został znaleziony, szukać custom_filter.rb (lub dowolne odpowiednie odmiany) i próbować załadować ten plik , następnie spróbuj ponownie.

Daje to znakomitą rozszerzalność, ponieważ można napisać dowolną liczbę klas filtrów, wsunąć je do własnych plików .rb i umieścić w dowolnym miejscu, w którym ruby ​​mogą je znaleźć. Nie będzie musiał posiadać predefiniowane stałe albo, jedynymi ograniczeniami będzie

  1. Nazwa klasy musi pasować (wariant) nazwę pliku - Jest to konwencja w Ruby więc jesteś już pewnie i tak to robię.
  2. musi mieć jakiś predefiniowany metody, takie jak metody

Nawiasem mówiąc do_filter, to jest bardzo podobne do tego, co szyny robi dla wymagających modeli, i dlatego można po prostu użyć SomeModel bez konieczności zawsze require app/models/some_model najpierw :-) `

+0

O wiele bardziej praktyczna niż moja ogólna odpowiedź. +1 – VonC

0
# user code 
USER_FILTER = lambda { |value| value != 0xDEADBEEF } 

# script code 
load(user_code); 
FILTER = (const_defined?(:USER_FILTER) ? USER_FILTER : lambda { true }) 

output_array = input_array.filter(&FILTER) 
Powiązane problemy