Pull to refresh
11
0.5
Send message

Насколько помню, там закрылась контора, не пережив крах печатных СМИ ..

Помнится, было модно пихать бизнес-логику в хранимки БД.. там реально ещё тот треш и 6 тысяч строк - вполне реальный объем хранимки в таком разе.. как это тестировать?

Опыт превращения кровавого энтерпрайза в "чистый код", с удалением разного рода Фабрик, провайдеров, хелперов провадеров и прочих прокладок. О скоростях выборки из БД речи не было, там все было почти чисто..

Конешно, своим же пакетом а-ля Yii_Db, да в этой части был ООП, но .. местами. ;). Код с т.з. функциональности один и тот же. Автозагрузка классов .. 5 или 6. Диспетчер - рекурсивный, позволял наращивать структуру "вверх" произвольно: ... - модуль - контроллер, в т.ч. после себя запускать те же фрейворки для продолжения роутинга.

Вот насчет production рекомендаций - уже не помню. Помню что ещё делал аналог на Зенде 1.11 кажется, но он делался отдельно и его цифирек уже не помню. Разница с Yii не принципиальная, порядок тот же.

opcahce включен в этих цифирьках.

Ну .. там же не так сложно накатать моккер для транзакций с откатом или приемом .. А для Монго писал подобный моккер для тех же самых целей. Там нет ничего сложного

// MongoCollectable is an object that implements FindOne and Find.
type MongoCollectable interface {
	Find(context.Context, interface{}, ...*options.FindOptions) (*mongo.Cursor, error)
}

Тут иной прикол.. то, что приведено в статье и есть тот самый "чистый код" как его описал дядюшка Боб. а вот то из чего он сделан, ни разу не "чистый код", а "кровавый энтерпрайз" двоешников. Всё ровно наоборот, что автор статьи и показывает: и шустрее работает и доработать .. ПРОЩЕ. Читай "сопровождать".

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

Когда Кнут это говорил, не было ни ООП ни "чистой архитектуры".. он говорил совсем о другом. Но .. "Цитатам в интернете народ верит легко" (с) В.И. Ульянов (Ленин). :)

Был опыт, рефакторил. Товарный агрегатор на Zend 1.8:

было: 32 мегабайта на запрос, 8-10 секунд отклик. БД товаров около 1млн записей в основной товарной таблице. Просто это было "давно"..

стало: 2.5 мегабайта на запрос, 127 запросов в секунду. Железо то же самое, БД стала побольше за время рефакторинга. Плюсом попутно сайт дополнялся новыми фишками.

Ща, нам с Вами наминусуют, коллега. ;)

не совсем. Точнее, конкретно тут экономим, т.к. можем упихать весь набор фигур в банальный массив. Для классов, память будет выделяться в куче, что есть доп. затраты как на CPU, так и на место в ОЗУ.. тут - "чистая экономия". Такой пример просто..

Необязательно "в каждом". принцип DRY требует выделения такого switch в функцию, как только у него больше одного места применения. Но! Она перестает быть виртуальной, и соответственно "экономит" 2 уровня косвенности, что и есть "главный тормоз" в примере статьи.

Как правило, хорошо написанный код, и чист и быстр и жрет мало и сопровождается "на раз" .. просто такое редко, т.к. часто на вопрос сроков слышим ответ: "вчера!" :)

Это типичная отговорка авторов "кровавых энтерпрайзов".. Как правило они тупо не умеют в "хайлоад", да и вообще уже несколько раз слышал "программист не должен смотреть на эффективность кода".

Не бывает "сложного" с т.з. "бизнеса" кода, т.к. бизнес практически везде один и тот же. Просто поверьте моим 40+ лет в разработке. ;)

п.с. Не уместное сравнение. Правила ПДД - это техника безопасности, которая написана кровью людей. Бизнес и энтерпрайз с "правилами" - это о другом.

Впрочем .. сами по себе правила чистого кода - ни есть ни добро ни зло. Это всё те же рекомендации (Карл!) всё того же модульного программирования, начиная с книжек Дейкстры и Вирта. А вот то, как их сейчас навязывают (Карл!) новичкам, то зовется иначе:

Заставь дурака Богу молиться, он и пол пробьет и лоб расшибет. Статья как раз про это.

Делал подобные исследования в свое время, но для PHP7.4. Цифирьки "на память":

