LINUX.ORG.RU
ФорумTalks

[*турбирование шаблонов проектирования]Ынтырпрайзец


0

1

Почитал код чувака, который когда-то наш враппер для дин. загрузки библиотек критиковал всяко... Веско, но не в тему. Мол и не кроссплатформенный он (угу, в ТЗ черным по белому ОпенСуся 10.3... Ни макосэкса, ни какого другого оффтопика...), интерфейс dlopen ему нестандартизован (интересно, что он имел в виду?) Задача была простая, как трусы по рупь двадцать - грузить по выбору из конфига библиотеки, отличающиеся только внутренностями (интерфейс одинаковый, имена разные). В общем, гуру стандартизации и магистр рефакторинга вместо простого враппера намутил «фабрику врапперов», каждый из которых вынес в дополнительную либу, которые тоже грузятся динамически... Теперь сервак грузит сначала врапперы, потом собственно библиотеки... Может у них там эта хрень называется «применением шаблонов проектирования», а у нас - мастурбацией. («Кроссплатформенность» - как же без нее - свелась к разбросанным по коду #ifdef ... #else ... #endif.)

А вы часто сталкиваетесь с последовательным доведением какого-то «модного тренда» до маразма? И с чуваками, обчитавшимися модных книжек и потому исполненными творческого зуда в руцех, которым постоянно хочется что-то несломанное починить (... голову и руки ломом, чтоб не хотелось)

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

Manhunt ★★★★★ ()

Над буйными кодерами всегда должен стоять суровый начальник, который будет бить по рукам и голове палкой, а по кошельку - зарплатой, чтобы решали поставленную задачу, а не онанировали на инновационность методов её решения.

Terrens ()
Ответ на: комментарий от Manhunt

От какой платформы? Библиотеки отличаются только реализацией (одной для работы нужен шлюз к источнику данных, второй не нужен - умеет напрямую). Платформа у заказчика одна - Open Suse 10.3 (на тот момент, как сейчас не знаю - очень консервативный заказчик).

slackwarrior ★★★★★ ()

> интерфейс dlopen ему нестандартизован (интересно, что он имел в виду?)

Хм. POSIX.1-2001 describes dlclose(), dlerror(), dlopen(), and dlsym().

Ни макосэкса, ни какого другого оффтопика...)


MacOSX - сертифицированных Unix. Имхо, dlopen там должен быть. Возможно, вы в своем быдлокоде использовали гнутые экстеншены?

Manhunt ★★★★★ ()
Ответ на: комментарий от slackwarrior

> От какой платформы? Библиотеки отличаются только реализацией

Библиотеки различаются способом загрузки в зависимости от ОС. Под Unix - он один, под вендой - другой.

Платформа у заказчика одна - Open Suse 10.3 (на тот момент, как сейчас не знаю - очень консервативный заказчик).


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

Manhunt ★★★★★ ()
Ответ на: комментарий от Manhunt

По сравнению с нашим кодом, разница только в навернутых «шаблонах проектирования». Вызовы dl*() не отличаются даже флагами. Чего там можно было такого придумать... «А вот подижь ты!» (с) ИМХО, чистой воды карго-культизм.

slackwarrior ★★★★★ ()

> Теперь сервак грузит сначала врапперы, потом собственно библиотеки... Может у них там эта хрень называется «применением шаблонов проектирования», а у нас - мастурбацией.

Вас это напрягает? Давайте поговорим об этом? Вы часто мастурбируете на процесс загрузки плагинов? Может быть, по результатам профилирования стало ясно, что создание загрузчика - это узкое место в плане производительности?

Manhunt ★★★★★ ()
Ответ на: комментарий от Manhunt

Библиотеки различаются способом загрузки в зависимости от ОС.

Капитан, вы сегодня так познавательны ;)

Это уже зависит от ваших бизнес-целей.

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

slackwarrior ★★★★★ ()
Ответ на: комментарий от slackwarrior

> Заикнись заказчик про поддержку других платформ, ему бы их включили в счет. А так, чувак ему это все подарил...

Чувак подарил _вам_ возможность малой кровью кроссплатформенность реализовать. Потому что с фабрика избавила весь оставшийся код от знания того, какой именно загрузчик используется. Теперь - если нужно будет добавить новые загрузчики - в остальном коде ни строчки менять не придется. Ы?

Manhunt ★★★★★ ()

