Как правило, вам не понравится опыт разработки, потому что у вас есть три команды, каждая из которых будет пытаться установить свои системы. Каждый будет развиваться немного по-разному, потому что они найдут различные обходные пути для множества возникающих проблем.
Вы должны найти способ для пространства имен своих триггеров и классов: выберите префикс для каждой команды, чтобы отделить их код.
Используйте меньше больших классов: при программировании на традиционных ООП (например, Java) мне нравятся маленькие значимые классы. Но в Salesforce есть большие накладные расходы на управление классом. Плюс есть только одна большая папка для всех классов (гадость). Итак, теперь я создаю файлы большего размера. В каждый файл я включаю тестовый код. Я поместил тестовый код триггера в класс (например, контроллер), который работает с тем же объектом.
Чтобы отслеживать изменения и выполнять проверки кода, вы можете использовать эту технику:
Используйте Force IDE в сочетании с системой контроля версий, такой как CVS, SVN, Mercurial или Git.
Настройте основной рабочий проект на включение всего (щелкните правой кнопкой мыши на проекте ... Force.com ... свойства проекта. В диалоговом окне настроек разверните Force.com и выберите «Содержание проекта». Нажмите «Добавить / удалить и добавить все»). Я не развернул изменения профиля из IDE обратно в производство таким способом. Делать это не может быть хорошей идеей. Но я отодвигаю апекс-классы, триггеры и страницы. Обратный путь при каждом сохранении медленный!
Теперь используйте систему контроля версий для документирования изменений, а также для сравнения версий.
Развертывание из песочницы в производство: я отказался от использования инструментов развертывания пользовательского интерфейса. Они работают для простых вещей, но я обнаружил, что они не могут обрабатывать более сложные изменения (новые объекты, вкладки, приложения, триггеры, классы, страницы, макеты). Я перемещаю изменения по частям из песочницы в производство. С тремя командами это означает, что вам может понадобиться центральная команда, которая развертывает окончательные изменения?
Есть много способов разделения ваших систем, включая типы записей. Для этого требуется код, который либо содержит жестко закодированный SF Id, либо использует строку для выполнения поиска. В обоих случаях вы не хотите распространять эти строки или идентификаторы по всему коду. Подумайте о кошмаре, когда вам нужно провести рефакторинг. Вместо этого создайте класс Globals и поместите здесь все свои жестко закодированные имена и идентификаторы. По крайней мере, вы можете выполнить более разумный поиск и заменить.
Я люблю SF. Некоторые вещи очень легко сделать. Но некоторые задачи разработки, похоже, занимают очень много времени. Удачи