Решение на Четвърта задача от Никола Ненков
Резултати
- 6 точки от тестове
- 3 бонус точки
- 9 точки общо
- 8 успешни тест(а)
- 0 неуспешни тест(а)
Код
Лог от изпълнението
........ Finished in 0.00774 seconds 8 examples, 0 failures
История (7 версии и 7 коментара)
Никола обнови решението на 11.01.2014 00:29 (преди почти 11 години)
Никола обнови решението на 11.01.2014 00:37 (преди почти 11 години)
Никола обнови решението на 11.01.2014 01:15 (преди почти 11 години)
Чудесно!
Само няколко дребни забележки:
-
Asm
по условие не е клас, а модул. - Използвай новия синтаксис за хешове при
jumpers
, т.е.{ jmp: proc { true } }
-
instruction[1..-1]
изглежда по-добре така:instruction.drop 1
- остави празен ред над
[ax, bx, cx, dx].map(&:to_i)
, и махни скобите. Конвенция. - Бих направил
actual_value
иactual_place
на one-liner-и, особеноactual_place
, където може да се ползваHash#fetch
-
Можеш да експериментираш с имплементацията на
Asm.asm
, например как би се отразило на останалия кодAsm.asm
да беше написан така:def self.asm(&block) Executor.execute(Compiler.compile &block) end
Последното изобщо не е задължително, дори изглежда странно, заради повторенията. Не считам за необходимо да си преправяш задачата така, но може да го разцъкаш за упражнение.
Никола обнови решението на 11.01.2014 12:52 (преди почти 11 години)
(deleted)
Супер! Само 2 дреболии:
- Не си оставил празен ред над върнатата стойност в
Compiler.compile
- Донякъде ми е странно, че си „вградил“ старата имплементация на
Executor#execute
вExecutor.execute
. Не е проблем, простоnew(...).instance_eval do ... end
изглежда по-странно от едно простичкоnew(...).execute
. Но не съм сигурен доколко е добре да има instance method и class instance method с едно и също име, тъй че и сегашното положение не е зле.
Още нещо, което пропуснах предния път. Може да сложиш по едно freeze
на mutators
и jumpers
в Compiler
ей-така, за разкош :-)
Никола обнови решението на 12.01.2014 11:56 (преди почти 11 години)
Благодаря много за feedback-a.
За инстанционния execute
: това ми беше първоначалната идея, но тогава Executor
ще има 9 метода, а не искам да се разделям с никой от сегашните, също не мисля, че има смисъл да правя вътрешен клас.
За freeze
: доколкото разбирам целта е readability. Кога се очаква да слагаме freeze
на обектите, които няма да променяме?
Никола, добра практика е разни стойности, които се присвояват на константи, да сеfreeze
-ват. Това е една допълнителна защита, ако случайно нечий код се опита да мутира обекта зад константата, подаван "по референция". Може да не е очевидно, че това идва от константа и някой да не спазва добрата практика да не мутира обектите, подадени му като аргументи на методи. Та, freeze
е някаква форма на защита срещу това.
Обикновено се freeze
-ва нещо, сложено като стойност на константа. Други неща – по-рядко. Няма строги правила за това.
Но в случая интерфейсът ми не предлага начин за достъп до mutators
и jumpers
, така че ако някой иска да ги променя трябва да прави магарии (предполага се, че знае какво прави). А дори и да тръгне да ги променя не виждам как това би променило резултата на програмата: define_method
-ите се изпълняват веднага след присвояването на стойности на mutators
и jumpers
, а стойността им след това е без значение. За да промени поведението чрез промяна на mutators
и jumpers
трябва или да променя самия код, или да има някакъв начин в езика да се вмъкват инструкции между инструкции, които са почнали да се изпълняват.
Но съм напълно съгласен, че носи семантично значение. Като стана въпрос - не трябваше ли mutators
и jumpers
да са all caps?