Решение на Девета задача от Ивайло Чернев

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

Към профила на Ивайло Чернев

Резултати

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

Код

REPOSITORY = 'https://github.com/4erneff/ruby-retrospective-2015-1'
# 1) По-елегантен синтаксис за дефиниране на мап - {foo: 123, bar: 12}
# 2) Ако оградиш израз в скоби, можеш да го chain-ваш с методи, които имат обектите от този тип. Пример (1 + 3).to_s
# 3) Хубаво е човек да се замисля повечко над имената на променливите си, защото не винаги са най-точните
# 4) Когато две променливи имат подобно значение (например x, y) можем спокойно да направим кода по-сбит и красив като използваме паралелно присвояване
# 5) Трябва да се гледат добре частните случаи, които могат да се получат като входни данни
# 6) Условията да се четат по повече от 3 пъти
# 7) || и or не винаги правят едно и също - a == b or c == d и a == b || c == d
# 8) Enumerable има много методи, които се забравят. За да се пише по ефективно е добре човек да хвърля едно око от време на време
# 9) По-прегледно, а и според стайл гайда е така - x.upto(y).each вместо (x..y).each
# 10) Хубаво е, че Руби ни дава толкова много синоними на даден метод, но трябва да се стремим към консистентност.
# 11) Много от грешките се хващат лесно с тестове - тестовете са над 50% от успеха за дадената задача.
# 12) Map не променя arrey, а само връща нов
# 13) to_proc на symbol е много красив метод. Да се използва с Enumerable колкото може по-често, защото спестява код и се чете по-лесно
# 14) От четвърта задача научих, че трябва винаги трябва да си правя прототип на обектния модел.
# 15) От четвърта задача също така научих, че трябва да минавам по кода си и да го рефакторирам, защото повечето пъти първия обектен модел не е най-добрия
# 16) Трябва да разделям логиката на възможно най-малки части и да не използвам един метод за повече от едно нещо.
# 17) Метода slice, който разделя масив на групи. Много полезен.
# 18) Синтаксиса а ||= b. Много елегантен начин да не пишем отделни if-ве
# 19) Предефинирането на оператори често може да спести излишни методи и да направи кода по-четим.
# 20) Да не бързам да използвам тернарен оператор, особено за сравнения и когато искам да върна булеан.

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

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 42b8832 4 task refactoring done
From /tmp/ruby-retrospective-2015-1/checker
 * branch            master     -> FETCH_HEAD
 * [new branch]      master     -> upstream/master

Changes URL:
https://github.com/4erneff/ruby-retrospective-2015-1/compare/767dd8dfe46...42b88327a06

‘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.00503 seconds
8 examples, 0 failures
OK
....................

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

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

Finished in 0.02844 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.00164 seconds
1 example, 0 failures

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

Ивайло обнови решението на 27.01.2016 22:22 (преди около 9 години)

+REPOSITORY = 'https://github.com/4erneff/ruby-retrospective-2015-1'
+
+# 1) По-елегантен синтаксис за дефиниране на мап - {foo: 123, bar: 12}
+# 2) Ако оградиш израз в скоби, можеш да го chain-ваш с методи, които имат обектите от този тип. Пример (1 + 3).to_s
+# 3) Хубаво е човек да се замисля повечко над имената на променливите си, защото не винаги са най-точните
+
+# 4) Когато две променливи имат подобно значение (например x, y) можем спокойно да направим кода по-сбит и красив като използваме паралелно присвояване
+
+# 5) Трябва да се гледат добре частните случаи, които могат да се получат като входни данни
+
+# 6) Условията да се четат по повече от 3 пъти
+
+# 7) || и or не винаги правят едно и също - a == b or c == d и a == b || c == d
+
+# 8) Enumerable има много методи, които се забравят. За да се пише по ефективно е добре човек да хвърля едно око от време на време
+
+# 9) По-прегледно, а и според стайл гайда е така - x.upto(y).each вместо (x..y).each
+
+# 10) Хубаво е, че Руби ни дава толкова много синоними на даден метод, но трябва да се стремим към консистентност.
+
+# 11) Много от грешките се хващат лесно с тестове - тестовете са над 50% от успеха за дадената задача.
+
+# 12) Map не променя arrey, а само връща нов
+
+# 13) to_proc на symbol е много красив метод. Да се използва с Enumerable колкото може по-често, защото спестява код и се чете по-лесно
+
+# 14) От четвърта задача научих, че трябва винаги трябва да си правя прототип на обектния модел.
+
+# 15) От четвърта задача също така научих, че трябва да минавам по кода си и да го рефакторирам, защото повечето пъти първия обектен модел не е най-добрия
+
+# 16) Трябва да разделям логиката на възможно най-малки части и да не използвам един метод за повече от едно нещо.
+
+# 17) Метода slice, който разделя масив на групи. Много полезен.
+
+# 18) Синтаксиса а ||= b. Много елегантен начин да не пишем отделни if-ве
+
+# 19) Предефинирането на оператори често може да спести излишни методи и да направи кода по-четим.
+
+# 20) Да не бързам да използвам тернарен оператор, особено за сравнения и когато искам да върна булеан.

Привет :)

  • Аз лично не бих се съгласил с # 4. Не бих определил sum, used, a, b, add = 2, Array.new, 1, 1, 1 като красив код.
  • a == b or c == d и a == b || c == d по какво се различават в този пример?
  • # 12) Map не променя arrey, а само връща нов къде си го използвал в корекциите? :) # 13, # 17, # 18 и # 19 също
  • Какво имаш предвид в # 14? Не го разбирам

За съжаление има доста неща, които може да се дооправят. Някои проблеми с whitespace (след private се оставя нов ред, както и между методи в клас/модул. Също, имаш кофти имена на променливи (groups, check), много повторение на един и същ код - например belote?, tierce?, quarte? и quint? (както и twenty? и forty?), които правят едно и също с разлика от една константа.

Още, не е нужно да пишеш def initialize; super; end. За разлика от някои други езици, initialize методът се наследява автоматично.