Дарина обнови решението на 14.11.2011 12:38 (преди около 13 години)
+REPOSITORY = 'https://github.com/dneytcheva/ruby-retrospective-1'
+
+# Двадесет неща, които научих.
+
+# 1. При употребата на each в метод на клас над обекта от този клас self може да се изпусне (вместо self.each директно each).
+# 2. При дефинирането на празен хеш много по-бързо е new_hash = {} вместо new_hash = Hash.new, същото важи и за new_array = [] вместо new_array = Array.new.
+# 3. Enumerable e изключително мощен клас, който предоставя голямо разнообразие от методи, чрез които бих могла да забравя за for и while, които толкова често съм използвала в други езици ( например Enumerable#each_cons - вместо while, пък после take и shift).
+# 4. String#lines - много по-удобен метод вместо split("\n"). Директно се итерира по редовете, а не да пускам .each { |line| line.split("\n") }.
+# 5. Метод String#strip - премахване на (" ", \t, \r, \n) - много по-удобен от String#squeeze(" "), който при промяна на резделителя между думите няма да работи.
+# 6. При подобни методи, чийто изчисления зависят от някакъв критерий за входния параметър, е удобно вместо проверката за типа и извикването на съответния метод да се използва Object#send, който приема символ и множество от параметри, които се третират като име на метод и аргументи за този метод.
+# 7. Enumerable#select за масив, независимо, че аз знам че ще ми върне един елемент се достъпва с [0].
+# 8. На case като случаи може да подаваме класове и така в зависимост на класа да се извършват различни изчисления, много по-удобно от множество if-ове и instance_of?.
+# 9. Array#join - връща низ от елементите на масива с разделител, подаденият аргумент на метода.
+# 10. Символът "%" в sprintf и не само там, се екранира с %% - нещо, което явно никога не ми се е налагало да печатам и така и не открих как да го екранирам, затова symbol = "%"; sprintf("%s", symbol); е нещо изключително смешно за такова нещо.
+# 11. Enumerable#first - връща масив. Много удобнo при работа с хеш - ключът и стойността се достъпват директно с [], a не hash.keys[0] и hash.values[0].
+# 12. Enumerable#detect - открива първия елемент, отговарящ на дадения критерий. По-добро от Enumerable#select в случаите, когато след първото открито съвпадение, няма смисъл да се продължава итерацията по елементите.
+# 13. Колкото повече класове, толкова по-добре. Многото проверки и извикване на различни методи спрямо някакъв параметър е лоша практика. Кодът се препълва с безброй проверки и става по-труден за четене.
+# 14. Един модул може да обединява в себе си много класове. Удобно за елементи от различен тип, но с една и съща идея, както са различните промоции и купони.
+# 15. Да не използвам винаги attr_accessor, а да се замислям как ще се ползват данните. В случай при само една инициализация е по-добре attr_reader, така не се дава свобода на потребителите да пипат по данните.
+# 16. ("%.2f" % money).to_s e еквивалентно на sprintf("%.2f", money).
+# 17. За да си спестим началната инициализация, а после всеки път при добавяне на данни проверката дали вече е инициализирано, можем двете неща да направим едновременно: (new_аrray ||= []) << 'test'
+# 18. Може да се подадат n на брой променливи, които да се инициализират с първите n елемента от масив директно : a,b,c,d = my_array. Също така този начин на инициализация на данни е удобен при размяна на стойности a, b = b, a, а не както навсякъде би се ползвала временна помощна променлива.
+# 19. На метод, приемащ n аргумента, може да се подаде масив от n брой елемента, които ще се подадат като аргументи на метода. Тук е важно да не се забравя * пред масива, както и масива да има точно n на брой елемета, иначе се връща ArgumentError.
+# 20. (0.01..999.99)===price готин начин за проверка дали число принадлежи на даден интервал (краищата се включват) вместо price >= 0.01 and price <= 999.99.
+#
+# Заключение: Да не се страхувам да ползвам Enumerable!!! Преди да напиша някой сложен и дълъг израз да погледна няма ли вече нещо подобно.