Решение на Трета задача от Стефан Василев
Резултати
- 5 точки от тестове
- 0 бонус точки
- 5 точки общо
- 60 успешни тест(а)
- 9 неуспешни тест(а)
Код
Лог от изпълнението
........F.F..FFF...........................FF...F.......F............ Failures: 1) Graphics Canvas drawing of shapes and rasterization renders multiple drawn shapes Failure/Error: ascii.should eq rendering(expected) expected: "@@@@@@@@@@@@@@@\n@-------------@\n@-@@@@@@@@@@@-@\n@-@---------@-@\n@-@------@@-@-@\n@-@---@@@---@-@\n@-@-@@------@-@\n@-@---------@-@\n@-@-@@@@----@-@\n@-@-@-------@-@\n@-@---------@-@\n@-@---------@-@\n@-@@@@@@@@@@@-@\n@-------------@\n@@@@@@@@@@@@@@@" got: "@@@@@@@@@@@@@@@\n@-------------@\n@-@@@@@@@@@@@-@\n@-@---------@-@\n@-@-----@@@-@-@\n@-@--@@@----@-@\n@-@-@-------@-@\n@-@---------@-@\n@-@-@@@@----@-@\n@-@-@-------@-@\n@-@---------@-@\n@-@---------@-@\n@-@@@@@@@@@@@-@\n@-------------@\n@@@@@@@@@@@@@@@" (compared using ==) Diff: @@ -2,9 +2,9 @@ @-------------@ @-@@@@@@@@@@@-@ @-@---------@-@ -@-@------@@-@-@ -@-@---@@@---@-@ -@-@-@@------@-@ +@-@-----@@@-@-@ +@-@--@@@----@-@ +@-@-@-------@-@ @-@---------@-@ @-@-@@@@----@-@ @-@-@-------@-@ # /tmp/d20131223-4637-e8uh5w/spec.rb:624:in `check_rendering_of' # /tmp/d20131223-4637-e8uh5w/spec.rb:211:in `block (4 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 points works for multiple ones Failure/Error: ascii.should eq rendering(expected) expected: "@---\n@---\n-@@-\n----" got: "@---\n@---\n-@@-\n----\n----\n@" (compared using ==) Diff: @@ -2,4 +2,6 @@ @--- -@@- ---- +---- +@ # /tmp/d20131223-4637-e8uh5w/spec.rb:624:in `check_rendering_of' # /tmp/d20131223-4637-e8uh5w/spec.rb:59: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 lines works with lines with a small slope Failure/Error: ascii.should eq rendering(expected) expected: "----------\n-@@-------\n---@@@@---\n-------@@-\n----------" got: "----------\n-@@@------\n----@@@@--\n--------@-\n----------" (compared using ==) Diff: @@ -1,6 +1,6 @@ ---------- --@@------- ----@@@@--- --------@@- +-@@@------ +----@@@@-- +--------@- ---------- # /tmp/d20131223-4637-e8uh5w/spec.rb:624:in `check_rendering_of' # /tmp/d20131223-4637-e8uh5w/spec.rb:100: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 lines works with lines with a significant slope, with swapped ends Failure/Error: ascii.should eq rendering(expected) expected: "----------\n-@--------\n-@--------\n--@-------\n--@-------\n--@-------\n--@-------\n---@------\n---@------\n----------" got: "----------\n-@--------\n-@--------\n-@--------\n--@-------\n--@-------\n--@-------\n--@-------\n---@------\n----------" (compared using ==) Diff: @@ -1,11 +1,11 @@ ---------- -@-------- -@-------- +-@-------- --@------- --@------- --@------- --@------- ----@------ ---@------ ---------- # /tmp/d20131223-4637-e8uh5w/spec.rb:624:in `check_rendering_of' # /tmp/d20131223-4637-e8uh5w/spec.rb:113: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)>' 5) Graphics Canvas drawing of shapes and rasterization of lines works with multiple lines Failure/Error: ascii.should eq rendering(expected) expected: "-@--------\n-@@-------\n-@-@@@@---\n-@-----@@-\n----------" got: "-@--------\n-@@@------\n-@--@@@@--\n-@------@-\n----------" (compared using ==) Diff: @@ -1,6 +1,6 @@ -@-------- --@@------- --@-@@@@--- --@-----@@- +-@@@------ +-@--@@@@-- +-@------@- ---------- # /tmp/d20131223-4637-e8uh5w/spec.rb:624:in `check_rendering_of' # /tmp/d20131223-4637-e8uh5w/spec.rb:132: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)>' 6) Graphics shapes Line initialization with swapped points puts the top point of vertical lines in the from field Failure/Error: vertical_line.from.y.should eq 1 expected: 1 got: 8 (compared using ==) # /tmp/d20131223-4637-e8uh5w/spec.rb:413:in `block (6 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)>' 7) Graphics shapes Line initialization with swapped points puts the bottom point of vertical lines in the to field Failure/Error: vertical_line.to.y.should eq 8 expected: 8 got: 1 (compared using ==) # /tmp/d20131223-4637-e8uh5w/spec.rb:418:in `block (6 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)>' 8) Graphics shapes Line comparison for equality is true if line is vertical and the bottom is given first Failure/Error: (a == b).should be_true expected: true value got: false # /tmp/d20131223-4637-e8uh5w/spec.rb:449: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)>' 9) Graphics shapes Rectangle initialization puts the leftmost point in its left field Failure/Error: rect.left.y.should eq 1 expected: 1 got: 0 (compared using ==) # /tmp/d20131223-4637-e8uh5w/spec.rb:508: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.08695 seconds 69 examples, 9 failures Failed examples: rspec /tmp/d20131223-4637-e8uh5w/spec.rb:203 # Graphics Canvas drawing of shapes and rasterization renders multiple drawn shapes rspec /tmp/d20131223-4637-e8uh5w/spec.rb:51 # Graphics Canvas drawing of shapes and rasterization of points works for multiple ones rspec /tmp/d20131223-4637-e8uh5w/spec.rb:96 # Graphics Canvas drawing of shapes and rasterization of lines works with lines with a small slope rspec /tmp/d20131223-4637-e8uh5w/spec.rb:109 # Graphics Canvas drawing of shapes and rasterization of lines works with lines with a significant slope, with swapped ends rspec /tmp/d20131223-4637-e8uh5w/spec.rb:127 # Graphics Canvas drawing of shapes and rasterization of lines works with multiple lines rspec /tmp/d20131223-4637-e8uh5w/spec.rb:411 # Graphics shapes Line initialization with swapped points puts the top point of vertical lines in the from field rspec /tmp/d20131223-4637-e8uh5w/spec.rb:416 # Graphics shapes Line initialization with swapped points puts the bottom point of vertical lines in the to field rspec /tmp/d20131223-4637-e8uh5w/spec.rb:445 # Graphics shapes Line comparison for equality is true if line is vertical and the bottom is given first rspec /tmp/d20131223-4637-e8uh5w/spec.rb:504 # Graphics shapes Rectangle initialization puts the leftmost point in its left field
История (5 версии и 5 коментара)
Стефан обнови решението на 17.12.2013 03:40 (преди почти 11 години)
Стефан обнови решението на 17.12.2013 04:52 (преди почти 11 години)
Стефан обнови решението на 17.12.2013 04:57 (преди почти 11 години)
Бележки:
- Празен ред се оставя м/у дефиниции на методи (напр. м/у ред 6 и 7).
- Защо не пробваш как ще стане
Ascii#render
сmap
&join
? - Изведи този дълъг текст
@html_code
в константа вHtml
. Препоръчвам ти да го дефинираш с единични кавички (няма проблем да има multiline низ в тях). - Пак за този HTML код, може да го направиш и без списък. Помисли как. Ще стане по-готино.
- Методът
pixel_at?
не е нужно да връщаfalse
, ако няма пиксел на съответнотно място; може и да връща нещо, което се оценява наfalse
. - Бих подравнил равенствата на ред 66-68.
- Едноизмерен масив е интересна имплементация, но ми напомня на C код :) Виж дали няма да ти хрумне друга идея за вътрешно представяне на пано.
-
Canvas#draw
– големият въпрос еshape.points
илиcanvas.set_pixel
? :) Тоест, дали паното ще ползва някакъв публичен интерфейс от фигурата, или фигурата ще ползва такъв на паното. Интересен въпрос. Просто коментар е това. - Ред 87 се записва така:
renderer.new(self).render
; аналогично и за ред 100 - Нямаш нужда от точката на ред 108; може да е само
self == other_point
; но най-добре го направи със синоними на методи. Същото важи и за ред 138. -
Line#from
и#to
изглеждат ужасно. REFACTOR! - Защо има възможност да се подават аргументи на
Line#points
? Не виждам някъде да се ползва, следователно е излишно, следователно трябва да се махне. Този метод също изглежда зле – неподредено и неясно. - Виждам, че обичаш ternary оператора. Разлюби го, изглежда грозно и недостатъчно ясно в този контекст. Само за много прости изрази се ползва.
И, хайде, малко подсказки:
- Не виждам да си имлементирал
hash
. - Какво ще стане, ако дефинирам
Rectangle.new Point.new(1, 5), Point.new(7, 2)
? Това е валидна дефиниция по условие. Виж дали ще работи правилно при теб.
Иначе, решението ти е доста прилично. Поздравления :)
Стефан обнови решението на 18.12.2013 14:14 (преди почти 11 години)
Към Димитър. Благодаря за подсказката с hash... Тотално я бях забравил. Оправих повечето от нещата, някои не можах да преборя.
Относно това което сте написал:
-
Защо има възможност да се подават аргументи на
Line#points
? Не виждам някъде да се ползва, следователно е излишно, следователно трябва да се махне. Този метод също изглежда зле – неподредено и неясно.Използвам функцията рекурсивно и не виждам друг начин освен да я викам с аргументи в тялото й.
Така ли ми се стори или като пиша много текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст ви се бъгва нещо поленцето за текст и текста ми отива върху снимката ми. Използвам Firefox.
Може да сте го видяли че се бъгва, но понеже казахте да се оплакваме и да ви даваме градивна критика ви давам сега.
Използвам Firefox
Благодаря за бъг репорта, оправено е :) Такива неща най-добре е да ги докладваш в issue tracker-а в хранилището на проекта на сайта.
В отговор на въпроса ти, понеже Line#points
е част от твоя публичен интерфейс на обекта Line
, не е добре да приема аргументи. Намери начин да го направиш без :) Ако беше private
метод, няма проблем, но за public
методи това не е добра идея.
Виждам, че си адресирал някои, но не всички от моите бележки. Просто ти напомням :) Все още имаш време.
Бележки:
- Пробвай да ползваш
map
иjoin
вrender
метода на рендерерите, вместо да градиш низове така. - Удачно е HTML кодът да се изведе в константа/и в класа
Html
. Също така, недостатъчно ясно ми е като е в променливаhtml_code
, която на всичкото отгоре е списък. По-ясно би било, например, да има "html header" и "html footer". - Имаш малко дублираща се логика в двата рендерера, свързана с обхождането на пикселите на паното. Ако смениш вътрешното представяне на пано, ще трябва да промениш и тези два метода, а това не е добре. Опитай да ползваш нещо, което не зависи от това вътрешно представяне.
-
output.chomp.chop.chop.chop.chop << @html_code[1]
?! Това със сигурност трябва да се рефакторира. Ако ползвашmap
иjoin
няма да трябва да го правиш, но дори и да не беше така, можеше поне да ползвашString#slice
. - Внимавай с мутацията в рендерерите.
- Помисли дали няма друг по-оптимален начин в Ruby за реализация вътрешното представяне на пано от двумерен масив. Ruby не е C и има по-удобни структури от данни :)
- Също така,
pixel_at?
може да връща нещо, което се оценява като истина или лъжа; не е задължително да еtrue
/false
. - Ред 102: защо не просто
[self]
? - Може да ползваш синоними на методи, за да реализираш
eql?
. - Хм, сигурен ли си, че имплементациите ти на
hash
ще работят? -
Line#points
изглежда кофти. Много наблъскано и нечетимо. Освен това, методътpoints
е част от публичния интерфейс наLine
, а приема някакви аргументи, на които не им е там мястото. Намери начин да го рефакторираш. - Обърква ме кодът с точките на правоъгълника. По условие, правоъгълник може да се конструира и от bottom_left, top_right. Следователно, имената на променливите в конструктора са подвеждащи. Оттам и другите методи надолу.
Като цяло, стилът ти е що-годе приличен и откъм дизайн си на прав път.