Александър обнови решението на 09.11.2014 13:56 (преди около 10 години)
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
ще съдържа две извиквания на методи с по един блок.
ПП. Решението ти е доста добро, ако поправиш дреболиите по-горе ще стане супер. :)