полноценное оформление "сайта" с одной страничкой "Hello world" но вытаскиваемой из БД MariaDb 10.1 из таблички в три поля и 1000 записей. Core2duo 2ггц, 1Гб ОЗУ (живой по сию, памяти столько же).

  1. Laravel -- около 70 запросов в секунду. Но тут возможно оплошал, т.к. это было мое единственное применение фреймворка для знакомства. После чего сказал "нунафиг" и забросил;

  2. Yii 2 -- около 190 запросов в секунду;

  3. ussr.monster -- делал под этот сайт (заброшен) микрофреймворк на 7.4 без ООП, как раз в стиле переведенной статьи. 2500 запросов в секунду при 3.5 кб памяти на запрос.

В целом, спасибо за перевод, очень наглядно.

После слов "Карл знал пароль от ящика Клары и читал ее почту по её же просьбе" далее можно не читать. Хотя .. в жизни далеко не редкость. Начальник, который часто отсутствует на работе (дачу чинит к примеру) часто просит кого-то из подчиненных его "заместить без уведомления старших" .. встречал и не раз. В части безопасников, кмк, прокол такого плана: "сотрудника нет в отделе (не отбит на входе системой), но письма ходят".. это как? Не панацея против фантазеров, но на первом этапе помогало.

Код было сложно тестировать из-за зависимости от слоя доступа к данным. Последний сложно мокать в тестах. Можно замокать работу Kafka или Redis, а вот с транзакциями баз данных это уже проблематично.

В чем была сложность тестирования слоя представления данных? go-sqlmock кмк, вполне годный для этой цели пакет. Мне он показался несколько избыточным, реализовал для себя вот такой интерфейс, т.к. работаем с sqlx пакетом:

// Sqlable -- для реализации оберток базовых sql, sqlx функций ExecContext(), GetContext(), SelectContext() @see internal/tests/mock_data.go
type Sqlable interface {
	// ExecContext -- имитация sql.ExecContext()!  @see internal/tests/mock_data.go: возвращает поле .RetExec
	ExecContext(ctx context.Context, query string, args ...any) (sql.Result, error)
	// SelectContext -- имитация sqlx.SelectContext()! @see internal/tests/mock_data.go: возвращает поле .RetSelect
	SelectContext(ctx context.Context, dest any, query string, args ...interface{}) error
	// GetContext -- имитация sqlx.GetContext()! @see internal/tests/mock_data.go: возвращает поле .RetGet
	GetContext(ctx context.Context, dest any, query string, args ...interface{}) error
}

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

Реализация проверяет: а) совпадение набора параметров тексту запроса; б) текст запроса его регекспу в тесте; в) тип возвращаемого результата и данные из блока SELECT, если там нет .* Возвращаемые наборы - слайсы, позволяют мокать больше одного запроса в тестируемой функции работы с набором.

Можно расширить на контроль корректности транзакций при желании, пока не было нужды в этом. Интерфейсный подход в GO тем и замечателен, что позволяет вытворять вот такие шутки. ;)

Мне лень цитировать царя о том, кто есть "русский", нагуглите самостоятельно. Кто тут ратует "за", а кто "против" независимости страны, каждый способен прочесть сам и сделать свои выводы. Для многих лозунг "где лучше кормят, там и Родина" не пуст.

Мне больше нравится это:

-"Россия, помоги!"

-"чего шумишь? Ты и есть Россия"

А прикольно сколько отминусовало в карму - тут оказывается противников развивать импортозамещение просто большинство, однако. :( Не ожидал, что хабросообщество настолько русофобское, извиняйте. Можете ещё накидать минусов в карму. Свои выводы уже сделал. :(

Мне кажется, что Вы путаете гвозди и стратегические направления для страны. Перефразирую Ваш пример, чтобы было нагляднее:

Вы живете в деревне плотников, а деревня кузнецов снабжает вам гвоздями но не оружием. К Вам регулярно наведывается Вася Пупкин и Ко с мечами и забирает ваши столы забесплатно. Ему так удобнее.

Так и будете покупать гвозди?

Молодцы, что можно сказать. Стырили, сами додумались до того же самого .. в общем-то пофиг. Собаки лают, караван идет. Когда в РФ-ии начнут понимать, что весь Путь надо пройти самим и с самого начала, а не рассказывать сказки про "скудость рынка"? Дорогу осилит идущий.

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

Information

Rating
2,206-th
Registered
Activity