Четвърта задача

  1. Публикувахме четвърта задача! Тази е по-нестандартна. Ние ви даваме решението - вие пишете тестовете.
    Срокът е до петък (18. ноември) 23:59ч. Решете задачата този уикенд, за да не ви се налага да я пишете в петък вечерта.

    Извадка от условието: Ще считаме споделянето на тестове и на алтернативни решения за преписване.

    Задавайте въпроси по условието тук.

  2. Забелязах, че версията version = '1.3.5.' връща ArgumentError. Това не е упоменато в условието като изискване за валидност на версия - означава ли, че е възможно да има правилно решение, което вместо да дава ArgumentError да тълкува като '1.3.5' ?

  3. @Кузман, интересно наблюдение. Реално, връщането на празен стринг се вписва в условието, защото е казано без нулеви компоненти в края.

    В реалния свят не съществува версия 0. Първата обикновено е 0.0.1. Тук версия 0 използваме само като конструкция, чрез която можем да изразим версия, която е по-ниска от всички (освен себе си). Тоест, помага ни при сравненията и е тук за пълнота.

  4. В #components пише Методът приема опционален аргумент - N - броят на компонентите, които трябва да бъдат върнати. Ако реалните са повече - се вземат първите N, останалите трябва да се игнорират.

    Обаче Version.new('1.3.5').components(2) #=> [1]

    Не би ли трябвало да е [1, 3] ?

  5. Въпрос:
    Това, което ни трябва е клас Version, който се инстанцира със стринг или друга инстанция от същия клас - версия.
    Това означава ли, че инстанциране от вида Version.new(1) е некоректно според условието(или просто не е задължително да е само стринг )?

  6. @Здравко, из условието Ще пускаме тестовете ви и с други правилни решения - не обвързвайте имплементацията с тестовете. Не трябва да те интересува какво връща Version.new(1) - това е недефинирано поведение, а такова не се тества по принцип :)

  7. Когато се вика метода components с аргумент 0, не би ли трябвало да се върне празен списък, защото нали това е броят на компонентите, които трябва да вземем. В задачата, която дадохте, се връща списък със всички аргументи. Така ли трябва да бъде, щото никъде не пише в условието :/

  8. Когато викам метода to_a за даден Range в условието пише, че винаги се започва от третия компонент(включително). Но Version::Range.new('1.0.0.1','1.0.5').to_a ми връща ['1.0.0.1','1.0.1','1.0.2','1.0.3','1.0.4']

    Друг въпрос, Version::Range(Version.new('1.3.5'),Version.new('1.3.5')).to_a празен стринг ли трябва да връща?

  9. @Здравко:

    • "Този метод работи само с версии до 3 компонента (включително)." Version::Range.new('1.0.0.1','1.0.5').to_a е недефинирано поведение.
    • Защо би връщало празен стринг? Връща празен масив, защото в този range няма нито една версия. :)
  10. Но пък пише, че крайната не е включена. Това е стандартно поведение:

    [3] pry(main)> (1...1).to_a
    => []
    

    Ако ти трябва доказателство - представи си интервал от числа [a, a). По дефиниция това са всички числа x, за които е вярно, че a <= x < a. Очевидно, няма нито едно такова x, следователно няма нищо в интервала. Въпреки, че е затворен от лявата страна.

  11. Какво се очаква да бъде поведението на методите на Range, когато сме го инициализирали със стартова версия, която е по-голяма от крайната такава? Не е споменато нищо за това в описанието, така че предполагам го приемаме за неспецифицирано държание и не го тестваме.

  12. @Стефан, идеята е, че обекта, който метода ти връща трябва да не е същия обект, като този в който си държиш компонентите вътрешно в инстанцията на Version (адресите им в паметта са различни). Ако са един и същи обект, евентуална промяна (извън класа) на обекта, който #components ти връща ще промени и състоянието на версията. Можеш лесно да го тестваш като изпълниш която и да е мутираща операция на масива върнат от #components (тоест някоя от тези завършващи с !).

Трябва да сте влезли в системата, за да може да отговаряте на теми.