В процессе создания программного продукта наша группа разработчиков дошла до точки, когда нужно наконец-то исправлять накопившиеся за долгие годы написания глупого кода ошибки :lol:
не, не так.
Мы тут программу пишем: Java + Eclipse + CVS
а они там её продают по лицензиям
И по сему поводу есть два вопроса:
1. Хотелось бы иметь одну стабильную версию и другую, над которой можно работать.
Стабильной версии по умолчанию быть не может, поскольку в программу вливаются постоянно новшества, модулизировать которые в большинстве случаев не представляется возможным.
Для достижения стабильности руководством проэкта было предложено следующее:
в какой-то момент программа разделяется на две "ветки",
новые куски кода идут только в одну из них,
а исправление ошибок (bugfixing) идёт в обе.
Таким образом работа над проэктом не замирает, но через какое-то время в "замороженной" ветке достигается стабильность.
Я слышал, что в CVS есть возможность создавать "branches" и судя по названию это именно то, что нужно, но могу ведь и ошибаться.
потому вопросы:
1.1. Правильно я понимаю суть "branches" в CVS ? Если нет - в какую сторону смотреть?
1.2. Существует ли автоматизированная возможность вносить изменения (bugfixing) одновременно в обе ветки, или же прийдётся каждый раз вручную менять обе ветки?
1.3. Где об этом можно почитать детальнее (по каким словам искать) ?
2. Программа, как я уже упомянул выше, на продажу. С различными лицензиями и ограничениями, связанными с этим.
Как правильно реализовать различный уровень доступа к возможностям программы, в зависимости от лицензии (по сути - колличества денег) ?
Я вижу такие варианты:
2.1. Повсюду в программе повставлять if-then-else (меня просто воротит от мысли о том, как "красиво" после этого будет выглядеть код)
2.2. ВырезАть "с мясом" куски программы, не подлежащие лицензии ещё в процессе компиляции.
2.3. А может CVS в этом тоже может помочь?..
Может кто-то знает варианты получше?
Примечание: Программа может распространяться с веб-сервера (где происходит checkout последней стабильной версии с CVS и можно "вЫрезать" не оговорённые в лицензии куски кода до компиляции) или же отсылаться по емейлу или на CD (собственно всё равно берётся с веб-сервера).
2.1. Преимущество if-then-else в том, что стоит пользователю приобрести лицензию более высокого уровня, как он тут же получит новую функциональность и ему не прийдётся скачивать новую версию самой программы (но программа не большая по обьёму и вряд ли это будет так уж существенно, кроме того весьма вероятно, что в новой версии будут присутствовать уже новые полезные фичи).
Недостаток, как я уже упомянул выше - некрасивый код и связанное с этим увеличение риска логических ошибок в программе.
2.2. Преимущество "вырезания" в том, что лицензию программы сломать будет невозможно, поскольку дополнительной функциональности в программе не будет в принципи, а так же, при правильном подходе, можно получить более красивый код и большую надёжность реализации этих самых различных версий.
Вот только тут есть один бооольшой Недостаток: никто из нас понятия не имеет, как это реализовать на практике

Мною был предложен следующий метод:
В код программы в виде комментариев вставляются метки/тэги, которые выглядят приблизительно так:
[syntax:2a67aedffb="java"]menu.add(new JMenuItem("something"));
/* begin not for all */
menu.add(new JMenuItem("additional"));
/* end not for all */
[/syntax:2a67aedffb]
По этим меткам скрипт на сервере (Perl/PHP, да хоть та же Java) при помощи регулярных выражений вырезает внутренний кусок, после чего код компилируется, пакуется в JAR и проганяется через uglifier.
И это работает! НО ..
Синтаксические ошибки внутри комментариев невозможно отловить на стадии компиляции программы (в процессе её разработки в IDE), максимум, что можно делать, - читать логи скрипта на сервере.
Как результат, - неправильное написание метки приводит к семантической ошибке, которую весьма просто можно и не заметить.
По большому счёту, необходим аналог такого понятия, как pragma в C++
[syntax:2a67aedffb="cpp"]// #define not_for_all_version
#define standart_version
// menu.add(new JMenuItem("something"));
#ifdef not_for_all_version
// menu.add(new JMenuItem("additional"));
#endif[/syntax:2a67aedffb]
Но Java прагмы не поддерживает, насколько мне известно.
Потому вопросы:
2.1. Существуют ли стандартные решения данной проблемы в Java?
2.2. Если нет, - может кому известны "third part" программы/библиотеки для решения такого рода задач?
2.3. Знает ли кто-нибудь общие пути решения, ведь наша группа - далеко не первые, кто сталкнулись с такой ситуацией ?
Спасибо всем, кто дочитал это сообщение до конца
и надеюсь на вашу помощь.
Заранее благодарен,
Олег.