Решение на Пета задача от Стилиян Стоянов

Обратно към всички решения

Към профила на Стилиян Стоянов

Резултати

  • 6 точки от тестове
  • 0 бонус точки
  • 6 точки общо
  • 0 успешни тест(а)
  • 0 неуспешни тест(а)

Код

REPOSITORY = 'https://github.com/Stiliyan92/ruby-retrospective-4'
#1.Първото нещо, което научих беше да работя със системата git.Тази задача беше първия ми практически опит с нея.
#2.Научих правилната употреба на each_with_object – вместо преди each да създавам нов #обект, който да връщам изрично след това.
#3.Научих, че има съществена разлика в действието между super и super( ).Също така имам едно #наум, че е възможно да съществуват и други методи в Руби, които имат различно поведение #със и без скоби.
#4.Научих много, разглеждайки други решения за създаване на йерархията на класовете.Видях какво ми е убягнало при измислянето й, което ми попречи да измисля решението тогава.
#5.Справям се малко по-добре с измислянето на имена на променливи след като прочетох доста коментари, оставени от екипа.
#6.Разбрах как да имплеменирам метода each на 100% за класове, които ще искам да имплементират Enumberable и да имат еаch, който прави точно това, което #се очаква.
#7.Използване на String#split вместо String#partition за разделяне на информацията в #сериализираните низове.
#8.Използване на оператор || вместо if/else в някой случай за по-кратък и приятен код.
#9.Чрез case могат да се сравняват класове на обекти без да се използва is_a? или class.Също така ако бъде подаден наследник на някои от класовете, то #той ще бъде разпознат в case.
#10.Използване на map + join за речниците files и directories при сериализация е много по-удобно и четимо, отколкото метод “+” за стринг + each...
#11.Употреба на множествено присвояване на елементи на масив.
#file_name, file_size, tail = tail.split(':', 3)
#12.Употреба на конструкцията number.times do ... end
#13.Присвояване на стойност, върната от case вместо да присвоявам на всяка when клауза:
# data = case file_type
# when ...
# when ...
#14.class_eval е метод на класа Module, докато instance_eval е метон на класа Object.class_eval ще създаде инстанционен метод, когато бъде извикан от констана, реферираща клас, а #instance_eval ще създаде клас метод при това положение.
#15.При дефиниране на помощен метод е хубаво да бъде обявен като private метод.
#16.Методът private прави всички методи private докрая на дефиницията на класа или до извикване на друг метод с подобно действие – public, protected.
#17.При дефиниране на метод в модул не е нужно да се пише иметоНаМодул::имеНаКлас
#18.По конвенция клас методите се пишат преди инстанционните методи.
#19.Стойностите по подразбиране на аргументи в Ruby могат да бъдат всякакви Ruby #изрази.Например дефиниране на метод, инстанциране на обект и т.н.)
#20.Monkey-patching на класове от езика не е хубаво нещо, особено когато придават функции, #които са нетипични за дадения клас.Добро решение е да се отделят в отделен модул.

История (3 версии и 0 коментара)

Стилиян обнови решението на 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

Стилиян обнови решението на 19.01.2015 16:57 (преди почти 10 години)

REPOSITORY = 'https://github.com/Stiliyan92/ruby-retrospective-4'
#1.Работа с git.Няколко са причините, поради които е на първо място.Първо, за да не си #помислите, че го слагам в списъка, за да запълня бройката просто с него.Втората е причина #е, че благодарение на тази задача в крайна сметка научих основите на git.Преди това съм чел #за него, но за първи път прилагам на практика основни команди и виждам как работят.Това е #най-добрият начин да научиш нещо.Може би най-ценният урок, който ще получа от #всичките 20.Последната и най-логична причина е, че е това е първото нещо, което научих.
#
#2.Научих правилната употреба на each_with_object – вместо преди each да създавам нов #обект, който да връщам изрично след това.
#
-#3.Научих, че съществува съществена разлика между super и super( ).Също така имам едно #наум, че е възможно да съществуват и други методи в Руби, които имат различно поведение #със и без скоби.
+#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 #функционалност.
+#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.Употреба на множествено ? На елементи на масив
+#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

Стилиян обнови решението на 21.01.2015 12:39 (преди почти 10 години)

