Решение на Седма задача - ретроспекция от Дарин Тодоров

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

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

Резултати

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

Код

REPOSITORY = 'https://github.com/alonso95/ruby-retrospective-2016'
# Двадесет неща, които научих.
#
# 1. По-добре да бъдат използвани символи за ключове, отколкото String-ове, т.к.
# те се интернират, т.е. при многократно извикване с аргумент ключът-символ се
# създава само един обект.
#
# 2. Използването на константи, пазещи информация за обекти, които биват
# използвани за еднакви цели е по-ефективно (в случая на първа задача - числата
# използвани във формулите за конвертиране).
#
# 3. Употребата на Hash (вместо масив от някакви числа), като носител на
# информация прави кода по-четим и ясен.
#
# 4. Типът Rational е ненужна синтактична захар.
#
# 5. Поставяйки запетая, след последният елемент на хеш, спомага за по-лесна
# промяна в бъдеще (добавяне на елементи).
#
# 6. Може да извикаме метод върху резултатът от изпълнението на do/end блок без
# да го присвояваме на отделна променлива, например:
# do
# some_code
# end.to_a
#
# 7. self-ът може и е добра практика да бъде изпуснат, където е ненужен.
#
# 8. Не е нужно да присвояваме нещо на променлива (например self-а), като след
# деклариране й дори не я използваме.
#
# 9. 'do_something if condition'
# е много по-красиво и разбираемо от
# 'if condition
# do_something'
# Kогато го четеш, все едно четеш логически свързано изречение/текст, а не
# Руби код.
#
# 10. Можем да създаваме Enumerator-и (като викаме без блок някои методи на
# Enumerable) и да ги навързваме, което е доста готино и лесно четимо като код.
# (във втора задача - аrr.map.with_index { |x, i| [i, x]).
#
# 11. Добре е да пишем immutable код. Важно е да използваме #dup и #clone, когато
# не искаме даден метод да променя обект. #clone е по-добрият избор, т.к. копира
# и singleton методите на обекта и също така го freeze-ва копието,
# ако оригиналът е бил freeze-нат.
#
# 12. Научих, че функции има различни имплементации на функции, като #select,
# #reject и т.н.
#
# 13. Можем да запазим резултат от блок, чиято дефиниция не знаем, в променлива и
# след това да използваме този резултат (@arguments[argument_name] = block).
#
# 14. Можем да пазим в #initilize някакви default-ни стойности на инстанционни
# променливи, които пазят информация необходима за self-a:
# @arguments = {}
# @options = []
# @parameter_options = []
#
# 15. Не трябва да тестваме private методи.
#
# 16. Препоръчително е да тестваме #initilize само, когато той съдържа някаква
# логика.
#
# 17. Трябва да пишем възможно най-смислените тестове и да не правим излишни
# такива. Често се случва един тест да бъде препокрит от друг и единият става
# абсолютно излишен и безсмислен:
# expect { Version.new('1.2') }.to_not raise_error
# expect { Version.new('.1.2') }
# .to raise_error(ArgumentError, /Invalid version string '.1.2'/)
# Първият е излишен!
#
# 18. Не трябва да се притесняваме от повторения при тестване (в рамките на
# нормалното), стига да покрива всички гранични ситуации, при които кода
# ще гръмне.
#
# 19. Метапрограмирането е силен инструмент, но и труден. Трябва да се избягва!
#
# 20. Всеки обект в руби си има class и всеки клас си има class.

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

From https://github.com/fmi/ruby-retrospective-2016
 * branch            master     -> FETCH_HEAD
HEAD is now at a22cf37 Set rubocop version to 0.46.0 to fix obsolete cop errors
Cloning into 'submission'...
HEAD is now at ce6d77c New
From /tmp/ruby-retrospective-2016/checker
 * branch            master     -> FETCH_HEAD
 * [new branch]      master     -> upstream/master

Changes URL:
https://github.com/alonso95/ruby-retrospective-2016/compare/1f710b00c26...ce6d77ccd94

'tasks/1/solution.rb' -> '/tmp/ruby-retrospective-2016/checker/tasks/1/solution.rb'
'tasks/2/solution.rb' -> '/tmp/ruby-retrospective-2016/checker/tasks/2/solution.rb'
'tasks/3/solution.rb' -> '/tmp/ruby-retrospective-2016/checker/tasks/3/solution.rb'
'tasks/4/solution.rb' -> '/tmp/ruby-retrospective-2016/checker/tasks/4/solution.rb'
'tasks/5/solution.rb' -> '/tmp/ruby-retrospective-2016/checker/tasks/5/solution.rb'
Inspecting 1 file
.

