Решение на Седма задача - ретроспекция от Петко Митков

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

Към профила на Петко Митков

Резултати

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

Код

REPOSITORY = 'https://github.com/petkomitkovv/ruby-retrospective-2016'
# Двадесет неща, които научих.
#
# Задача 1
# 1. Важно е да знаем каква е грешката която се получава при закръгляне и как са
# представени числата с плаваща запетая.
# 2. Може значително да намалим размера на използваната памет(от n^2 до n + n) ако
# не пазим всички превръщания, а само тези до една единица и от нея към всички
# останали.
# 3. Могат да се добавят долни черти за подобряване четенето на по-големи числа(2_048 == 2048)
#
# Задача 2
# 4. При итериране на речник можем да използваме |key, value| вместо да взимаме ключовете
# и после да търсим стойността. /facepalm
#
# 5. Проверката дали две инстанции принадлежат на един и същ обект изглежда по-прегледно
# ако използваме is_a? или instance_of?, но трябва да внимаваме за разликата между двете
#
# 6. Въпреки че, итеративното решение на някои проблеми е значително по-бързо и изразходва по-малко
# памет, рекурсивното решение на проблем върху рекурсивна структура каквато е речника от речници
# изглежда много по-просто и лесно за разбиране. Освен това не ни се налага да правим допълнителни проверки
# заради възможността на речника да връща nil ако стойността не съществута.
#
# 7. Добавянето на празни редове след if-else проверки, цикли и други значително подобрява
# четимоста и помага за логическото разделение на частите от метода.
#
# 8. Има метод Symbol#to_sym и String#to_sym, но няма метод Fixnum#to_sym тъй като числата не могат да се изполват
# като идентификатори(:42 не е валидно, но :"42" е валидно)
#
# Задача 3
# 9. Вместо variable.to_s може да се напише "#{variable}". Когато се конкатенират
# изрази "#{variable}" е по-четимо и доста по-кратко.
#
# 10. Научих, че разликата между #match и #scan не е само в това че #match връща
# само първия срещнат низ, но и начина по който се връща резултата(обект MatchData
# и масив от стрингове).
#
# 11. Научих, че #any? { condition } и #map { condition == true }.any? не са еквива-
# лентни тъй като първото спира при първата стойност за която условието е истина,
# а във втория случай се map-ват всички елементи и после се извиква any?, което е доста
# по-бавно. Може да се използва lazy енумератор, но тогава стават безсмислено.
#
# 12. Научих, че ^ $ match-ват до края на реда докато /А и /z нямат това ограничение.
# При валидация на стрингове като имейли или пароли е добре да се използва ^ $ поради
# тази причина. Могат да се махнат и символите за нов ред от файла.
#
# Задача 4
#
# 13. Промених тестовете, така че в един случай да има повече от един expect.
# Не знаех, че това е правилен начин за писане на тестове, но по този начин
# може да се проверяват много повече случаи без да се налага да се пишат
# наново и да се измислят други имена за тях.
#
# 14. След като поразгледах няколко решения видях, че доста хора са използвали
# be_true(be truthy) и be_false(be_falsy). Основната разлика между тях и
# be true, be false е начина по който се сравнявят обектите. При be_truthy и
# и be_falsy се гледа дали върнатата стойност е false(nil или false) докато
# при be true и be false се използва оператора == за сравнение.
# 15. Научих, че тестването не е само за откриване на грешки, но и за валидация че приложението
# прави това, което се иска от него по спецификация. Поради тази причина е по-важно
# да бъдат тествани всички случаи, от които потребителя има нужда отколкото
# да се открие някоя малка грешка, чието оправяне няма да доведе до значителни подобрения
#
# Задача 5
#
# 16. Научих, че вместо да "търся" някакъв обект по неговия object_id с ObjectSpace#_id2ref
# мога просто да добавя възможност за търсене по id в самата база данни. the more you know
#
#
# 16. При връщането на обект от търсене мога да създам нов обект с нужните параметри и стойности.
# И да искам да върна стария по референция товя няма как да стане защото в базата са записани
# само неговите полето, а самия обект не е записан.
#
# 17. Функцията reject е много по-удобна когато искаме да проверим някакво условие
# и да махнем елементите, които не ни трябват за да използваме останалите, отколкото
# select или итериране със проверката в самия блок и някакъв акомулатор.
#
# 18. Базите от данни ни дават много лесен и абстрактен начин да записваме нашите обекти.
# Записваме само нужните полета, а не самите обекти. Това ни позволява да се абстрахираме
# от начина по който са написани и да използваме само техните член данни.
#
# 19. Въпреки, че в ruby няма method overloading все пак можем да си измислим наш собствен(с проверки
# в самата фунцкия спрямо подадените параметри тъй като те могат да бъдат всякакви) за да решим
# някои проблеми като например този с attributes метода.
#
# 20. Глобалните променливи за класа се копират при наследяване, докато променливите, дефинирани с @@ се
# запазват и не си променят стойността.
#

