Решение на Шеста задача от Десислава Цветкова
Към профила на Десислава Цветкова
Резултати
- 6 точки от тестове
- 0 бонус точки
- 6 точки общо
- 14 успешни тест(а)
- 0 неуспешни тест(а)
Код
Лог от изпълнението
.............. Finished in 0.01208 seconds 14 examples, 0 failures
История (5 версии и 3 коментара)
Десислава обнови решението на 28.11.2015 11:52 (преди около 9 години)
Здравей :)
След като си накарала кода да работи, хайде да го подобрим, разкрасим и полираме :)
- Хубаво е класовете да са в един общ клас/модул. Така се предпазваш от случайни сблъсквания на имена с класове/модули от друг код. Например, има вероятност да съществува друг клас
Position
, дефиниран преди твоя код. Ако е така, вместо да създадеш нов, без да искаш ще отвориш съществуващия клас и най-вероятно ще се счупи твоят и чуждият код едновременно. Затова дефинирай всички класове вTurtleGraphics
.
Самото дефиниране е препоръчително да го правиш като ги нестваш:
module TurtleGraphics
class Position
...
end
class Turtle
...
end
end
вместо
module TurtleGraphics
end
class TurtleGraphics::Position
...
end
class TurtleGraphics::Turtle
...
end
Разликата е в начина, по който се търсят константи от кода на мястото на многоточието. При първия вариант се търси първо в Turtle
, после в TurtleGraphics
и накрая в Object
. Във втория случай се търси само в Turtle
и Object
. Например, ако някъде в кода използваш класа Position
, в първия случай ще го намери, а във втория - не.
- Идеята с клас
Position
е интересна, но имам няколко забележки за него:- Използваш класови променливи вместо константи. Щом не се променят и са едни и същи за всички инстанции на класа - трябва да са константи. Също, поведението на класовите променливи е странно на моменти и се избягват.
- Сякаш си го направила по-сложно от необходимото :) Опитай да го опростиш. Не е нужно да имаш толкова сложни променливи. Например,
@@corresponding
може да се замени от един масив с подходящо наредени елементи:[:left, :up, :right, :down]
. Как се завъртаме сега? Ами, просто вървиш напред и назад по елементите в масива :) Така иdirections
става излишен. - Трябваше ми доста умствено усилие да разбера какво правиш в
move
. Предполагам и на теб да го измислиш :) Това всичко го правиш за два елемента. Защо не разделишposition
наx
иy
, и да ги промениш директно? Да, ще има два приличащи си реда, но ще е много по-ясно какво се случва. Същото важи и заdimensions
и аргументите на функции, които приемат позиция. - В
initialize
не е нужно да задаваш@current_position = nil
. Всички инстанционни променливи саnil
по подразбиране. - След като адресираш тези коментари, може да се окаже, че този клас не е нужен, защото кодът е достатъчно малко, че да отиде в
Turtle
:)
-
@width , @heigth = width, heigth
е прекалено overused начин за присвояване. Не печелиш нищо от това, че са направени на един ред. Даже губиш четимост и производителност, защото така се създава един масив ([width, height]
), който веднага се "разпакетира" и става излишен. Просто ги направи на различни редове. Колкото по-ясно - толкова по-добре :)
Между другото, правилното е height, не heigth. Вероятно си се объркала заради width - различни са :) -
make_matrix
може да се напише по-елегантно, използвайкиArray.new
с блок или със следния трик:число.times.map { код }
. - Конвенцията за дефиниране на
private
методи, е да напишешprivate
и да ги дефинираш след това така:
class Star
...
private
def метод1
...
end
def метод2
...
end
end
Хубавото на този начин е, че веднага става ясно, че започват дефиниции на private методи. По другия начин чак накрая на класа разбирам, че някои методи са private, и трябва да сравнявам един по един по име, за да разбера кои са private и кои - public. Става по-ясно :)
-
# да се променя ли интензитетът?
- прецени какво ще стане ако не го променяш вspawn_at
. Имаш два варианта - да го променяш преди всяка стъпка и в края, или в началото и след всяка стъпка. В момента работиш с втория => трябва да го промениш в spawn_at. -
reduce
не е подходящата функция за конкатениране на низове от масив. За целта имаmap
иjoin
. Първо променяш всеки елемент и накрая ги залепяш. :) Метода
draw
не трябва да се интересува от това какъв вид canvas му подаваш. Помисли как да използва приетата инстанция, без да знае коя е. Целта ти трябва да е да можеш да напишеш нов клас, който като се подаде наdraw
да може да рендерира рисунката по съвсем различен начин от сегашните, без да променяшTurtle
. Какво би му било необходимо на такъв клас, за да си свърши работата?
Duck typing :)Имаш забравено принтиране -
p ranges
. Внимавай, че Митьо взима точки за такива неща :P-
find_place
иmake_ranges
може да се замени с малко математика. Помисли как да превърнеш интензитета в индекс на елемент от масива със символи. :) - Вместо да умножаваш с
1.0
, за да обърнеш цяло число в число с плаваща точка, можеш да използваш методаto_f
. Така си личи какво искаш да направиш - а именно, да превърнеш нещо във Float. - Генерирането на HTML-а би било по-ясно, ако отделиш нещата, които не се повтарят, в някаква константа - шаблон (темплейт), в който просто да insert-неш нещата от таблицата.
-
lenght
->length
:)
Ехе, какъв роман написах :) Надявам се коментарите да са били полезни. Питай, ако не си съгласна с нещо, или не съм доизяснил нещо. :)
Ще очаквам нова версия :)
Десислава обнови решението на 29.11.2015 16:11 (преди около 9 години)
Десислава обнови решението на 29.11.2015 17:10 (преди около 9 години)
Сега стана супер :) Предполагам и на теб ти изглежда по-добре?
Остават само някои дребни проблеми във форматирането - трябва да има празно място в скобите на едноредов блок и да няма празни места след точката като chain-ваш неща.
Десислава обнови решението на 02.12.2015 17:26 (преди около 9 години)
Изключително много съм благодарна за коментарите! ^_^ Много ми бяха полезни и нужни! ;P