avva: (Default)
[personal profile] avva
Играюсь с исходниками Мозиллы (Firebird).

Какое ужасно запутанное, сложное дерево, сам чёрт голову сломит. Сгрузил самый свежий код из CVS, построил debug-версию. Запускается. Захотел сделать так, чтобы оно пользовалось не моей директорией профиля $HOME/.phoenix, а какой-нибудь другой, скажем, $HOME/.phoenix-devel . Довольно скромное пожелание, правда? Почти час провозился, пока заставил его. Главное, нашёл код, который открывает или создаёт директорию профиля. В Юниксе он берёт $HOME и добавляет к нему DEFAULT_PRODUCT_DIR, который устанавливается в MOZ_USER_DIR, который всегда ".mozilla", и в Firebird тоже. Но чёрт побери, оно ж использует директорию .phoenix всё-таки, и всё там создаёт/редактирует. Я туда, сюда, захожу в gdb, отлавливаю вызовы этой функции — ну да, исправно вызывается много раз и всем говорит "$HOME/.mozilla", а используется тем не менее .phoenix. Что за чёрт? Ну хорошо, делаю глобальный поиск ".phoenix" по всему дереву, ничего интересного не нахожу. Делаю поиск по "phoenix", тоже ничего интересного не нахожу. Мистика. Что он его, по буквам собирает?

Тут я заметил, что директорию $HOME/.mozilla он-таки исправно создаёт при каждом запуске, если я её удаляю. Но всё равно не использует, а испольует .phoenix. Я разозлился окончательно, удалил .phoenix, чтобы заставить его создать, запустил под gdb, и поставил breakpoint на mkdir(2). Вот это не обойдёшь, сволочь. И поймал-таки момент создания, проследил stack trace, и что оказывается? Это идёт от другой функции GetProductDirectory, в совершенно другом месте, классе, файле и модуле, но почти точной копии той, первой, которая, видимо, устарела (но почему вызывается двадцать раз во время работы?). Эта фунцкия, однако, не вставляет зафигаченное в compile-time значение ".mozilla", а добавляет к $HOME значение mProductDir, а его откуда берёт? А вот откуда:

mProductDir.Assign(NS_LITERAL_CSTRING(".") + aProductName);
ToLowerCase(mProductDir);


Естественно, aProductName в совсем другом месте определяется как "Phoenix", в результате выходит .Phoenix, а после вызова ToLowerCase — искомый .phoenix. Неудивительно, что я не смог это глобальным грепом найти!

Извращенцы чёртовы.


Главное, у них постоянно такое. Куча кода повторяется два раза, с какими-то мелкими изменениями, и поди разбери, какая из двух версий или какой из двух классов "настоящий", учитывая ещё, что оба компилируются и иногда оба вызываются во время работы программы, только один из них — "по историческим причинам". Необходима радикальная чистка авгиевых конюшен. And don't get me started on their build process.

Date: 2004-01-10 04:01 pm (UTC)
From: [identity profile] drakkh.livejournal.com
просто рефакторинг должен делать один человек и опубликовать результаты. а то, что остальным потом придется разбираться с его изменениями - неизбежно. но в долгосрочной перспективе это должно иметь смысл, как и наличие человека, который знает продукт в целом и может координировать процесс разработки, вынося общие вещи на уровень библиотек и совместно используемых модулей.

Date: 2004-01-10 04:11 pm (UTC)
From: [identity profile] zigmar.livejournal.com
Да, но я не знаю насколько это реально (если вообще) сказать нескольким сотням (?) девелоперов "стоп" и остановить ведь девелопмент на пару месяцев пока кто-то будет делать рефакторинг? Напрашивается вопрос - можно-ли делать рефакторинг парралельно с работой другимих програмеров? Я сомневаюсь. По-моему merge от такого загнется ;) А еще и CVS - например переименовать файл, или вычленить модуль в отдельную деректорию - это целая эпопея. ИМХО, в большенсве случаев просто предпочтут обойтись без этого. Вообщем, мрак, ИМХО...

Date: 2004-01-10 08:13 pm (UTC)
From: [identity profile] meshko.livejournal.com
У меня диплом был такой. Система, которая помогает делать рефакторинг. Типа если ты меняешь интерфейс какой-то библиотеки в большом проекте, то ты на специальном языке их описываешь и потом человек, который хочет перейти на новую версию твоей библиотеки, может автоматически это самое преобразование своего кода запустить.
Единственный реальный результат моей работы, которым я могу поделиться: сделать это правильно сложно :)

Date: 2004-01-11 10:50 am (UTC)
From: [identity profile] zigmar.livejournal.com
sounds interesting :)
Кстати, ты небось для c++ делал, да? Я слышал что задачи автоматического рефакторинга в Жабе решаются на порядок легче...

Date: 2004-01-11 02:44 pm (UTC)
From: [identity profile] meshko.livejournal.com
Нет, я как раз в Яве и делал, но там практически ничего толком сделано не было. Ява для это действительно, наверное, лучше -- там мощные механизмы для reflection.
Но хватит об этом, мне грустно об этом вспоминать :)

December 2025

S M T W T F S
  123 4 56
78 9 10 11 1213
1415 1617181920
21 22 23 24 2526 27
2829 30 31   

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Jan. 2nd, 2026 03:44 am
Powered by Dreamwidth Studios