Лог от изпълнението

From https://github.com/fmi/ruby-retrospective-2016
 * branch            master     -> FETCH_HEAD
HEAD is now at a22cf37 Set rubocop version to 0.46.0 to fix obsolete cop errors
Cloning into 'submission'...
HEAD is now at bca8292 Improve DataModel class in task 5
From /tmp/ruby-retrospective-2016/checker
 * branch            master     -> FETCH_HEAD
 * [new branch]      master     -> upstream/master

Changes URL:
https://github.com/petkomitkovv/ruby-retrospective-2016/compare/1f710b00c26...bca829217e1

'tasks/1/solution.rb' -> '/tmp/ruby-retrospective-2016/checker/tasks/1/solution.rb'
'tasks/2/solution.rb' -> '/tmp/ruby-retrospective-2016/checker/tasks/2/solution.rb'
'tasks/3/solution.rb' -> '/tmp/ruby-retrospective-2016/checker/tasks/3/solution.rb'
'tasks/4/solution.rb' -> '/tmp/ruby-retrospective-2016/checker/tasks/4/solution.rb'
'tasks/5/solution.rb' -> '/tmp/ruby-retrospective-2016/checker/tasks/5/solution.rb'
Inspecting 1 file
.

1 file inspected, no offenses detected
.................

Finished in 0.00463 seconds
17 examples, 0 failures
Inspecting 1 file
.

1 file inspected, no offenses detected
...............

Finished in 0.02405 seconds
15 examples, 0 failures
Inspecting 1 file
.

1 file inspected, no offenses detected

...............

Finished in 0.00781 seconds
15 examples, 0 failures
Inspecting 1 file
.

1 file inspected, no offenses detected
....................

Finished in 19.82 seconds
20 examples, 0 failures
Inspecting 1 file
.

1 file inspected, no offenses detected
.........................

Finished in 0.01722 seconds
25 examples, 0 failures
.

Finished in 0.00162 seconds
1 example, 0 failures

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

Петко обнови решението на 16.01.2017 16:39 (преди над 7 години)

