Решение на Трета задача от Красимира Божанова
Към профила на Красимира Божанова
Резултати
- 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 (преди почти 11 години)
Дизайнът ти е в правилна посока. Следваш перфектно конвенциите и правилата за идентация. Ето малко бележки за неща, които би могла да подобриш:
- Ако трябваше да запиша ред 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
? -
GeometryFigure
vs.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
, макар че съм сигурен, че може да се измисли и по-добро име...