Skip to content

Workers#2

Open
cynek wants to merge 14 commits intomasterfrom
workers
Open

Workers#2
cynek wants to merge 14 commits intomasterfrom
workers

Conversation

@cynek
Copy link
Owner

@cynek cynek commented Aug 26, 2013

Передача подключения воркерам

@cynek
Copy link
Owner Author

cynek commented Sep 2, 2013

@take-five @SemenMolokanov @vkuznetsov посмотрите

lib/reactor.rb Outdated

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ох 😔
нужно, чтобы все require-ы в проекте выглядели так:

require 'reactor/dispatcher'

@take-five
Copy link

Говоря кратко - я ни хуя не понял

@vkuznetsov
Copy link

предлагаю делать документацию к классам
https://github.com/lsegal/yard/

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

это что такое?

@take-five
Copy link

+1 к документации

В документации обязательно написать примеры использования. Вообще говоря, написание примеров должно сподвигнуть к рефакторингу.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

FileConnection - соединение файла?
Здесь и имя класса неподходящее и почему то, что делает работу с файлами наследуется от коннекта?

Надо отделить от сервера слой, в котором выполняется конкретная работа.

@cynek
Copy link
Owner Author

cynek commented Sep 5, 2013

upd

lib/reactor.rb Outdated

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Вот опять повсюду это...
Я же писал, что нужно, чтобы require-ы выглядели так: require 'reactor/dispatcher'

@take-five
Copy link

Я вижу over-engineering. Много абстракций непонятного назначения, принцип работы кода неясен, у переменных малоописательные названия.

Попробуй в проектировании идти от интерфейса:

  1. Сначала ты пишешь к классу документацию и много разных примеров его использования
  2. Видя, что твои примеры сложны для понимания, выделяй абстракции, пиши примеры использования абстракций
  3. Видя, что твои интерфейсы удобны, приступай к написанию тестов и кода

Именно тесты помогут создать хороший, понятный дизайн.

@cynek
Copy link
Owner Author

cynek commented Sep 5, 2013

основывался на статье Шмидта 1995 года
https://www.google.ru/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&ved=0CCoQFjAA&url=http%3A%2F%2Fwww.cs.wustl.edu%2F~schmidt%2FPDF%2Freactor-siemens.pdf&ei=fmgoUsGJM4rbtAatjoDoCA&usg=AFQjCNHLIcRPZwBOARYZcxMI9aQn6XMonw&sig2=htXZjXNGlgPvU3rTvqcGQQ&bvm=bv.51773540,d.Yms&cad=rjt
потом понял что коряво выходит, но все переделывать не стал (
обошёлся добавлением в существующую схему интерфейса EventMachine::Connection

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Почему DataHandler знает что-то про epoll?

Copy link
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

это косяк, знаю )
пытался поначалу сделать события Dispatcher'а

Reactor::ACCEPT_EVENT = 1
Reactor::READ_EVENT   = 2
Reactor::WRITE_EVENT  = 4
...

запутался и не реализовал

@take-five
Copy link

Следует привести дизайн в соответствие с принципами [SOLID](http://en.wikipedia.org/wiki/SOLID_(object-oriented_design\))

lib/reactor.rb Outdated
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

unshift для путей загрузки и будет счастье

@cynek
Copy link
Owner Author

cynek commented Sep 10, 2013

совсем забыл - UPD же

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Вместо самостоятельного написания можно было воспользоваться классом Struct:

Manager = Struct.new(:dispatcher, :data_handler_class, :initializer)

Но не в этом дело. А дело в том, что это класс, не выполнящий вообще никакой полезной работы. Это уже код с душком (см. М.Фаулер, "Рефакторинг"). Такой запах называется Middle Man.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Т.е., этот класс занимается исключительно делегированием, вносит дополнительную косвенность, увеличивает сложность и так непростого кода, и сильно затрудняет понимание вообще всего

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

И вдобавок имеет невыразительное название 8)

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Идея была Service Locator

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ну это же совершенно не ясно из кода

@take-five
Copy link

У тебя сейчас получилась сложная архитектура с кучей делегирования, хотя, как мне кажется, можно использовать особенности ruby (а именно блоки), и тогда реактор может выглядеть как-то так (прошу заметить, это не дизайн-проект реактора, а лишь набросок, эскиз):

reactor = Reactor::Dispatcher.new
reactor.read(socket) { |data| puts data }
reactor.write(socket) { |data| socket.write(data) }
reactor.error(socket) { whatever }

reactor.run

Обрати внимание, что при таком подходе не нужны гроздья классов, в которые делегаторы будут делегировать делегирование полномочий.

@cynek
Copy link
Owner Author

cynek commented Sep 10, 2013

reactor = Reactor::Dispatcher.new
reactor.read(socket) { |data| puts data }
reactor.write(socket) { |data| socket.write(data) }
reactor.error(socket) { whatever }

reactor.run

в этой схеме не учитывается прием подключений, надо подумать кто их обрабатывать будет

@vkuznetsov
Copy link

тут теперь конфликты надо порешать )))

@cynek
Copy link
Owner Author

cynek commented Jul 20, 2018

ага, ждите коммит. амазон поседеет от страха перед нашим продуктом, ну или от старости )

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants