Решение на Пета задача от Иван Проданов

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

Към профила на Иван Проданов

Резултати

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

Код

REPOSITORY = 'https://github.com/ivan-prodanov/ruby-retrospective-3'
# Двадесет неща, които научих.
#
# 0. Научих, че блок написан на един дълъг ред между { и } е по-зле от блок, написан на 4 реда, включващи 'do' и 'end'.
# 1. Има функция remainder, по-четливо е, от колкото modulo(..)
#
# 2. Проверката за прости числа: по-добре четливо, от колкото оптимизирано, но нечетливо.
# 3. prime_factors връщаше nil, нещо напълно грешно, ето къде ми гърмят тестовете!
# 4. Бях забравил да викна .abs в digits метода на първа задача. Гърмеше ми при отрицателни числа. Пък и &:to_i като аргумент в .map е хитро!
# 5. frequencies(), научих че each_with_object e по-добре от each в случая
# 6. На втора задача научих, че в конструктора може да се инициализира повече от 1 променлива на ред - @var1, @var2 = var1, var2
# 7. Научих, че скобите не са нужни винаги при извикване на функция f1(arg1, arg2) => f1 arg1, arg2
# 8. Научих, че при положение, че Renderer ми е базов модул, Html и Аscii могат да го наследят
# 9. еxtend е наследяване за модули(чудех се, защо не става с '<')
# 10. Въпреки, че харесвам решението си на 4-та задача, осъзнах KISS принципа какво представлява, съобразявайки се с решението на Никола Ненков
# 11. Научих как да си дефинирам методи по време на Runtime (тази лекция май май съм я е изпуснал).
# 12. Научих, че jump-oвете много по-просто се дефинират като хеш от ламбди
# 13. Научих .freeze какво прави, благодарение на коментара на Митьо в решението на Никола Ненков. Интересно наименование, бях свикнал на sealed :)
# 14. Научих, че копирането в руби на част от начина на изчислияване на флагове при инструкции като cmp или xor в асемблер, води до много лош дизайн.
# 15. Научих, че когато се прави DSL, не трябва да се копира 1:1 логиката, а 1:1 функционалността.
# 16. Научих, надявам се, основата на руби, благодарение на този курс
# 17. Искам да науча и основата на python и scala, разбрах, че преподавате курсове и по тях. Ще има ли такъв другата кодина?
# $ bundle exec rake check не стана(на windows съм), четох по форумите камара грешки и стъпки трябваше да правя. Майната им на точките! Важното е, че съм доволен от това, което научих, за което ви благодаря! :)

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

Иван обнови решението на 22.01.2014 13:14 (преди почти 11 години)

+REPOSITORY = 'https://github.com/ivan-prodanov/ruby-retrospective-3'
+
+# Двадесет неща, които научих.
+#
+# 0. Научих, че блок написан на един дълъг ред между { и } е по-зле от блок, написан на 4 реда, включващи 'do' и 'end'.
+# 1. Има функция remainder, по-четливо е, от колкото modulo(..)
+#
+# 2. Проверката за прости числа: по-добре четливо, от колкото оптимизирано, но нечетливо.
+# 3. prime_factors връщаше nil, нещо напълно грешно, ето къде ми гърмят тестовете!
+# 4. Бях забравил да викна .abs в digits метода на първа задача. Гърмеше ми при отрицателни числа. Пък и &:to_i като аргумент в .map е хитро!
+# 5. frequencies(), научих че each_with_object e по-добре от each в случая
+# 6. На втора задача научих, че в конструктора може да се инициализира повече от 1 променлива на ред - @var1, @var2 = var1, var2
+# 7. Научих, че скобите не са нужни винаги при извикване на функция f1(arg1, arg2) => f1 arg1, arg2
+# 8. Научих, че при положение, че Renderer ми е базов модул, Html и Аscii могат да го наследят
+# 9. еxtend е наследяване за модули(чудех се, защо не става с '<')
+# 10. Въпреки, че харесвам решението си на 4-та задача, осъзнах KISS принципа какво представлява, съобразявайки се с решението на Никола Ненков
+# 11. Научих как да си дефинирам методи по време на Runtime (тази лекция май май съм я е изпуснал).
+# 12. Научих, че jump-oвете много по-просто се дефинират като хеш от ламбди
+# 13. Научих .freeze какво прави, благодарение на коментара на Митьо в решението на Никола Ненков. Интересно наименование, бях свикнал на sealed :)
+# 14. Научих, че копирането в руби на част от начина на изчислияване на флагове при инструкции като cmp или xor в асемблер, води до много лош дизайн.
+# 15. Научих, че когато се прави DSL, не трябва да се копира 1:1 логиката, а 1:1 функционалността.
+# 16. Научих, надявам се, основата на руби, благодарение на този курс
+# 17. Искам да науча и основата на python и scala, разбрах, че преподавате курсове и по тях. Ще има ли такъв другата кодина?

