Петко обнови решението на 16.01.2017 16:39 (преди почти 8 години)
+
+# Двадесет неща, които научих.
+#
+# Задача 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. Глобалните променливи за класа се копират при наследяване, докато променливите, дефинирани с @@ се
+# запазват и не си променят стойността.
+#