+
+# Двадесет неща, които научих.
+#
+# Задача 1
+# 1. Важно е да знаем каква е грешката която се получава при закръгляне и как са
+# представени числата с плаваща запетая.
+# 2. Може значително да намалим размера на използваната памет(от n^2 до n + n) ако
+# не пазим всички превръщания, а само тези до една единица и от нея към всички
+# останали.
+# 3. Могат да се добавят долни черти за подобряване четенето на по-големи числа(2_048 == 2048)
+#
+# Задача 2
+# 4. При итериране на речник можем да използваме |key, value| вместо да взимаме ключовете
+# и после да търсим стойността. /facepalm
+#
+# 5. Проверката дали две инстанции принадлежат на един и същ обект изглежда по-прегледно
+# ако използваме is_a? или instance_of?, но трябва да внимаваме за разликата между двете
+#
+# 6. Въпреки че, итеративното решение на някои проблеми е значително по-бързо и изразходва по-малко
+# памет, рекурсивното решение на проблем върху рекурсивна структура каквато е речника от речници
+# изглежда много по-просто и лесно за разбиране. Освен това не ни се налага да правим допълнителни проверки
+# заради възможността на речника да връща nil ако стойността не съществута.
+#
+# 7. Добавянето на празни редове след if-else проверки, цикли и други значително подобрява
+# четимоста и помага за логическото разделение на частите от метода.
+#
+# 8. Има метод Symbol#to_sym и String#to_sym, но няма метод Fixnum#to_sym тъй като числата не могат да се изполват
+# като идентификатори(:42 не е валидно, но :"42" е валидно)
+#
+# Задача 3
+# 9. Вместо variable.to_s може да се напише "#{variable}". Когато се конкатенират
+# изрази "#{variable}" е по-четимо и доста по-кратко.
+#
+# 10. Научих, че разликата между #match и #scan не е само в това че #match връща
+# само първия срещнат низ, но и начина по който се връща резултата(обект MatchData
+# и масив от стрингове).
+#
+# 11. Научих, че #any? { condition } и #map { condition == true }.any? не са еквива-
+# лентни тъй като първото спира при първата стойност за която условието е истина,
+# а във втория случай се map-ват всички елементи и после се извиква any?, което е доста
+# по-бавно. Може да се използва lazy енумератор, но тогава стават безсмислено.
+#
+# 12. Научих, че ^ $ match-ват до края на реда докато /А и /z нямат това ограничение.
+# При валидация на стрингове като имейли или пароли е добре да се използва ^ $ поради
+# тази причина. Могат да се махнат и символите за нов ред от файла.
+#
+# Задача 4
+#
+# 13. Промених тестовете, така че в един случай да има повече от един expect.
+# Не знаех, че това е правилен начин за писане на тестове, но по този начин
+# може да се проверяват много повече случаи без да се налага да се пишат
+# наново и да се измислят други имена за тях.
+#
+# 14. След като поразгледах няколко решения видях, че доста хора са използвали
+# be_true(be truthy) и be_false(be_falsy). Основната разлика между тях и
+# be true, be false е начина по който се сравнявят обектите. При be_truthy и
+# и be_falsy се гледа дали върнатата стойност е false(nil или false) докато
+# при be true и be false се използва оператора == за сравнение.
+
+# 15. Научих, че тестването не е само за откриване на грешки, но и за валидация че приложението
+# прави това, което се иска от него по спецификация. Поради тази причина е по-важно
+# да бъдат тествани всички случаи, от които потребителя има нужда отколкото
+# да се открие някоя малка грешка, чието оправяне няма да доведе до значителни подобрения
+#
+# Задача 5
+#
+# 16. Научих, че вместо да "търся" някакъв обект по неговия object_id с ObjectSpace#_id2ref
+# мога просто да добавя възможност за търсене по id в самата база данни. the more you know
+#
+#
+# 16. При връщането на обект от търсене мога да създам нов обект с нужните параметри и стойности.
+# И да искам да върна стария по референция товя няма как да стане защото в базата са записани
+# само неговите полето, а самия обект не е записан.
+#
+# 17. Функцията reject е много по-удобна когато искаме да проверим някакво условие
+# и да махнем елементите, които не ни трябват за да използваме останалите, отколкото
+# select или итериране със проверката в самия блок и някакъв акомулатор.
+#
+# 18. Базите от данни ни дават много лесен и абстрактен начин да записваме нашите обекти.
+# Записваме само нужните полета, а не самите обекти. Това ни позволява да се абстрахираме
+# от начина по който са написани и да използваме само техните член данни.
+#
+# 19. Въпреки, че в ruby няма method overloading все пак можем да си измислим наш собствен(с проверки
+# в самата фунцкия спрямо подадените параметри тъй като те могат да бъдат всякакви) за да решим
+# някои проблеми като например този с attributes метода.
+#
+# 20. Глобалните променливи за класа се копират при наследяване, докато променливите, дефинирани с @@ се
+# запазват и не си променят стойността.
+#

Петко обнови решението на 16.01.2017 16:39 (преди над 7 години)

