Допустим, есть модуль, скачивающий страницы с некоторого сайта и распарсивающий их.
Так плохо делать, модуль/класс должен делать что то одно. В вашем примере должно быть два класса.
1) Узнать информацию о поставщике;
2) Узнать информацию о лотах закупки;
3) Узнать информацию о аукционе закупки;
4) Узнать информацию о протоколах закупки;
5) Узнать информацию о последней дате изменения состояния закупки.
В вашем примере имеет смысл сделать разные классы для все 1-5 случаев скачивания и парсинга с одинаковым интерфейсом, и используя полиморфизм их вызывать в цикле.
Таким образом вы сделаете главный класс, который оперирует подклассами удовлетворающим Open/Closed principle.
Так же было бы хорошо сделать, чтобы подклассы были слабо связаны друг с другом, т.е. их можно было бы использовать и тестировать независимо.
Как то так с ошибками
class CalculateSomeShit
ACTIONS = %i(
SomeShit1
SomeShit2
SomeShit3
SomeShit4
SomeShit5
)
class SomeShit1
def initialize(context)
@context = context
end
def call
@context[:shit1] = calculate(fetch)
end
private
def fetch
end
def calculate
end
end
class SomeShit2
def initialize(context)
@context = context
end
def call
@context[:shit2] = calculate(fetch(@context[:shit1]))
end
private
def fetch
end
def calculate
end
end
def call
{}.tap do |context|
ACTIONS.each do |action|
context = action.new(context).call
end
end
end
end
Предлагается использовать полиморфизм, чтобы избавиться от сложных условий.
Conditional code clutters methods, makes extraction and reuse harder, and can lead to leaky concerns. Object-oriented languages like Ruby allow developers to avoid conditionals using polymorphism. Rather than using if/else or case/when to create a conditional path for each possible situation, you can implement a method differently in different classes, adding (or reusing) a class for each situation.
— Не думай.
— Если думаешь – не говори.
— Если думаешь и говоришь – не записывай.
— Если думаешь, говоришь и записываешь – не подписывай.
— Если думаешь, говоришь, записываешь, подписываешь – не удивляйся.
Он действительно на столько хорош, что можно его купить и потратить время на интеграцию с git?
Из коробки на сколько я понял, он имеет только консольный клиент, работающий с git.
Так плохо делать, модуль/класс должен делать что то одно. В вашем примере должно быть два класса.
В вашем примере имеет смысл сделать разные классы для все 1-5 случаев скачивания и парсинга с одинаковым интерфейсом, и используя полиморфизм их вызывать в цикле.
Таким образом вы сделаете главный класс, который оперирует подклассами удовлетворающим Open/Closed principle.
Так же было бы хорошо сделать, чтобы подклассы были слабо связаны друг с другом, т.е. их можно было бы использовать и тестировать независимо.
Как то так с ошибками
— Ruby Science
Как же Google, Yandex?
Спасибо.
— MB — мегабайт
— Mbit — мегабит
— Если думаешь – не говори.
— Если думаешь и говоришь – не записывай.
— Если думаешь, говоришь и записываешь – не подписывай.
— Если думаешь, говоришь, записываешь, подписываешь – не удивляйся.
Из коробки на сколько я понял, он имеет только консольный клиент, работающий с git.
Пока на выбор:
* howsmycode.com/
* www.reviewboard.org/
Было бы здорово, если бы кто нибудь посоветовал работающую схему.