Решение на Девета задача от Теодор Климентов

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

Към профила на Теодор Климентов

Резултати

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

Код

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% от методите на класовете в езика.

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

From https://github.com/fmi/ruby-retrospective-2015-1
 * branch            master     -> FETCH_HEAD
HEAD is now at 767dd8d Update the task name in the readme for clarity
Cloning into 'submission'...
HEAD is now at e391033 Fix a bug in Deck#to_s
From /tmp/ruby-retrospective-2015-1/checker
 * branch            master     -> FETCH_HEAD
 * [new branch]      master     -> upstream/master

Changes URL:
https://github.com/m1trix/ruby-retrospective-2015-1/compare/767dd8dfe46...e391033dd99

‘solutions/04.rb’ -> ‘/tmp/ruby-retrospective-2015-1/checker/solutions/04.rb’
‘solutions/02.rb’ -> ‘/tmp/ruby-retrospective-2015-1/checker/solutions/02.rb’
‘solutions/03.rb’ -> ‘/tmp/ruby-retrospective-2015-1/checker/solutions/03.rb’
‘solutions/01.rb’ -> ‘/tmp/ruby-retrospective-2015-1/checker/solutions/01.rb’
OK
........

Finished in 0.00492 seconds
8 examples, 0 failures
OK
....................

Finished in 0.01111 seconds
20 examples, 0 failures
OK
....................

Finished in 0.01538 seconds
20 examples, 0 failures
OK
.........................................................

Finished in 0.03113 seconds
57 examples, 0 failures
From https://github.com/fmi/ruby-homework
 * branch            master     -> FETCH_HEAD
HEAD is now at 9dd040c Modify a test in task 8 to not include empty cells
.

Finished in 0.00158 seconds
1 example, 0 failures

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

Теодор обнови решението на 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