السيناريو روبي سطر الأوامر التطبيق ؛ أفضل طريقة للقيام بذلك ؟

StackOverflow https://stackoverflow.com/questions/251444

  •  05-07-2019
  •  | 
  •  

سؤال

لدي سطر الأوامر روبي التطبيق انا النامية وأريد أن تسمح للمستخدم من تقديم التعليمات البرمجية التي سيتم تشغيل الفلتر على جزء من هذه العملية.في الأساس, التطبيق هذه:

  1. قراءة في بعض البيانات
  2. إذا كان مرشح محدد ، تستخدم لتصفية البيانات
  3. معالجة البيانات

أريد أن عملية التصفية (الخطوة 2) أن تكون مرنة قدر الإمكان.

كان تفكيري أن المستخدم يمكن أن توفر روبي ملف تعيين ثابت معروف أن نشير إلى كائن تنفيذ واجهة يمكنني تحديد ، على سبيل المثال:

# 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

بلدي التطبيق البرمجية ثم تفعل شيئا مثل هذا:

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

في حين أن هذا العمل من شأنه ، فإنه يشعر جبني و يبدو أنه يجب أن يكون هناك طريقة أفضل للقيام بذلك.كما يعتبر وجود مرشح يكون في شكل إضافة طريقة معروفة اسم معروف الدرجة, لكن هذا لا يبدو صحيحا تماما ، إما.

هل هناك أفضل لغة في روبي على هذا ؟

هل كانت مفيدة؟

المحلول

أنا فقط استخدام مزيج من سطر الأوامر, و الاتفاقية.

إذا كان مرشح محدد ، تستخدم لتصفية البيانات

أفترض أنك تحدد مرشح على سطر الأوامر ؟ لذلك كنت تحتج تطبيق مثل هذا ؟

ruby dataprocessor.rb custom_filter

إذا كان الأمر كذلك ، هل يمكن تعريف "api" حيث اسم الفئة يجب أن تتطابق مع ما صدر في بالضبط كيف تم وصفها في المثال الخاص بك.

أن أعتبر خطوة أخرى إلى الأمام على الرغم من أنك يمكن أن يكون بعض المنطق الذي بحثت عن CustomFilter الطبقة باستخدام روبي defined?, و إذا لم يتم العثور عليه, أبحث عن custom_filter.rb (أو أي مناسبة الاختلافات) و محاولة تحميل هذا الملف ثم إعادة المحاولة.

هذا يعطيك كبيرة للتوسعة, كما يمكنك كتابة العديد من تصفية الطبقات كما تريد تشاك لهم في بلدهم .rb الملفات ووضعها في أي مكان أن روبي يمكن العثور عليها.لن يكون المحددة مسبقا الثوابت إما الوحيد القيود سوف يكون

  1. الفئة يجب أن يطابق الاسم (البديل) اسم الملف - هذه الاتفاقية في روبي لذلك ربما كنت بالفعل تفعل ذلك على أي حال.
  2. يجب أن يكون لديك بعض المعرفة مسبقا طريقة مثل do_filter طريقة

بالمناسبة, هذا مشابه جدا لما القضبان لا تتطلب النماذج الخاصة بك ، وهذا هو السبب يمكنك فقط استخدام SomeModel دون الحاجة إلى القيام به دائما require app/models/some_model أولا :-)`

نصائح أخرى

يبدو عمل نمط استراتيجية, و منذ روبي قد وظائف كائنات من الدرجة الأولى, قد تمر وظيفة مرشح أن يكون حافظا من قبل مجموعة ، من أجل الاحتجاج أن تصفية مخصص الدالة على الطلب.

# 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)
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top