Решение на Трета задача от Красимира Божанова
Към профила на Красимира Божанова
Резултати
- 6 точки от тестове
- 0 бонус точки
- 6 точки общо
- 65 успешни тест(а)
- 4 неуспешни тест(а)
Код
Лог от изпълнението
..........F.....F..FF................................................
Failures:
1) Graphics Canvas drawing of shapes and rasterization of points works for multiple ones
Failure/Error: canvas.set_pixel 4, 4
NoMethodError:
undefined method `[]=' for nil:NilClass
# /tmp/d20131223-4637-l4qp9i/solution.rb:12:in `set_pixel'
# /tmp/d20131223-4637-l4qp9i/spec.rb:57:in `block (5 levels) in <top (required)>'
# ./lib/language/ruby/run_with_timeout.rb:5:in `block (3 levels) in <top (required)>'
# ./lib/language/ruby/run_with_timeout.rb:5:in `block (2 levels) in <top (required)>'
2) Graphics Canvas drawing of shapes and rasterization of lines draws lines with two equal ends as points
Failure/Error: canvas.draw make_line(make_point(1, 1), make_point(1, 1))
ZeroDivisionError:
divided by 0
# /tmp/d20131223-4637-l4qp9i/solution.rb:85:in `/'
# /tmp/d20131223-4637-l4qp9i/solution.rb:85:in `each'
# /tmp/d20131223-4637-l4qp9i/solution.rb:85:in `reduce'
# /tmp/d20131223-4637-l4qp9i/solution.rb:85:in `delta'
# /tmp/d20131223-4637-l4qp9i/solution.rb:95:in `block in bresenham_generation'
# /tmp/d20131223-4637-l4qp9i/solution.rb:93:in `upto'
# /tmp/d20131223-4637-l4qp9i/solution.rb:93:in `each_with_object'
# /tmp/d20131223-4637-l4qp9i/solution.rb:93:in `bresenham_generation'
# /tmp/d20131223-4637-l4qp9i/solution.rb:105:in `pixels'
# /tmp/d20131223-4637-l4qp9i/solution.rb:20:in `draw'
# /tmp/d20131223-4637-l4qp9i/spec.rb:143:in `block (5 levels) in <top (required)>'
# ./lib/language/ruby/run_with_timeout.rb:5:in `block (3 levels) in <top (required)>'
# ./lib/language/ruby/run_with_timeout.rb:5:in `block (2 levels) in <top (required)>'
3) Graphics Canvas drawing of shapes and rasterization of rectangles works with rects with a zero height as a line
Failure/Error: canvas.draw make_rectangle(make_point(1, 1), make_point(8, 1))
ZeroDivisionError:
divided by 0
# /tmp/d20131223-4637-l4qp9i/solution.rb:85:in `/'
# /tmp/d20131223-4637-l4qp9i/solution.rb:85:in `each'
# /tmp/d20131223-4637-l4qp9i/solution.rb:85:in `reduce'
# /tmp/d20131223-4637-l4qp9i/solution.rb:85:in `delta'
# /tmp/d20131223-4637-l4qp9i/solution.rb:95:in `block in bresenham_generation'
# /tmp/d20131223-4637-l4qp9i/solution.rb:93:in `upto'
# /tmp/d20131223-4637-l4qp9i/solution.rb:93:in `each_with_object'
# /tmp/d20131223-4637-l4qp9i/solution.rb:93:in `bresenham_generation'
# /tmp/d20131223-4637-l4qp9i/solution.rb:105:in `pixels'
# /tmp/d20131223-4637-l4qp9i/solution.rb:125:in `block in pixels'
# /tmp/d20131223-4637-l4qp9i/solution.rb:124:in `each'
# /tmp/d20131223-4637-l4qp9i/solution.rb:124:in `each_cons'
# /tmp/d20131223-4637-l4qp9i/solution.rb:124:in `each_with_object'
# /tmp/d20131223-4637-l4qp9i/solution.rb:124:in `pixels'
# /tmp/d20131223-4637-l4qp9i/solution.rb:20:in `draw'
# /tmp/d20131223-4637-l4qp9i/spec.rb:182:in `block (5 levels) in <top (required)>'
# ./lib/language/ruby/run_with_timeout.rb:5:in `block (3 levels) in <top (required)>'
# ./lib/language/ruby/run_with_timeout.rb:5:in `block (2 levels) in <top (required)>'
4) Graphics Canvas drawing of shapes and rasterization of rectangles works with rects with a zero width and height as a single point
Failure/Error: canvas.draw make_rectangle(make_point(1, 1), make_point(1, 1))
ZeroDivisionError:
divided by 0
# /tmp/d20131223-4637-l4qp9i/solution.rb:85:in `/'
# /tmp/d20131223-4637-l4qp9i/solution.rb:85:in `each'
# /tmp/d20131223-4637-l4qp9i/solution.rb:85:in `reduce'
# /tmp/d20131223-4637-l4qp9i/solution.rb:85:in `delta'
# /tmp/d20131223-4637-l4qp9i/solution.rb:95:in `block in bresenham_generation'
# /tmp/d20131223-4637-l4qp9i/solution.rb:93:in `upto'
# /tmp/d20131223-4637-l4qp9i/solution.rb:93:in `each_with_object'
# /tmp/d20131223-4637-l4qp9i/solution.rb:93:in `bresenham_generation'
# /tmp/d20131223-4637-l4qp9i/solution.rb:105:in `pixels'
# /tmp/d20131223-4637-l4qp9i/solution.rb:125:in `block in pixels'
# /tmp/d20131223-4637-l4qp9i/solution.rb:124:in `each'
# /tmp/d20131223-4637-l4qp9i/solution.rb:124:in `each_cons'
# /tmp/d20131223-4637-l4qp9i/solution.rb:124:in `each_with_object'
# /tmp/d20131223-4637-l4qp9i/solution.rb:124:in `pixels'
# /tmp/d20131223-4637-l4qp9i/solution.rb:20:in `draw'
# /tmp/d20131223-4637-l4qp9i/spec.rb:193:in `block (5 levels) in <top (required)>'
# ./lib/language/ruby/run_with_timeout.rb:5:in `block (3 levels) in <top (required)>'
# ./lib/language/ruby/run_with_timeout.rb:5:in `block (2 levels) in <top (required)>'
Finished in 0.08891 seconds
69 examples, 4 failures
Failed examples:
rspec /tmp/d20131223-4637-l4qp9i/spec.rb:51 # Graphics Canvas drawing of shapes and rasterization of points works for multiple ones
rspec /tmp/d20131223-4637-l4qp9i/spec.rb:141 # Graphics Canvas drawing of shapes and rasterization of lines draws lines with two equal ends as points
rspec /tmp/d20131223-4637-l4qp9i/spec.rb:180 # Graphics Canvas drawing of shapes and rasterization of rectangles works with rects with a zero height as a line
rspec /tmp/d20131223-4637-l4qp9i/spec.rb:191 # Graphics Canvas drawing of shapes and rasterization of rectangles works with rects with a zero width and height as a single point
История (2 версии и 3 коментара)
Красимира обнови решението на 22.12.2013 14:28 (преди почти 12 години)
Дизайнът ти е в правилна посока. Следваш перфектно конвенциите и правилата за идентация. Ето малко бележки за неща, които би могла да подобриш:
- Ако трябваше да запиша ред 8, бих сложил интервали около нулата, така:
{ 0 }. Бих подравнил и равенствата в този метод, както и на други сходни места. - Помисли дали няма друг по-оптимален начин в Ruby за реализация вътрешното представяне на пано, от масив от масиви. Ruby не е C и има по-удобни структури от данни, за които дори няма нужда да
require-ваш нищо :) - Тъй като
pixel_at?може да връща нещо, което се оценява като истина или лъжа и не е задължително да еtrue/false, помисли дали най-правилният избор за представяне на "има пиксел"/"няма пиксел" са 1 и 0. - На ред 20 може да се възползваш от начина, по който аргументи на блок могат да се "разпаднат", т.е. да напишеш
figure.pixels.each { |x, y| set_pixel x, y }. - Помисли кой трбява да носи отговорността за "рендериране" на пано. Самото пано или рендерера? Помисли кой обект каква отговорност носи. Една основна идея на ОО-програмирането е да разпределиш различните отговорности между различни обекти. Стреми се всеки обект да отговаря за едно конкретно нещо и само за него. Напълно нормално е да имаш голям брой малки обекти в системата, с тясно специализирани отговорности. В момента класовете ти
HtmlиAsciiги ползваш просто като "кофи" за данни. - Ако изобщо трябва да я има променливата
render_string, не е ли по-добре да се казваrendered_string? -
GeometryFigurevs.Figure? - А какво трябва да означава "sufficient"? Не ми е достатъчно ясно това име.
- Само да уточня, че условието не изисква да дефинираш метода
<=>. Не го и забранява, разбира се. Аз бих го написал сif/elsif/else. Също така, когато дефинираш този метод, обикновено правиш иinclude Comparable, за да получиш купчина други методи. Виж документацията наComparableза детайли. - На ред 73 няма нужда от звездичката.
-
point_based_on_steep→point_based_on_steepness? -
bresenham_generation→bresenham_rasterization? - Бих направил горните два метода
private. Както и някои други, които не би трябвало да са част от публичния интерфейс наLine. -
Харесва ми как ти се е получила сметката за върховете на правоъгълник, благодарение на
<=>. Аз бих го форматирал така:@top_left, @bottom_left, @top_right, @bottom_right = [ first_point, second_point, Point.new(first_point.x, second_point.y), Point.new(second_point.x, first_point.y), ].sort Методът
pixelsна правоъгълник ми е някак твърде сложен. Защо просто не дефинираш експлицитно четирите линии? Въпреки, че има малко дублиране на код, може би ще е далеч по-ясно какво се случва.
Благодаря много за коментара, но за съжаление нямах възможност да отделя време вчера... Иначе методът sufficient трябва да представлява необходимото и достатъчно да се идентифицира и отличи един геометричен обект (на правоъгълника е с 4те върха, а не с 2 срещуположни, за да се различава от линия при генериране на hash) :)
Аз много добре виждам какво прави този метод и каква му е логиката, въпросът е, че именуването му ми се струва неподходящо. Поне да беше нещо от рода на sufficient_identification, макар че съм сигурен, че може да се измисли и по-добро име...