Иван обнови решението на 22.01.2014 13:30 (преди почти 11 години)

REPOSITORY = 'https://github.com/ivan-prodanov/ruby-retrospective-3'
# Двадесет неща, които научих.
#
# 0. Научих, че блок написан на един дълъг ред между { и } е по-зле от блок, написан на 4 реда, включващи 'do' и 'end'.
# 1. Има функция remainder, по-четливо е, от колкото modulo(..)
#
# 2. Проверката за прости числа: по-добре четливо, от колкото оптимизирано, но нечетливо.
# 3. prime_factors връщаше nil, нещо напълно грешно, ето къде ми гърмят тестовете!
# 4. Бях забравил да викна .abs в digits метода на първа задача. Гърмеше ми при отрицателни числа. Пък и &:to_i като аргумент в .map е хитро!
# 5. frequencies(), научих че each_with_object e по-добре от each в случая
# 6. На втора задача научих, че в конструктора може да се инициализира повече от 1 променлива на ред - @var1, @var2 = var1, var2
# 7. Научих, че скобите не са нужни винаги при извикване на функция f1(arg1, arg2) => f1 arg1, arg2
# 8. Научих, че при положение, че Renderer ми е базов модул, Html и Аscii могат да го наследят
# 9. еxtend е наследяване за модули(чудех се, защо не става с '<')
# 10. Въпреки, че харесвам решението си на 4-та задача, осъзнах KISS принципа какво представлява, съобразявайки се с решението на Никола Ненков
# 11. Научих как да си дефинирам методи по време на Runtime (тази лекция май май съм я е изпуснал).
# 12. Научих, че jump-oвете много по-просто се дефинират като хеш от ламбди
# 13. Научих .freeze какво прави, благодарение на коментара на Митьо в решението на Никола Ненков. Интересно наименование, бях свикнал на sealed :)
# 14. Научих, че копирането в руби на част от начина на изчислияване на флагове при инструкции като cmp или xor в асемблер, води до много лош дизайн.
# 15. Научих, че когато се прави DSL, не трябва да се копира 1:1 логиката, а 1:1 функционалността.
# 16. Научих, надявам се, основата на руби, благодарение на този курс
-# 17. Искам да науча и основата на python и scala, разбрах, че преподавате курсове и по тях. Ще има ли такъв другата кодина?
+# 17. Искам да науча и основата на python и scala, разбрах, че преподавате курсове и по тях. Ще има ли такъв другата кодина?
+# $ bundle exec rake check не стана(на windows съм), четох по форумите камара грешки и стъпки трябваше да правя. Майната им на точките! Важното е, че съм доволен от това, което научих, за което ви благодаря! :)

Скептик има проблеми на Windows, така е. За щастие, тестовете ти минават и ти гърми само skeptic, затова ще приема решенията ти. За справка, ето къде ти гърми skeptic:

Първа задача

English words for names
* len on line 38 is not in english

Втора задача

English words for names
* comparer on line 53 is not in english
* txt on line 65 is not in english
* desc on line 73 is not in english

Четвърта задача

English words for names
* mutator_name on line 21 is not in english
* comparant_one on line 62 is not in english
* comparant_two on line 62 is not in english

Line length (80)
* Line 67 is too long: 87 columns

Number of lines per method (5)
* Asm::Executor.execute is 6 lines long

Number of methods per class (7)
* Asm::Executor has 8 methods: #mov, #inc, #dec, #cmp, #jmp, #execute, #actual_value, #actual_position

Като цяло, има дребни неща в решенията ти, които не ми допадат (откъм конвенции). Например:

  • Не трябва да оставяш интервал преди отварящата скоба, когато дефинираш методи: def foo (args...).
  • Не бих използвал Struct + наследяване, само за да дефинирам атрибути. Също толкова кратко и по-ясно е attr_accessor :some, :attributes, :here.
  • Решението на първа задача, в някои методи, не ми допада - не само поради липсващи интервали около оператори, но и поради твърде гъста логика, водеща до лоша четимост.
  • Относно точка 2 -- в повечето случаи четимостта се предпочита, но има ситуации в които не можем и не трябва да пренебрегваме скоростта на работа на кода.
  • Относно точка 9 -- всъщност, наследяване на модули не съществува като термин; в Ruby това се нарича "миксиране" на функционалност в приемник (приемникът може да е клас или друг модул).
  • Ако си изпуснал лекции, винаги може да се върнеш и да прегледаш слайдовете от въпросната сбирка, както и да питаш във форумите :)
  • Ще има Python и Clojure. Задължително ги запиши, ако все още не си, особено втория. (Scala не сме водили, беше Clojure. И двете работят върху JVM, но не са едно и също :)

В заключение - радвам се, че си научил толкова неща и че си доволен от това :)