Решение на Пета задача от Николай Хубанов

Обратно към всички решения

Към профила на Николай Хубанов

Резултати

  • 0 точки от тестове
  • 0 бонус точки
  • 0 точки общо
  • 0 успешни тест(а)
  • 0 неуспешни тест(а)

Код

REPOSITORY = 'http://github.com/nhubanov/ruby-retrospective-3'
#В руби се използват интервали вместо табове.
#В клас може да се изпусне self при извикването на метод.
#Може да се подават символи с имена на методи вместо блокове.
#В руби се предпочита вербалния стил (nonzero? вместо != 0, etc).
#Рекурсивни решения са могат да бъдат доста елегантни.
#Предпочита се reduce пред inject.
#Добре е да се използва map, когато се трансформира 1:1 редица.
#Перпоръчително е използването на count вместо select + size
#Скобите са опционални при извикване на метод.
#{||} е предпочитам формат за lambda пред ->() {}
#Include се поставя в началото на класа.
#При хеширане на обекти може да се ипозлва вграденото хеширане за масиви.
#alias автоматично преобразува аргументите до символи.
#по-сложните алгоритми за рендиране е добре да се обособят в отделен клас.
#Използвай upto вместо ranges.
#Методите, който връщат true/false е препоръчително да завършват с ?
#Добра практика е константите да се freeze-ват.
#Колкото по-точни са имената на промениливте, толкова по-добре.

История (1 версия и 1 коментар)

Николай обнови решението на 22.01.2014 17:02 (преди около 10 години)

+REPOSITORY = 'http://github.com/nhubanov/ruby-retrospective-3'
+
+#В руби се използват интервали вместо табове.
+#В клас може да се изпусне self при извикването на метод.
+#Може да се подават символи с имена на методи вместо блокове.
+#В руби се предпочита вербалния стил (nonzero? вместо != 0, etc).
+#Рекурсивни решения са могат да бъдат доста елегантни.
+#Предпочита се reduce пред inject.
+#Добре е да се използва map, когато се трансформира 1:1 редица.
+#Перпоръчително е използването на count вместо select + size
+#Скобите са опционални при извикване на метод.
+#{||} е предпочитам формат за lambda пред ->() {}
+#Include се поставя в началото на класа.
+#При хеширане на обекти може да се ипозлва вграденото хеширане за масиви.
+#alias автоматично преобразува аргументите до символи.
+#по-сложните алгоритми за рендиране е добре да се обособят в отделен клас.
+#Използвай upto вместо ranges.
+#Методите, който връщат true/false е препоръчително да завършват с ?
+#Добра практика е константите да се freeze-ват.
+#Колкото по-точни са имената на промениливте, толкова по-добре.

За съжаление тестовете ти не минават, както и не си спазил някои от skeptic ограниченията и няма как да ти дам точки за задачата.

Мисля, че кодът, който си предал, има още място за подобрения. Моят съвет е да си избереш три решения на пета задача, на които съм дал най-много точки и да ги разгледаш. Със сигурност ще научиш още неща. Например, не бих искал да има while в първа задача, начинът на използване на range-ове там не е идиоматичен, казвали сме, че предпочитаме reduce пред inject (ти даже си го написал, но не си го променил навсякъде в кода) и прочее.

Имам бележка по употребата на Struct (напр. във втора задача при теб). Виждам смисъл в това само ако има нужда да се замести клас, т.е. се спестява дефиницията на отделен клас. Употреба като тази: class TodoItem < Struct.new(:status, :description, :priority, :tags) не намирам за добра. Предпочитам да дефинирам атрибутите с attr_accessor - не само, че е по-кратко, но и е по-праволинейно, просто и ясно. Struct носи допълнителни неща, които в не само, че повечето случаи не са необходими (например, енумерация на атрибутите), ами са и направо излишни.

В трета задача смятам, че е по-добре да се използват константи, вместо клас-променливи в Renderers::Html.

{||} е предпочитам формат за lambda пред ->() {}

С това твърдение не съм съгласен. Новият стил на lambda е предпочитан, а именно: -> foo { ... }, вместо lambda { |foo| }.

alias автоматично преобразува аргументите до символи.

alias е синтактична конструкция и приема идентификатори като имена на методи, в частност и символи, но нищо друго.

по-сложните алгоритми за рендиране е добре да се обособят в отделен клас.

Това е само един възможен вариант и, за съжаление, не е абсолютна истина. Зависи от ситуацията и много други фактори.

Използвай upto вместо ranges.

Не винаги. Когато целта е обхождане на числата от x до y, тогава upto/downto са по-удобен вариант. Range-овете си имат своите приложения, обаче.

С останалите неща съм съгласен. Надявам се, че си доволен от наученото от теб и че няма да се отказваш да напредваш :)