REPOSITORY = 'https://github.com/Stiliyan92/ruby-retrospective-4'
-
-#1.Работа с git.Няколко са причините, поради които е на първо място.Първо, за да не си #помислите, че го слагам в списъка, за да запълня бройката просто с него.Втората е причина #е, че благодарение на тази задача в крайна сметка научих основите на git.Преди това съм чел #за него, но за първи път прилагам на практика основни команди и виждам как работят.Това е #най-добрият начин да научиш нещо.Може би най-ценният урок, който ще получа от #всичките 20.Последната и най-логична причина е, че е това е първото нещо, което научих.
-#
+#1.Първото нещо, което научих беше да работя със системата git.Тази задача беше първия ми практически опит с нея.
#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
-#Ключовият ред обаче код, който ми убягна си мисля, че е:
+#3.Научих, че има съществена разлика в действието между super и super( ).Също така имам едно #наум, че е възможно да съществуват и други методи в Руби, които имат различно поведение #със и без скоби.
+#4.Научих много, разглеждайки други решения за създаване на йерархията на класовете.Видях какво ми е убягнало при измислянето й, което ми попречи да измисля решението тогава.
+#5.Справям се малко по-добре с измислянето на имена на променливи след като прочетох доста коментари, оставени от екипа.
+#6.Разбрах как да имплеменирам метода each на 100% за класове, които ще искам да имплементират Enumberable и да имат еаch, който прави точно това, което #се очаква.
-#Filter.new { … & … } при реализирането на оператора &(|).
-
-#5.Намерих множество полезни съвети за именуване на променливи, методи и т.н. #преглеждайки коментари към решения на колеги.Може би е редно да спомена някои от тях:
-#Що се отнася до имената - опитай се да направиш изречение и виж какво звучи добре. #Множествата от числа съдържат в себе си множество от числа vs Множествата от #числа съдържат в себе си числа. Типовите филтри филтрират по опция vs Типовите
-
-#филтри филтрират по тип.
-
-#Имената трябва да са максимално близо до домейна на проблема, който решаваме. Кода #става по-разбираем. Говори за неща, които очакваме да видим (поради естеството на #проблема), а не понятия измислени от различните разработчици писали го. В контекста на #NumberSet - number е по-добре от item / element. Като цяло трябва да се избягват #"абстрактните" имена по възможност.
-
-#6.Правилно да предефинирам метода each за класове, които ще искам да имплементират Enumerable #функционалност.
-
#7.Използване на String#split вместо String#partition за разделяне на информацията в #сериализираните низове.
-#Получава се доста по-четим и чист код.
-#8.Използване на оператор || :
+#8.Използване на оператор || вместо if/else в някой случай за по-кратък и приятен код.
-#@directories[name] || @files[name]
+#9.Чрез case могат да се сравняват класове на обекти без да се използва is_a? или class.Също така ако бъде подаден наследник на някои от класовете, то #той ще бъде разпознат в case.
-#вместо:
+#10.Използване на map + join за речниците files и directories при сериализация е много по-удобно и четимо, отколкото метод “+” за стринг + each...
-# if directories[name] != nil
-# directories[name]
-# else
-# files[name]
-# end
+#11.Употреба на множествено присвояване на елементи на масив.
+#file_name, file_size, tail = tail.split(':', 3)
-#9.Чрез case могат да се сравняват класове на обекти без да се използва is_a? или class.Също #така ако бъде подаден наследник на някои от класовете, то той няма да бъде разпознат.
+#12.Употреба на конструкцията number.times do ... end
-#10.Използване на map + join за речниците files и directories при сериализация е много по-#удобно и четимо, отколкото метод “+” за стринг + each...
+#13.Присвояване на стойност, върната от case вместо да присвоявам на всяка when клауза:
+# data = case file_type
+# when ...
+# when ...
- # 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
+#14.class_eval е метод на класа Module, докато instance_eval е метон на класа Object.class_eval ще създаде инстанционен метод, когато бъде извикан от констана, реферираща клас, а #instance_eval ще създаде клас метод при това положение.
-#стана:
+#15.При дефиниране на помощен метод е хубаво да бъде обявен като private метод.
-# 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
+#16.Методът private прави всички методи private докрая на дефиницията на класа или до извикване на друг метод с подобно действие – public, protected.
-# def serialized_hash(files)
-# files.map {|n, d| "#{n}:#{d.serialize.size}:#{d.serialize}"}
-# end
+#17.При дефиниране на метод в модул не е нужно да се пише иметоНаМодул::имеНаКлас
-#11.Употреба на множествено присвояване на елементи на масив
+#18.По конвенция клас методите се пишат преди инстанционните методи.
-#file_name, file_size, tail = tail.split(':', 3)
+#19.Стойностите по подразбиране на аргументи в Ruby могат да бъдат всякакви Ruby #изрази.Например дефиниране на метод, инстанциране на обект и т.н.)
-#12.Присвояване на стойност от оператор case:
-# data = case file_type
+#20.Monkey-patching на класове от езика не е хубаво нещо, особено когато придават функции, #които са нетипични за дадения клас.Добро решение е да се отделят в отделен модул.
-# 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