Решение на Четвърта задача от Никола Ненков
Резултати
- 6 точки от тестове
- 3 бонус точки
- 9 точки общо
- 8 успешни тест(а)
- 0 неуспешни тест(а)
Код
Лог от изпълнението
........ Finished in 0.00774 seconds 8 examples, 0 failures
История (7 версии и 7 коментара)
Никола обнови решението на 11.01.2014 00:29 (преди почти 12 години)
Никола обнови решението на 11.01.2014 00:37 (преди почти 12 години)
Никола обнови решението на 11.01.2014 01:15 (преди почти 12 години)
Чудесно!
Само няколко дребни забележки:
-
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 (преди почти 12 години)
(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 (преди почти 12 години)
Благодаря много за feedback-a.
За инстанционния execute: това ми беше първоначалната идея, но тогава Executor ще има 9 метода, а не искам да се разделям с никой от сегашните, също не мисля, че има смисъл да правя вътрешен клас.
За freeze: доколкото разбирам целта е readability. Кога се очаква да слагаме freeze на обектите, които няма да променяме?
Никола, добра практика е разни стойности, които се присвояват на константи, да сеfreeze-ват. Това е една допълнителна защита, ако случайно нечий код се опита да мутира обекта зад константата, подаван "по референция". Може да не е очевидно, че това идва от константа и някой да не спазва добрата практика да не мутира обектите, подадени му като аргументи на методи. Та, freeze е някаква форма на защита срещу това.
Обикновено се freeze-ва нещо, сложено като стойност на константа. Други неща – по-рядко. Няма строги правила за това.
Но в случая интерфейсът ми не предлага начин за достъп до mutators и jumpers, така че ако някой иска да ги променя трябва да прави магарии (предполага се, че знае какво прави). А дори и да тръгне да ги променя не виждам как това би променило резултата на програмата: define_method-ите се изпълняват веднага след присвояването на стойности на mutators и jumpers, а стойността им след това е без значение. За да промени поведението чрез промяна на mutators и jumpers трябва или да променя самия код, или да има някакъв начин в езика да се вмъкват инструкции между инструкции, които са почнали да се изпълняват.
Но съм напълно съгласен, че носи семантично значение. Като стана въпрос - не трябваше ли mutators и jumpers да са all caps?
