Решение на Пета задача от Елена Миронова

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

Към профила на Елена Миронова

Код

REPOSITORY = 'https://github.com/epmironova/ruby-retrospective-2'
#Двадесет неща, които научих:
1. Методи:
Integer#upto(limit) - Обхожда числата до посоченото число включително.
Enumerable#all?[{|obj| block}] - Подава всеки елемент от колекцията на дадения блок. Връща true,
ако блокът никога не връща false или nil. Ако не е подаден блок,
Ruby добавя неявен блок {|obj| obj}.
Integer#pred - Връща число, равно на стойността на числото - 1.
Numeric#zero? - Връща true, ако числото има стойност 0.
Numeric#nonzero? - Връща стойността числото, ако числото не е 0, и nil в противен случай.
Numeric#remainder(numeric) - Връща остатъка при деление на посоченото число.
2. Enumerable#map { |obj| block } вместо Enumerable#each_with_index(*args) { |obj, i| block }, защото Enumerable#map връща
нов списък, изпълнявайки блока за всеки елемент.
3. if/elsif вместо само if, най-малкото ще си спестим проверката на останалите условия при истина от някое от по-горните условия.
4. Enumerable#each_with_object(obj) { |(*args), memo_obj| ... } - обхожда колекция, подавайки текущия елемент и обекта на блока. Използва се за построяване на
Hash обекти или за преобразуване на колекция към обект. Не може да се използва с immutable обекти като числа, true или false.
5. Оператор "||=" - присвоява стойност на променлива, ако преди това не е имала никаква стойност.
6.lines вместо each_line, добавяне на chomp
Вместо slice[0], slice[1], slice[2] използваме name, artist, album, за да станне кода по-разбираем.
7. Вместо song.satisfy?(criteria) използваме criteria.met_by? song, за да избегнем лош coupling между двата класа и за да не знае нашия клас Song за съществуването
на класовете Criteria, Criterion и т.н.
8. Оператора + вместо метода Array#concat. Array#concat(other_array) добавя елементите на other_array към елементите на дсден списък. В метода adjoin връщаме нов
списък, който няма елементи, така че има по-голям смисъл да използваме оператора +.
9. Вместо клас един клас CriteriaPart, на който да се подават аргументи два низа с вида на критерия и самия критерий, използваме 3 класа NameCriterion, ArtistCriterion и
AlbumCriterion, които наследяват класа Criterion. Смисъла е в това, че всеки от тези 3 класа по различен начин интерпретира метода met_by(song), а общото между
тях са предефинираните методи &, |, !.
10. Добавяме класове Conjunction, Disjunction и Negation, които да ни помогнат за имплементирането на методите &, |, !.
11. Когато използваме многократно един regex шаблон,е хубаво да го изнесем като константа в класа, в който го използваме. (4-та задача: клас Validations)
12. Вместо да повтаряме много код, можем да изнесем повтарящият се код в един метод (4-та задача: добавяме метода )

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

Елена обнови решението на 30.12.2012 23:44 (преди над 11 години)

+REPOSITORY = 'https://github.com/epmironova/ruby-retrospective-2'
+
+#Двадесет неща, които научих:
+
+1. Методи:
+
+Integer#upto(limit) - Обхожда числата до посоченото число включително.
+
+Enumerable#all?[{|obj| block}] - Подава всеки елемент от колекцията на дадения блок. Връща true,
+ако блокът никога не връща false или nil. Ако не е подаден блок,
+Ruby добавя неявен блок {|obj| obj}.
+
+Integer#pred - Връща число, равно на стойността на числото - 1.
+
+Numeric#zero? - Връща true, ако числото има стойност 0.
+
+Numeric#nonzero? - Връща стойността числото, ако числото не е 0, и nil в противен случай.
+
+Numeric#remainder(numeric) - Връща остатъка при деление на посоченото число.
+
+2. Enumerable#map { |obj| block } вместо Enumerable#each_with_index(*args) { |obj, i| block }, защото Enumerable#map връща
+нов списък, изпълнявайки блока за всеки елемент.
+
+3. if/elsif вместо само if, най-малкото ще си спестим проверката на останалите условия при истина от някое от по-горните условия.
+
+4. Enumerable#each_with_object(obj) { |(*args), memo_obj| ... } - обхожда колекция, подавайки текущия елемент и обекта на блока. Използва се за построяване на
+Hash обекти или за преобразуване на колекция към обект. Не може да се използва с immutable обекти като числа, true или false.
+
+5. Оператор "||=" - присвоява стойност на променлива, ако преди това не е имала никаква стойност.
+
+6.lines вместо each_line, добавяне на chomp
+Вместо slice[0], slice[1], slice[2] използваме name, artist, album, за да станне кода по-разбираем.
+
+7. Вместо song.satisfy?(criteria) използваме criteria.met_by? song, за да избегнем лош coupling между двата класа и за да не знае нашия клас Song за съществуването
+на класовете Criteria, Criterion и т.н.
+
+8. Оператора + вместо метода Array#concat. Array#concat(other_array) добавя елементите на other_array към елементите на дсден списък. В метода adjoin връщаме нов
+списък, който няма елементи, така че има по-голям смисъл да използваме оператора +.
+
+9. Вместо клас един клас CriteriaPart, на който да се подават аргументи два низа с вида на критерия и самия критерий, използваме 3 класа NameCriterion, ArtistCriterion и
+AlbumCriterion, които наследяват класа Criterion. Смисъла е в това, че всеки от тези 3 класа по различен начин интерпретира метода met_by(song), а общото между
+тях са предефинираните методи &, |, !.
+
+10. Добавяме класове Conjunction, Disjunction и Negation, които да ни помогнат за имплементирането на методите &, |, !.
+
+11. Когато използваме многократно един regex шаблон,е хубаво да го изнесем като константа в класа, в който го използваме. (4-та задача: клас Validations)
+
+12. Вместо да повтаряме много код, можем да изнесем повтарящият се код в един метод (4-та задача: добавяме метода )