+REPOSITORY = 'https://github.com/petkomitkovv/ruby-retrospective-2016'
# Двадесет неща, които научих.
#
# Задача 1
# 1. Важно е да знаем каква е грешката която се получава при закръгляне и как са
# представени числата с плаваща запетая.
# 2. Може значително да намалим размера на използваната памет(от n^2 до n + n) ако
# не пазим всички превръщания, а само тези до една единица и от нея към всички
# останали.
# 3. Могат да се добавят долни черти за подобряване четенето на по-големи числа(2_048 == 2048)
#
# Задача 2
# 4. При итериране на речник можем да използваме |key, value| вместо да взимаме ключовете
# и после да търсим стойността. /facepalm
#
# 5. Проверката дали две инстанции принадлежат на един и същ обект изглежда по-прегледно
# ако използваме is_a? или instance_of?, но трябва да внимаваме за разликата между двете
#
# 6. Въпреки че, итеративното решение на някои проблеми е значително по-бързо и изразходва по-малко
# памет, рекурсивното решение на проблем върху рекурсивна структура каквато е речника от речници
# изглежда много по-просто и лесно за разбиране. Освен това не ни се налага да правим допълнителни проверки
# заради възможността на речника да връща nil ако стойността не съществута.
#
# 7. Добавянето на празни редове след if-else проверки, цикли и други значително подобрява
# четимоста и помага за логическото разделение на частите от метода.
#
# 8. Има метод Symbol#to_sym и String#to_sym, но няма метод Fixnum#to_sym тъй като числата не могат да се изполват
# като идентификатори(:42 не е валидно, но :"42" е валидно)
#
# Задача 3
# 9. Вместо variable.to_s може да се напише "#{variable}". Когато се конкатенират
# изрази "#{variable}" е по-четимо и доста по-кратко.
#
# 10. Научих, че разликата между #match и #scan не е само в това че #match връща
# само първия срещнат низ, но и начина по който се връща резултата(обект MatchData
# и масив от стрингове).
#
# 11. Научих, че #any? { condition } и #map { condition == true }.any? не са еквива-
# лентни тъй като първото спира при първата стойност за която условието е истина,
# а във втория случай се map-ват всички елементи и после се извиква any?, което е доста
# по-бавно. Може да се използва lazy енумератор, но тогава стават безсмислено.
#
# 12. Научих, че ^ $ match-ват до края на реда докато /А и /z нямат това ограничение.
# При валидация на стрингове като имейли или пароли е добре да се използва ^ $ поради
# тази причина. Могат да се махнат и символите за нов ред от файла.
#
# Задача 4
#
# 13. Промених тестовете, така че в един случай да има повече от един expect.
# Не знаех, че това е правилен начин за писане на тестове, но по този начин
# може да се проверяват много повече случаи без да се налага да се пишат
# наново и да се измислят други имена за тях.
#
# 14. След като поразгледах няколко решения видях, че доста хора са използвали
# be_true(be truthy) и be_false(be_falsy). Основната разлика между тях и
# be true, be false е начина по който се сравнявят обектите. При be_truthy и
# и be_falsy се гледа дали върнатата стойност е false(nil или false) докато
# при be true и be false се използва оператора == за сравнение.
# 15. Научих, че тестването не е само за откриване на грешки, но и за валидация че приложението
# прави това, което се иска от него по спецификация. Поради тази причина е по-важно
# да бъдат тествани всички случаи, от които потребителя има нужда отколкото
# да се открие някоя малка грешка, чието оправяне няма да доведе до значителни подобрения
#
# Задача 5
#
# 16. Научих, че вместо да "търся" някакъв обект по неговия object_id с ObjectSpace#_id2ref
# мога просто да добавя възможност за търсене по id в самата база данни. the more you know
#
#
# 16. При връщането на обект от търсене мога да създам нов обект с нужните параметри и стойности.
# И да искам да върна стария по референция товя няма как да стане защото в базата са записани
# само неговите полето, а самия обект не е записан.
#
# 17. Функцията reject е много по-удобна когато искаме да проверим някакво условие
# и да махнем елементите, които не ни трябват за да използваме останалите, отколкото
# select или итериране със проверката в самия блок и някакъв акомулатор.
#
# 18. Базите от данни ни дават много лесен и абстрактен начин да записваме нашите обекти.
# Записваме само нужните полета, а не самите обекти. Това ни позволява да се абстрахираме
# от начина по който са написани и да използваме само техните член данни.
#
# 19. Въпреки, че в ruby няма method overloading все пак можем да си измислим наш собствен(с проверки
# в самата фунцкия спрямо подадените параметри тъй като те могат да бъдат всякакви) за да решим
# някои проблеми като например този с attributes метода.
#
# 20. Глобалните променливи за класа се копират при наследяване, докато променливите, дефинирани с @@ се
# запазват и не си променят стойността.
#