Има ли проблем, ако използваме define_method
?
Във връзка със следния цитат от guide-а Как да (не) си изпращаме задачите:
Ако дефинирате метод с define_method, може да подминете
ограничението за брой методи в клас. (...)
Не пасем трева. Ако сте направили така, резултата ще варира от
това да ви вземем няколко точки за стил, до това въобще да не
ви дадем точки на задачата.
Шеста задача
rate = ExchangeRate.new rate.set :USD, :BGN, '1.6'.to_d rate.get(:USD, :EUR) # => nil rate.get(:USD, :BGN) # => BigDecimal.new('1.6') rate.get(:USD, :BGN) # => BigDecimal.new('.625')
Последният ред не е ли rate.get(:BGN, :USD) # => BigDecimal.new('.625') ?
describe '#convert' do it 'converts from A to B using an existing rate A -> B' do rate.set :EUR, :BGN, '1.95583'.to_d rate.convert(:EUR, :BGN, 100.to_d).should eq '195.583'.to_d.to_d end end
Защо на 3ти ред има 2 пъти to_d?
Лоша практика ли е да се дефинира клас за изключение в друг клас?
@Николай, ако смяташ, че ще стане много по-добре с него. Ако не го правиш, за да заобиколиш ограничението. Аз не съм го ползвал и не виждам къде има остра нужда от define_method, но ти може да имаш по-добра идея.
@Нели, за първите две неща си права, грешки са. За третото - не, не е лоша практика.
За да предефинираме операторите за сравнение е необходимо да предефинираме само оператора <=>. Вярно ли е това или не?
Нели, тези неща ги пише в първата и втората лекция.
Класът
ExchangeRate
само между две валути ли може да поддържа курса или между повече? Защото се казва rate, в единствено число, но пък пише, чеset
метода може да се извиква многократно?@Милан,
ExchangeRate
може да поддържа обмен между повече от една валута. Имаш известно право за именоването на класа, ще го взема предвид.Обменният курс между две еднакви валути е винаги единица (очевидно) и това не трявба да може да се променя.
А какво е поведението, ако се опита да се смени - хвърля се изключение или друго? Освен това ако се подадат две еднакви валути и обменият курс е единица - това ок ли е или пак се смята за грешка?
@Пламен, не се хвърля изключение, но курсът не трябва да се сменя.
Edit: nevermind
Money.new('3.4'.to_d, :BGN) == Money.new('3.4'.to_d, :USD)
При мен не се хвърля изключение. Стойността на == е false. Имплементирал съм <=>, както трябва. Ако е >= се хвърля изключение. Някой да има същия проблем?
П.С. Сега видях в нета, че Comparable#==, хваща всички изключения, които се случват в <=>.
Защо ограничението за брой методи в клас е 12 след като за клас Money ни трябват поне 13 метода - изброените и initialize?
@Елена: Наистина, една от реализациите изисква поне 13 метода. (Аз имах същия проблем с максималния брой методи в клас, затова ми се наложи да помисля за нещо друго.) Разгледай написаното в същата тази тема, може да ти дойдат идеи.
Оправих се. Благодаря за отговора!
Трябва да сте влезли в системата, за да може да отговаряте на теми.