Георги обнови решението на 27.01.2016 00:19 (преди около 9 години)
+REPOSITORY = 'https://github.com/georgisvetlozarovstefanov/ruby-retrospective-2015-1'
+
+# 1. Всичко в Ruby е израз и връща стойност. Може да се възползвам от това
+# и да присвоявам на променлива резултат от case, if и т.н. Мога да
+# връщам и променлива с някакъв метод върху нея, без да променям
+# променливата, което спестява много код, усилия и недоразбиране.
+
+# 2. Добре подбраните имена на променливи и константи подобряват възприемането
+# на кода, с което програмите стават по-качествени. Най-добрите имена обикновено
+# са най-интуитивните, за които човек се сети, използват познати думи
+# по наша конвенция английски. Ако например искаме да именуваме вторият аргумент
+# на функция измежду два такива е удобно, да го кръстим second_something, където на
+# мястото на something ще е просто именно нещото, което този аргумент репрезентира.
+
+# 3. Когато една програма съдържа константи, по-добра идея е те да са дефинирани извън
+# метод по няколко причини : възприемането на кода е по-последователно, при добавяне
+# на нови константи, методите не се изменят значително, а само местата, където са
+# дефинирани константите.
+
+# 4. При изреждането на списъци, добре е да се оставя запетая и след последния елемент.
+# Това улеснява пренасянето и добавянето на информация при писане на код.
+
+# 5. Ако от един масив извадим друг, ще получим разликата им в смисъла на множества:
+# "[1, 3, 5] - [3] = [1, 5]", но "[1, 3, 5] - [2] = [1, 3, 5]" - така лесно можем да
+# извлечем елементите на масив, които ни интересуват.
+
+# 6. Понякога е по-добре да се именуват изразите в някой метод вместо да се връщат просто
+# резултатите от тях:
+# "x_axis = [*0...dimensions[:width]]"
+# "y_axis = [*0...dimensions[:height]]"
+
+# "x_axis.product(y_axis)"
+
+# е много по-четимо от:
+
+# "[*0...dimensions[:width]].product([*0...dimensions[:height]])".
+# Правилото зависи много от контекста и сложността на израза, но колкото повече вложени
+# изрази има, толкова по-добре да се използват променливи.
+
+# 7. Нещо , което се пренебрегва при мисленето на код е 'тежестта' му. При задачи, в които се използват
+# рекурсия е добре да се оптимизира, тъй като там най-силно се усеща значението на по-простите кодове.
+# Пример: Трета задача ми се провали, тъй като на тестовете timeout-на и не можа за 28 рационални числа
+# да направи бързо извеждане.
+
+
+# 8. Случаите, в които се нуждаем от малко на брой методи в конкретен домейн, са подходящи за
+# monkey-patching. Ако искаме да добавим метод върху class Integer, който вероятно няма да ползваме в друг
+# код, няма нужда да създаваме друг клас за Integer-ите - можем да отворим стандартния и да добавим
+# метода в него.
+
+# 9. 1 / 0 предизвиква ZeroDivisionError, а 1.0 / 0 връща Infinity, което е от клас Float, но се държи
+# като безкрайността, която добре познаваме. Това е удобно при ползване на lazy масиви.
+
+# 10. Ако кодът съдържа , число или ключ-стойност, които се повтарят много, може да се дефинират константи в съответните
+# класове. Това улеснява логиката и спестява писането на код.
+
+# 11. Бърз начин за сравнение на два елемента - методът <=> позволява да разбереш точно какво е отношението на два обекта.
+# 4 <=> 5 връща -1, 5 <=> 4 връща 1, а 4 <=> 4 връща нула. По този начин в някои специфични случаи, може да се избегне
+# създаването на case. При създаването на класове, които не наследяват от други с този метод , трябва да си го дефинирам.
+# Но веднъж щом имам метод <=> в един клас, мога много лесно да сортирам масиви от обекти от този клас с метода sort.
+
+# 12. Многомерни масиви се правят много лесно с метода product на Array. Работи както декартовото произведение на множества.
+
+# 13. Лесен начин да се вземе произволен елемент от масив е да се използва методът sample. Ако в даден масив имаме елементи, които
+# не искаме да се взимат в извадката, можем да образуваме масив от тези елементи и да го изкараме от дадения. Така получаваме
+# нов масив без да променяме оригиналния и от него можем да извадим произволен елемент, който със сигурност няма да е един от
+# нежеланите.
+
+# 14. Бърз и удобен начин за вземане на стойността на някаква операция (сума, произведение и т.н.) върху масив е методът reduce.
+# Подаваш аргумент за нулевата стойност и символ за операцията, която се извършва.
+
+# 15. Много често се използват класове и обекти, които наподобяват част от функционалността на Array. Тогава най-лесно е да се използва
+# модулът Enum. Ако 'нещото' е някакъв списък, който може да се обхожда - include Enumerable. Тогава трябва да има each метод :
+
+# "def each(&block)
+# @sequence.each(&block)
+# end ".
+
+# Това е най-удобният начин да се дефинира, ако обектът има променлива, която държи истински масив.
+
+
+# 16. За създаването на малки масиви (с малко елементи) може да се използва литерален синтаксис '[var1,...,var2]'. Също така, [*number...number+length]
+# ще създаде масив с числата от number до number + length - 1. Това може да се доведе и до една стъпка по-напред. [*"a"...."z"*n_times]
+# ще създаде масив от всички думи над азбуката {a,b,c...z} с дължина не повече от n, с изключение на празната дума.
+# Още по-общо могат да се комбинират и да се създават масиви от различни елементи.
+
+
+# 17. Операторите or и and са различни от || и && съответно.
+
+
+# "a_var = false
+# a_var = true and false
+# a_var #=> true"
+# и
+# "a_var = true
+# a_var = true && false
+# a_var #=> flase"
+
+# И все пак е по-четливо да се ползват or и and, дори и да трябва да се ползват скоби или да се променя кодът.
+
+# 18. В Ruby има Range клас. С него лесно се проверява принадлежност:
+
+# "a_range = 1..10
+# a_range === 5 #=> true
+# a_range === 11 #=> false".
+
+# Както в 16 , тук може да се направи range от думи с не по-голяма дължина от дадена.
+
+# 19. Тъй като всички обекти м Ruby имат булеви стойности и всичко е израз могат да се направят следните неща:
+# Примери :
+
+# "a or b # Проверява дали a е истина - връщаме a, ако е. След това проверява дали b е истина - връща b ако е. Иначе false.
+# a and b # Проверява дали a не е истина - връщаме false, ако е. Проверява дали b е лъжа - връща false ако е. Иначе b."
+
+# 20. KISS - Keep It Simple Stupid: Когато измисля имплементацията на някаква програма - поне като за прототип, не трябва да се спирам на нея, докато не съм
+# сигурен, че това е най-простият възможен начин да се достигнат нужните изисквания. За да се научи човек да пише код, не трябва да упражнява само измислянето.
+# Трябва да се упражнява и елегантността.