Стилиян обнови решението на 19.01.2015 16:41 (преди почти 10 години)
+REPOSITORY = 'https://github.com/Stiliyan92/ruby-retrospective-4'
+
+#1.Работа с git.Няколко са причините, поради които е на първо място.Първо, за да не си #помислите, че го слагам в списъка, за да запълня бройката просто с него.Втората е причина #е, че благодарение на тази задача в крайна сметка научих основите на git.Преди това съм чел #за него, но за първи път прилагам на практика основни команди и виждам как работят.Това е #най-добрият начин да научиш нещо.Може би най-ценният урок, който ще получа от #всичките 20.Последната и най-логична причина е, че е това е първото нещо, което научих.
+#
+#2.Научих правилната употреба на each_with_object – вместо преди each да създавам нов #обект, който да връщам изрично след това.
+#
+#3.Научих, че съществува съществена разлика между super и super( ).Също така имам едно #наум, че е възможно да съществуват и други методи в Руби, които имат различно поведение #със и без скоби.
+#
+#
+#4.Докато пишех втората домашно изпробвах поне 10 различни начина за построяване на #йерархията на Filter класовете.Какво ли не ми мина през главата, а сега като преглеждам #решенията на колегите виждам колко по-просто наглед изглежда доброто решение.Прави ми #впечатление, че има поне 10-на доста близки, което ме води на мисълта, че задачата е била #зададена много точно и коректно, но просто не съм имал правилните познания да се насоча #към решението.Сега след като прегледах решенията и ревизирах моето, мисля че научих #немалко неща, сред които използване на super метода, разни методи като is_a? вместо #class.to_s.Също така изключително важни наблюдения върху това как да си комуникират #отделните класове:
+#Вместо
+ #def []( filter )
+ # filter.filter_set_of_numbers @number_set
+ # end
+#и
+#def filter_set_of_numbers numbers
+# numbers.select { |x| @filter.call x.real.round }
+ # end
+#това:
+#def [](filter)
+ # NumberSet.new @number_set.select {|number| filter.matches? number}
+#end
+#Ключовият ред обаче код, който ми убягна си мисля, че е:
+
+#Filter.new { … & … } при реализирането на оператора &(|).
+
+#5.Намерих множество полезни съвети за именуване на променливи, методи и т.н. #преглеждайки коментари към решения на колеги.Може би е редно да спомена някои от тях:
+#Що се отнася до имената - опитай се да направиш изречение и виж какво звучи добре. #Множествата от числа съдържат в себе си множество от числа vs Множествата от #числа съдържат в себе си числа. Типовите филтри филтрират по опция vs Типовите
+
+#филтри филтрират по тип.
+
+#Имената трябва да са максимално близо до домейна на проблема, който решаваме. Кода #става по-разбираем. Говори за неща, които очакваме да видим (поради естеството на #проблема), а не понятия измислени от различните разработчици писали го. В контекста на #NumberSet - number е по-добре от item / element. Като цяло трябва да се избягват #"абстрактните" имена по възможност.
+
+#6.Правилно да предефинирам метода each за класове, които ще искам да имат Enumerable #функционалност.
+
+#7.Използване на String#split вместо String#partition за разделяне на информацията в #сериализираните низове.
+
+#8.Използване на оператор || :
+
+#@directories[name] || @files[name]
+
+#вместо:
+
+# if directories[name] != nil
+# directories[name]
+# else
+# files[name]
+# end
+
+#9.Чрез case могат да се сравняват класове на обекти без да се използва is_a? или class.Също #така ако бъде подаден наследник на някои от класовете, то той няма да бъде разпознат.
+
+#10.Използване на map + join за речниците files и directories при сериализация е много по-#удобно и четимо, отколкото метод “+” за стринг + each...
+
+ # def serialize()
+ # serialized_files = serialized_hash(@files) + serialized_hash(@directories)
+ # end
+
+# def serialized_hash(hash)
+# serialized_files = hash.size.to_s + ":"
+# hash.each do |key, value|
+# srlzd_elem = value.serialize
+# file_size = srlzd_elem.size.to_s
+# serialized_files = serialized_files + key + ":" + file_size + ":" + srlzd_elem
+# end
+# serialized_files
+# end
+
+#стана:
+
+# def serialize()
+# serialized_files = serialized_hash(@files)
+# serialized_directories = serialized_hash(@directories)
+# serialized = "#{@files.size}:#{serialized_files.join''}"
+# serialized + "{@directories.size}:#{serialized_directories.join''}"
+# end
+
+# def serialized_hash(files)
+# files.map {|n, d| "#{n}:#{d.serialize.size}:#{d.serialize}"}
+# end
+
+#11.Употреба на множествено ? На елементи на масив
+
+#file_name, file_size, tail = tail.split(':', 3)
+
+#12.Присвояване на стойност от оператор case:
+# data = case file_type
+# when 'number' then File.to_num file_data
+# when 'string' then file_data
+# when 'symbol' then file_data.to_sym
+# when 'boolean' then file_data == 'true'
+# end
+# File.new data