А вы часто сталкиваетесь с последовательным доведением какого-то «модного тренда» до маразма? И с чуваками, обчитавшимися модных книжек и потому исполненными творческого зуда в руцех,


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

Karapuz ★★★★★ ()
Ответ на: комментарий от yaws

> одной фабрикой в одном модуле сыт не будешь

Зависит от задачи.

Неправильно он сделал. А точнее - наиндусил.


Какое решение предпочел бы ты?

Manhunt ★★★★★ ()
Ответ на: комментарий от Manhunt

Извините, но не уперлась там фабрика. Библиотеки заменяют друг друга и единовременно не используются (нет такой ситуации). От фабрики там, собственно, только название - два повторяюшихся куска кода, с разными идентификаторами - это офигеть какое обобщение. Лучше б натурально обобщил платформы, вместо «плетенки» из директив условной компиляции. А если надо будет новые загрузчики, подозреваю, будет еще один дубль под другим названием. Экстенсивное размножение кода, который кому-то придется... выкинуть нафиг, чтоб никто это не увидел.

slackwarrior ★★★★★ ()
Ответ на: комментарий от Bioreactor

Это обобщение. Когда номер версии не особенно важен, например.

slackwarrior ★★★★★ ()
Ответ на: комментарий от Manhunt

Результаты профилирования возникают, когда есть задача по оптимизации узкого места. Загрузка библиотек производится один раз при старте - время старта: а) для задачи не критично б) двойная загрузка сначала библиотки-врапперы, и только потом собственно библиотеки - это офигеть какая оптимизация по скорости. По моему мнению, этот кусок кода не стоил бы внимания, если б некто с зудом в ладошках не зачесал его под барокко^Wрококо, следуя своим, а не проектным, представлениям о прекрасном.

slackwarrior ★★★★★ ()

А я себя ловлю, наоборот, на том, что креативное шило в заднице невовремя поворачивается. Вот такая штука: делаешь, чтобы что-то вчерне работало, и оно работает. Одна проблема — некоторые классы очень сильно завязаны друг на друга (по-быстрому по-другому сделать было нельзя, были интересные баги), а после написания работающего конфига SAP'а можно не бояться. После написания же правильно работающего конфига можно не бояться SAP'а и оракла вместе взятых.

Но зато — работает же!

А потом коллега задает мне вопрос: а как те негры, которые это внедрять и допиливать на местах должны, вот это вот самое вот осилят? Если ты сам с первого раза без ошибок не можешь сконфигурить?

А я ему и отвечаю: ой, бля. Ты все-таки прав.

Бегом, значится, за рефакторинг, потом упростилово, еще один рефакторинг... И так, пока оно совсем просто не станет. А потом документацию, внутреннюю и внешнюю.

shimon ★★★★★ ()

Последнее время все чаще и чаще. Самое ржачное когда какой-нибудь пыхер начинает вещать про «Надо расти. Мы должны реализовывать задачи с применением дезигн-паттернов, мы должны совершенствоваться».

iBliss ()
Ответ на: комментарий от slackwarrior

> Загрузка библиотек производится один раз при старте - время старта:

Я не очень понимаю, откуда там взялась двойная «загрузка». Но пусть взялась .... И чего ты так напрягаешься из-за нее?

Извините, но не уперлась там фабрика. Библиотеки заменяют друг друга и единовременно не используются (нет такой ситуации).


В огороде бузина, а в киеве - дядька. Фабрика скрывает знание о том, какой код используется для загрузки билиотеки. Причем тут одновременность использования библиотек?

Лучше б натурально обобщил платформы, вместо «плетенки» из директив условной компиляции.


«Обобщение» - это интерфейс загрузчика, который порождает фабрика. Директивы условной компиляции нужны в теле фабрики чтобы выбрать подходящий для данной платформы загрузчик. Ну и для того, чтобы не компилировать платформозависимый код загрузчиков под несовместимые платформы.

Manhunt ★★★★★ ()
Ответ на: комментарий от slackwarrior

> проектным представлениям о прекрасном

У вас архитектор есть на проекте? Вот он пусть и решает, что прекрасно, а что не очень. И где нужны фабрики, а где - нет.

Manhunt ★★★★★ ()
Ответ на: комментарий от Manhunt

>Я не очень понимаю, откуда там взялась двойная «загрузка». Но пусть взялась .... И чего ты так напрягаешься из-за нее?

