Решение на Пета задача от Живко Чобанов

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

Към профила на Живко Чобанов

Код

REPOSITORY = 'https://github.com/jivko-chobanov/my-ruby-retrospective.git'
# Поуки 20 бр.
# Задача 1
# 1) Стилови изисквания
# 2) Избягване на въвеждане на променливи - чрез езикови конструкции
# 3) Избягване на if-else - изразяване на функционален стил вместо на процедурен - all? select map
# 4) each_with_object & count
# Задача 2
# 1) Мога да създам методите names,... name,... динамично по масив от атрибути и дори да генерирам този масив автоматично от зададените инстанционнипроменливи (макар че може да доведе до бъг при поява на инстанционна променлива в Song, която не е атрибут на Song)
# 2) Struct е удобно и може да се ползва динамично: class Song < Struct.new(*SongAttributes::NAMES)
# 3) Разпределяне на работата - Collection.parse парсва колекцията до текст на песен, който подава на Song.parse, който си го парсва според атрибутите
# Задача 3
# 1) tree да бъде само dsl за вход, а за работа да се използва оригиналното представяне с класове
# 2) Опростен дизайн за добавяне на информация за син на Expr в Expr при дефиниране на сина - @@classes_by_operation = {}
# 3) Опростен интерфейс за описване на изрази - Number::ZERO, #-@, #*, #+ - така производната на * напр. се описва с dx * y + x * dy
# 4) #build е разпределен между класовете - всеки предава едно ниво надолу
# 5) Binary знае за името на операцията си (@operation) динамично - през името на класа син, използва операцията за да прави изчисления с Fixnum в simplify
# 6) Multiplication и Addition съдържат метод (ако беше инстанционна променлива трябваше да й слагам и рийдър) neutral_element, който може да се ползва за много неща, а в случая чрез него се прави абстракция на #simplify в Binary за събиране и умножение едновременно (умножението само има допълнително опростяване при * 0)
# 7) Binary#simplify ползва sides и много функционално програмиране, което го прави изчистен и почти готов да заработи за sides.size > 2 (макар че ред 51-53 могат да се направят с return Number.new sides[0].arg.send(operation, sides[1].arg), но така се губи абстракцията sides)
# 8) Когато #derive има формула, тогава тя се отделя в #compute_derivative с параметри неизвестните и техните производни (задава правилото за намиране на производна и нищо друго), смятането им и опростяването са в Binary#derive и Unary#derive (ниво на абстракция)
# 9) fetch с блок за връщане на изключение
# Задача 4 (непредадена навреме, commit-нах я в стария й вид)
# 1) Регулярните изрази да са константи, а не методи - компактност
# 2) Динамично създаване на методи във Validations по връзка име на метод - регулярен израз
# 3) За допълнителни проверки, дали текстът съвпада с търсения вид информация, се ползва конструкцията if регулярен израз then допълнителни проверки с извлеченото, връщащи true/false - избягват се допълнителни методи, допълнителни регулярни изрази за нестандартните проверки
# 4) filtered е разбито на нива - първо се казва, че първо се филтрират имейлите и от резултата се филтрират телефоните, на второ ниво се извличат подлежащите на филтриране думи, разбиват се на значещи части те и се пращат на съответните методи за скриване, които единствени знаят за флаговете и ги ползват
# P.S. Поиграх си да направя всички задачи от нулата и ми беше много полезно, макар че отне много време. Научих vim - към 20+ команди ползвам активно, а преди само 5-6. Научих git донякъде, но имам още много. Запалих се и по vim, и по git. Разглеждах чужди решения, но малка част си струваха времето (разбрах за Visitor Design Pattern). Всичко това ми отне около седмица от ваканцията, но си струваше и беше забавно - правих си "космически кораб" :) Добре, че ви спря сървъра и удължихте срока до 30-ти...

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

Живко обнови решението на 29.12.2012 00:06 (преди около 12 години)

+REPOSITORY = 'https://github.com/jivko-chobanov/my-ruby-retrospective.git'

Живко обнови решението на 30.12.2012 15:35 (преди около 12 години)

-REPOSITORY = 'https://github.com/jivko-chobanov/my-ruby-retrospective.git'
+REPOSITORY = 'https://github.com/jivko-chobanov/my-ruby-retrospective.git'
+
+# Поуки 20 бр.
+
+# Задача 1
+# 1) Стилови изисквания
+# 2) Избягване на въвеждане на променливи - чрез езикови конструкции
+# 3) Избягване на if-else - изразяване на функционален стил вместо на процедурен - all? select map
+# 4) each_with_object & count
+
+# Задача 2
+# 1) Мога да създам методите names,... name,... динамично по масив от атрибути и дори да генерирам този масив автоматично от зададените инстанционнипроменливи (макар че може да доведе до бъг при поява на инстанционна променлива в Song, която не е атрибут на Song)
+# 2) Struct е удобно и може да се ползва динамично: class Song < Struct.new(*SongAttributes::NAMES)
+# 3) Разпределяне на работата - Collection.parse парсва колекцията до текст на песен, който подава на Song.parse, който си го парсва според атрибутите
+
+# Задача 3
+# 1) tree да бъде само dsl за вход, а за работа да се използва оригиналното представяне с класове
+# 2) Опростен дизайн за добавяне на информация за син на Expr в Expr при дефиниране на сина - @@classes_by_operation = {}
+# 3) Опростен интерфейс за описване на изрази - Number::ZERO, #-@, #*, #+ - така производната на * напр. се описва с dx * y + x * dy
+# 4) #build е разпределен между класовете - всеки предава едно ниво надолу
+# 5) Binary знае за името на операцията си (@operation) динамично - през името на класа син, използва операцията за да прави изчисления с Fixnum в simplify
+# 6) Multiplication и Addition съдържат метод (ако беше инстанционна променлива трябваше да й слагам и рийдър) neutral_element, който може да се ползва за много неща, а в случая чрез него се прави абстракция на #simplify в Binary за събиране и умножение едновременно (умножението само има допълнително опростяване при * 0)
+# 7) Binary#simplify ползва sides и много функционално програмиране, което го прави изчистен и почти готов да заработи за sides.size > 2 (макар че ред 51-53 могат да се направят с return Number.new sides[0].arg.send(operation, sides[1].arg), но така се губи абстракцията sides)
+# 8) Когато #derive има формула, тогава тя се отделя в #compute_derivative с параметри неизвестните и техните производни (задава правилото за намиране на производна и нищо друго), смятането им и опростяването са в Binary#derive и Unary#derive (ниво на абстракция)
+# 9) fetch с блок за връщане на изключение
+
+# Задача 4 (непредадена навреме, commit-нах я в стария й вид)
+# 1) Регулярните изрази да са константи, а не методи - компактност
+# 2) Динамично създаване на методи във Validations по връзка име на метод - регулярен израз
+# 3) За допълнителни проверки, дали текстът съвпада с търсения вид информация, се ползва конструкцията if регулярен израз then допълнителни проверки с извлеченото, връщащи true/false - избягват се допълнителни методи, допълнителни регулярни изрази за нестандартните проверки
+# 4) filtered е разбито на нива - първо се казва, че първо се филтрират имейлите и от резултата се филтрират телефоните, на второ ниво се извличат подлежащите на филтриране думи, разбиват се на значещи части те и се пращат на съответните методи за скриване, които единствени знаят за флаговете и ги ползват