1 file inspected, no offenses detected
.................

Finished in 0.0069 seconds
17 examples, 0 failures
Inspecting 1 file
.

1 file inspected, no offenses detected
...............

Finished in 0.00757 seconds
15 examples, 0 failures
Inspecting 1 file
.

1 file inspected, no offenses detected

...............

Finished in 0.00748 seconds
15 examples, 0 failures
Inspecting 1 file
.

1 file inspected, no offenses detected
....................

Finished in 19.25 seconds
20 examples, 0 failures
Inspecting 1 file
.

1 file inspected, no offenses detected
.........................

Finished in 0.01931 seconds
25 examples, 0 failures
.

Finished in 0.00164 seconds
1 example, 0 failures

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

Дарин обнови решението на 16.01.2017 16:15 (преди над 7 години)

+REPOSITORY = 'https://github.com/alonso95/ruby-retrospective-2016'
+
+# Двадесет неща, които научих.
+#
+# 1. По-добре да бъдат използвани символи за ключове, отколкото String-ове, т.к.
+# те се интернират, т.е. при многократно извикване с аргумент ключът-символ се
+# създава само един обект.
+#
+# 2. Използването на константи, пазещи информация за обекти, които биват
+# използвани за еднакви цели е по-ефективно (в случая на първа задача - числата
+# използвани във формулите за конвертиране).
+#
+# 3. Употребата на Hash (вместо масив от някакви числа), като носител на
+# информация прави кода по-четим и ясен.
+#
+# 4. Типът Rational е ненужна синтактична захар.
+#
+# 5. Поставяйки запетая, след последният елемент на хеш, спомага за по-лесна
+# промяна в бъдеще (добавяне на елементи).
+#
+# 6. Може да извикаме метод върху резултатът от изпълнението на do/end блок без
+# да го присвояваме на отделна променлива, например:
+# do
+# some_code
+# end.to_a
+#
+# 7. self-ът може и е добра практика да бъде изпуснат, където е ненужен.
+#
+# 8. Не е нужно да присвояваме нещо на променлива (например self-а), като след
+# деклариране й дори не я използваме.
+#
+# 9. 'do_something if condition'
+# е много по-красиво и разбираемо от
+# 'if condition
+# do_something'
+# Kогато го четеш, все едно четеш логически свързано изречение/текст, а не
+# Руби код.
+#
+# 10. Можем да създаваме Enumerator-и (като викаме без блок някои методи на
+# Enumerable) и да ги навързваме, което е доста готино и лесно четимо като код.
+# (във втора задача - аrr.map.with_index { |x, i| [i, x]).
+#
+# 11. Добре е да пишем immutable код. Важно е да използваме #dup и #clone, когато
+# не искаме даден метод да променя обект. #clone е по-добрият избор, т.к. копира
+# и singleton методите на обекта и също така го freeze-ва копието,
+# ако оригиналът е бил freeze-нат.
+#
+# 12. Научих, че функции има различни имплементации на функции, като #select,
+# #reject и т.н.
+#
+# 13. Можем да запазим резултат от блок, чиято дефиниция не знаем, в променлива и
+# след това да използваме този резултат (@arguments[argument_name] = block).
+#
+# 14. Можем да пазим в #initilize някакви default-ни стойности на инстанционни
+# променливи, които пазят информация необходима за self-a:
+# @arguments = {}
+# @options = []
+# @parameter_options = []
+#
+# 15. Не трябва да тестваме private методи.
+#
+# 16. Препоръчително е да тестваме #initilize само, когато той съдържа някаква
+# логика.
+#
+# 17. Трябва да пишем възможно най-смислените тестове и да не правим излишни
+# такива. Често се случва един тест да бъде препокрит от друг и единият става
+# абсолютно излишен и безсмислен:
+# expect { Version.new('1.2') }.to_not raise_error
+# expect { Version.new('.1.2') }
+# .to raise_error(ArgumentError, /Invalid version string '.1.2'/)
+# Първият е излишен!
+#
+# 18. Не трябва да се притесняваме от повторения при тестване (в рамките на
+# нормалното), стига да покрива всички гранични ситуации, при които кода
+# ще гръмне.
+#
+# 19. Метапрограмирането е силен инструмент, но и труден. Трябва да се избягва!
+#
+# 20. Всеки обект в руби си има class и всеки клас си има class.