Не очень понимаете, потому что, вероятно, невнимательно читали. Сначала грузятся дополнительные библиотеки «врапперы». А потом, в них, в каждом в отдельности - в общем-то, взаимозаменяемые библиотеки с одинаковым функционалом... Такой подход (исходя именно из его кода) требует по мимо прочего создания дополнительной библиотеки-враппера на каждый чих - а именно, промежуточной .so-шки, для каждого варианта библиотеки, несущей полезную нагрузку... Прямой путь wrapper->library.so превратился в wrapperFactory->wrapper.so->library.so Что мне непонятно - чего вы так активно защищаете этот подход? Любите умножать сущности без нужды?

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

Нда? «Вы мне будете рассказывать для чего таки нужны директивы компиляции» (с) В разумных пределах и с грамотным разведением платфом по модулям/единицам компиляции/классам - кто бы спорил. А то что «улучшенный» код выглядит как каша из директив компиляции - это ничего? Целая папка для абстрагирования особенностей систем projectName/system для чего существует? Взялся делать - наверное делай до конца. «Оптимизация скобочек», например, тоже конек того чувака. С момента передачи проекта в продакшн, половина лога SVN, его милостью, пестрит коммитами про изменения пробелов и отступов (а в комментах он пишет гордое иноземное словечко «рефакторинг»). Вся эта ИБД со стороны выглядит забавно в первый раз. Потом начинает малость раздражать - когда проект возвращается для впиливания новых хотелок заказчиков, которые хотят такое же, только с дополнительными фишками... а там внутри - «перламутровые врапперы», которые точно не нужны.

slackwarrior ★★★★★ ()
Ответ на: комментарий от Manhunt

Архитектору нужен был враппер. Одна штука. Потом проект передали на поддержку... А заказчик не дремал - ему новые фишки приснились, и денежка лишняя завелась - и вот, к нам приезжает «наша» кодовая база, а мы ее местами не узнаем. (Никаких ошибок эти конкретные телодвижения вокруг врапперов не исправили, ничего по скорости/памяти не оптимизировали - как раз наоборот. Было 2 библиотеки, стало 4! Пусть две из них - лишь обертки для первых двух, но тут уж или трусы надеть, или крестик снять. Или мы обобщаем архитектуру - и почему-то у нас размножаются дополнительные библиотеки (интересная такая оптимизация - добавляем новую версию интерфейса - пожалуйте две новых .so-шки). Причем относится это все к одной платформе. Ладно б загрузчики были разные только между платформами... Или не нужно там такое обобщение и фабрика отдыхает. (А если нужна именно фабрика - то, позвольте угадаю... наверное, не в таком виде.)) Только умножили количество прослоек, там, где без этого можно было безболезненно обойтись, но... не вышло. Потому что религиозный фанатизм не позволил. Эффект нового молотка - это не только то, что человеку с молотком все проблемы кажутся гвоздями. Это еще немножко, когда окружающим ему хочется забить гвоздь в голову через обе ладошки.)

slackwarrior ★★★★★ ()
Ответ на: комментарий от Manhunt

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

Наступите, пожалуйста, на горло внутреннему капитану. Код загрузки одинаковый: dlopen()/dlsym().

«Обобщение» - это интерфейс загрузчика

Веско, но тоже мимо. Интерфейс к библиотечным функциям тоже одинаковый. Два варианта библиотеки существуют лишь на одной платформе - OpenSuse 10.3. Для чего нужны джва загрузчика одной платформе? (Под оффтопик существует один вариант библиотеки, интерфейс которого совпадает с линуксовыми (а механика - с одним из них, ей тоже требуется шлюз). На разнице в между dlopen()/LoadLibrary() кончаются кроссплатформенные заморочки... Это обобщению не подверглось никак - директивы компиляции раскиданы по коду «одноименного» загрузчика из линукса, вместо изоляции в отведенной под эти дела подпапке system) Итого: загрузчики реализованы не для платформ, а для версий библиотеки на одной платформе.

slackwarrior ★★★★★ ()
Ответ на: комментарий от Manhunt

>Какое решение предпочел бы ты?
В конкретном случае ТС все же предпочтительнее работать в текущих идиомах проекта. Проект, как понимаю, велик, и вводить доп. сущности (вроде словаря паттернов) надо бы, лишь приняв генеральное решение о перепроектировании (короче, рефакторинга под паттерны) системы. А такого решения, как понимаю, не было.

yaws ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.