Теодор обнови решението на 27.01.2016 15:16 (преди около 9 години)
+REPOSITORY = 'https://github.com/m1trix/ruby-retrospective-2015-1'
+
+# Двадесет неща, които научих:
+
+# 1. Не си мисли, че като си писал на chef знаеш Ruby. Не си мисли, че като
+# си учил Java и Python това означава, че знаеш и Ruby. Не подценявай
+# курса! Не подценявай Ruby!
+
+# 2. Чети условието поне два пъти, а някои по-важни части - повече.
+# Не си мисли, че като си писал подобна задача за друг курс във ФМИ,
+# знаеш всички особености и няма как да я объркаш. Не си мисли, че
+# решението е очевидно и всичко е ясно.
+
+# 3. Не преписвай константите от условието (имена на класове и променливи,
+# както и числени стойности или низове). Има голяма вероятност да ги
+# препишеш грешно и понеже си ТИ, точно това ще стане.
+
+# 4. Винаги пиши тестове. Това, че програмата е кратка не означава, че
+# тестването на ръка ще покрие всички case-ове. Не подценявай дори
+# най-крактите задачи!
+
+# 5. В Ruby има оператор <=>. Той е това, което е Comparable за Java.
+# Връща целочислена стойност при сравняване на два обекта:
+# * 0 ако двата обекта са "равни";
+# * 1 ако левият обект е "по-голям" от десния;
+# * -1 ако десният обект е "по-голям" от левия.
+# "По-голям" изцяло зависи от имплементацията на оператора в дадения клас.
+
+# 6. Числата са обекти. Числата имат методи. Ако имаш нужда от определено
+# свойство на дадено число, най-вероятно вече го има като метод.
+# #round е пример за такъв метод.
+
+# 7. Освен, че хешове могат да се създават със използването на синтаксис,
+# за създаване на хешове с ключови думи за ключове, има още по-лесен
+# синтаксис. Езикът сам подсказва какво е най-добре да ползваш за ключове.
+
+# 8. Масивите в Ruby имат mutable и imutable методи. Imutable методите имат
+# сътветните на тях mutable методи.
+
+# 9. Monkey patching се нарича актът на пренебрегване на добрите практики
+# и променяне или разширяване на нещо вече е написано и работи добре.
+# Може да бъде много полезен, но може и да се използва за зли цели.
+# Ruby е подходящ език за подобен тип начинания.
+
+# 10.Съществуват неща като модули. Модулите премахват нуждата да се дублира
+# код. Модулите правят езика по-гъвкав и динамичен, но като всяко друго
+# нещо, трябва да се използват с мярка, защото логиката на кода може да
+# стане изключително объркваща.
+
+# 11.Enumerable е модул, дава наготово почти всичко, от кеото се нуждаеш,
+# за да създадеш нова "колекция" от елементи.
+
+# 12.Модулите могат да бъдат използвани за namespace-и. Модулите могат да се
+# миксират в класове. Миксирането е иновативна идея за разрешаване на
+# проблема с множественото наследяване.
+
+# 13.Както във всеки друг език и в Ruby има синтаксис за lambda функции,
+# който е различен от този на всички останали езици. Използването на нов
+# език трябва да е трудно. Какъв би бил смисъла да имаме различни езици
+# ако синтаксиса им е еднакъв?
+
+# 14.Класовете се инстанцират с класовия метод new. Този метод не е нещо
+# ново за програмирането, но в език като Ruby, това прави кода много
+# по-четим и отваря възможността за chain-ване на последващи извиквания
+# на методи върху новосъздадената инстанция. Метод new може да е бъде
+# override-нат (за добро или зло) и това е следствие на философията на
+# Ruby - всичко е клас, всичко има методи, всички публични методи служат
+# на нуждите на пргограмиста.
+
+# 15.В Ruby полиморфизма е следствие, вместо цел. В езици като C++ се
+# правят особени извращения за да се постигне този ефект, но в Ruby
+# той е там, защото всичко е динамично. Нищо не се компилира; типовете
+# нямат значение. Всяка референция може да се подава навсякъде.
+
+# 16.Всички обекти имат #to_s - низ със това, което виждат и разбрат
+# хората за този обект; #inspect - низ с това, което виждат и разбират
+# хората за това, което "вижда" и "разбира" компютъра за този обект.
+
+# 17.alias_method пише методи вместо нас. Това също не е нищо ново в
+# в програмирането, но с разликата, че това не е макрос. Това е метод,
+# който копира методи. Отново - възможността за такива методи идва от
+# високата динамика на езика.
+
+# 18.attr_reader, attr_writer и att_accessor също са методи, които пишат
+# методи. Най-общо казано, създават getter-и и setter-и за определени
+# инстанционни променливи на класа, в който е използват.
+
+# 19.В Ruby има най-неочаквани класове: Range, Complex, че дори Rational.
+# Още по-неочаквано е, че езика има синтаксис за тях.
+
+# 20.Заключение: Ruby е пълен с всичко. Има всякакви класове и всякакви
+# методи към тях, но малко от тях се казват така, както очакваш да се
+# казват. Пример с други популярни езици:
+# * Java: toLowerCase();
+# * Python: lowercase();
+# * C++: tolower();
+# * Clojure: lower-case;
+# * Haskell: toLower;
+# * JavaScript: toLowerCase();
+# * PHP: strtolower();
+# * Дори и Perl: lc.
+# Как бих предположил, че се казва този метод в Ruby? #lowercase.
+# Как се казва този метод в Ruby: #downcase.
+#
+# И това е истина за 80-90% от методите на класовете в езика.
Ехе... 20-та точка е too much според мен (: Иначе добре си се справил с 20-те поуки. Обаче, можеше повече да се постараеш с подобряването на задачите. Например:
- Задача 1 - хешът е добре да бъде константа извън метода, а left/right имената са леко странни
- Задача 2 -
w
/h
?width
иheight
е това, което би ни израдвало - Задача 3 - още еднобуквени променливи (
p
/i
/e
/etc) и може би не толкова криптично смятане на rational sequence - Задача 4 -
RealCardGameRules
:D