Александър обнови решението на 09.11.2014 13:56 (преди около 11 години)
parse в Directory може да изглежда доста по-чисто, ако се наруши ограничението за 1 ниво на вложеност :) Съществуването на self.basicFileParse и повторението в self.parse сa резултат именно на "пригаждане" на кода, за да премине ограничението. Уви, за по-генерална смяна на подхода не мисля, че ще намеря достатъчно време. :)
Здравей :)
Ето малко коментари:
- Някои методи (
determine_type,parse_number,serialize_single_fileиbasicFileParse) са част от вътрешната имплементация на класовете, но са публични. - В
determine_typeще е много по-чисто и прегледно, ако използвашcase. Напомням, че сcaseможеш да сравняваш директно с класове, без методи като.classили.is_a?. Това е следствие от това, че Ruby сравнява вcaseчрез===, аClass === objectе валидно нещо и е същото катоobject.is_a?(Class). - Няма нужда да извикваш
.to_sщом използваш интерполация. - Стойностите по подразбиране на аргументи в Ruby може да са всякакви изрази (може дори да са дефиниции на методи :) ), включително и
Directory.new. Може да го използваш вadd_directory. - От друга страна това -
directory || Directory.newможе да го използваш в[]. -
serialize_single_fileиbasicFileParseимат подвеждащи имена - говорят за файлове, но работят и за директории. Втория трябва да е със snake_case, не camelCase. :) - Всъщност с горната точка подсказах, че може да обединиш сериализирането на файлове и директории, както правиш в парсването. :)
- Съществуването на
self.basicFileParseе хубаво, значи ограничението си е свършило работата. :)
Ето идея за не-чак-толкова-по-генерална смяна на подхода. :)
Предлагам нов клас Parser, който да приема низа, който ще се парсва, в initialize и има метод parse_list, който yield-ва двойки (например entity_name и entity_data), които представляват имената и низовете за отделните файлове и директории. Много подобно на това, което правиш сега с basic_file_parse. Разликата е, че метода в Parser, вместо да връща остатъка от низа, може да пази вътрешно състояние с него. Реално няма да има генерални промени по кода ти, а parse ще съдържа две извиквания на методи с по един блок.
ПП. Решението ти е доста добро, ако поправиш дреболиите по-горе ще стане супер. :)