Живко обнови решението на 30.12.2012 15:43 (преди около 12 години)

REPOSITORY = 'https://github.com/jivko-chobanov/my-ruby-retrospective.git'
# Поуки 20 бр.
# Задача 1
# 1) Стилови изисквания
# 2) Избягване на въвеждане на променливи - чрез езикови конструкции
# 3) Избягване на if-else - изразяване на функционален стил вместо на процедурен - all? select map
# 4) each_with_object & count
# Задача 2
# 1) Мога да създам методите names,... name,... динамично по масив от атрибути и дори да генерирам този масив автоматично от зададените инстанционнипроменливи (макар че може да доведе до бъг при поява на инстанционна променлива в Song, която не е атрибут на Song)
# 2) Struct е удобно и може да се ползва динамично: class Song < Struct.new(*SongAttributes::NAMES)
# 3) Разпределяне на работата - Collection.parse парсва колекцията до текст на песен, който подава на Song.parse, който си го парсва според атрибутите
# Задача 3
# 1) tree да бъде само dsl за вход, а за работа да се използва оригиналното представяне с класове
# 2) Опростен дизайн за добавяне на информация за син на Expr в Expr при дефиниране на сина - @@classes_by_operation = {}
# 3) Опростен интерфейс за описване на изрази - Number::ZERO, #-@, #*, #+ - така производната на * напр. се описва с dx * y + x * dy
# 4) #build е разпределен между класовете - всеки предава едно ниво надолу
# 5) Binary знае за името на операцията си (@operation) динамично - през името на класа син, използва операцията за да прави изчисления с Fixnum в simplify
# 6) Multiplication и Addition съдържат метод (ако беше инстанционна променлива трябваше да й слагам и рийдър) neutral_element, който може да се ползва за много неща, а в случая чрез него се прави абстракция на #simplify в Binary за събиране и умножение едновременно (умножението само има допълнително опростяване при * 0)
# 7) Binary#simplify ползва sides и много функционално програмиране, което го прави изчистен и почти готов да заработи за sides.size > 2 (макар че ред 51-53 могат да се направят с return Number.new sides[0].arg.send(operation, sides[1].arg), но така се губи абстракцията sides)
# 8) Когато #derive има формула, тогава тя се отделя в #compute_derivative с параметри неизвестните и техните производни (задава правилото за намиране на производна и нищо друго), смятането им и опростяването са в Binary#derive и Unary#derive (ниво на абстракция)
# 9) fetch с блок за връщане на изключение
# Задача 4 (непредадена навреме, commit-нах я в стария й вид)
# 1) Регулярните изрази да са константи, а не методи - компактност
# 2) Динамично създаване на методи във Validations по връзка име на метод - регулярен израз
# 3) За допълнителни проверки, дали текстът съвпада с търсения вид информация, се ползва конструкцията if регулярен израз then допълнителни проверки с извлеченото, връщащи true/false - избягват се допълнителни методи, допълнителни регулярни изрази за нестандартните проверки
-# 4) filtered е разбито на нива - първо се казва, че първо се филтрират имейлите и от резултата се филтрират телефоните, на второ ниво се извличат подлежащите на филтриране думи, разбиват се на значещи части те и се пращат на съответните методи за скриване, които единствени знаят за флаговете и ги ползват
+# 4) filtered е разбито на нива - първо се казва, че първо се филтрират имейлите и от резултата се филтрират телефоните, на второ ниво се извличат подлежащите на филтриране думи, разбиват се на значещи части те и се пращат на съответните методи за скриване, които единствени знаят за флаговете и ги ползват
+
+# P.S. Поиграх си да направя всички задачи от нулата и ми беше много полезно, макар че отне много време. Научих vim - към 20+ команди ползвам активно, а преди само 5-6. Научих git донякъде, но имам още много. Запалих се и по vim, и по git. Разглеждах чужди решения, но малка част си струваха времето (разбрах за Visitor Design Pattern). Всичко това ми отне около седмица от ваканцията, но си струваше и беше забавно - правих си "космически кораб" :) Добре, че ви спря сървъра и удължихте срока до 30-ти...