[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"question-jira-kakie-est-best-practices-pri-razrabotke-dlya-jira":3},{"id":4,"slug":5,"topicId":6,"topicSlug":7,"topicName":8,"topicEmoji":9,"question":10,"answer":11,"codeLang":12,"codeSrc":12,"important":12,"commonMistakes":12,"modernUsage":12,"difficulty":13,"tags":14,"related":18,"progress":19,"seo":20},1071,"kakie-est-best-practices-pri-razrabotke-dlya-jira",27,"jira","Jira","📋","Какие есть best practices при разработке для Jira?","Best practices при разработке для Jira — набор рекомендаций по производительности, безопасности, UX и обратной совместимости, применимых к обеим платформам.\n\n### Производительность\n\n```java\n\u002F\u002F ПЛОХО — загрузка всех задач проекта в память\nCollection\u003CLong> allIssueIds = issueManager.getIssueIdsForProject(project.getId());\n\u002F\u002F Может быть 100K+ задач!\n\n\u002F\u002F ХОРОШО — пагинация + ленивая загрузка\nString jql = \"project = \" + projectKey + \" ORDER BY created DESC\";\nQuery query = jqlQueryParser.parseQuery(jql);\nPagerFilter pager = new PagerFilter(page * pageSize, pageSize);\nSearchResults results = searchService.search(user, query, pager);\n```\n\n### Безопасность\n\n```java\n\u002F\u002F ПЛОХО — SQL injection в AO\nao.find(TaskConfig.class,\n        Query.select().where(\"PROJECT_KEY = '\" + projectKey + \"'\"));\n\n\u002F\u002F ХОРОШО — параметризованный запрос\nao.find(TaskConfig.class,\n        Query.select().where(\"PROJECT_KEY = ?\", projectKey));\n\n\u002F\u002F В Velocity шаблонах: $!{htmlUtil.htmlEncode($userInput)}\n```\n\n### Конфигурация плагина (DC)\n\n```java\n@Named\npublic class PluginConfigService {\n\n    private static final String PLUGIN_KEY = \"com.example.my-plugin\";\n    private final PluginSettingsFactory settingsFactory;\n\n    @Inject\n    public PluginConfigService(\n            @ComponentImport PluginSettingsFactory settingsFactory) {\n        this.settingsFactory = settingsFactory;\n    }\n\n    public void setSetting(String key, String value) {\n        PluginSettings settings = settingsFactory.createGlobalSettings();\n        settings.put(PLUGIN_KEY + \".\" + key, value);\n    }\n\n    public String getSetting(String key) {\n        PluginSettings settings = settingsFactory.createGlobalSettings();\n        return (String) settings.get(PLUGIN_KEY + \".\" + key);\n    }\n}\n```\n\n### Частые ошибки\n\n- Пропуск валидации ввода — XSS, SQL injection, path traversal\n- Отсутствие error handling — пользователь видит stack trace вместо понятного сообщения\n- Блокирование потоков UI — тяжёлые операции должны быть асинхронными с progress bar\n- Жёсткая привязка к конкретной версии Jira API — не работает после обновления\n\n### Как используется в 2026\n\n- Atlassian Design System (ADS) — единая система дизайна для DC и Cloud\n- Observability (Prometheus, OpenTelemetry) — must-have для production плагинов\n- Feature flags — безопасный rollout новых функций плагина\n- Автоматизированное тестирование на матрице версий Jira (LTS versions)\n\n> **На собеседовании:** структурируйте ответ по категориям: производительность (пагинация, кэширование), безопасность (параметризованные запросы, XSS), UX (AUI для DC, Atlaskit для Cloud), обратная совместимость (upgrade tasks). Никогда не загружайте все данные в память — используйте пагинацию.","","middle",[15,16,17,7],"security","performance","best-practices",[],null,{"title":21,"description":22,"ogTitle":23,"ogDescription":24,"keywords":25,"schemaAnswer":35,"featuredSnippetReady":36},"Best practices при разработке для Jira — Gymterview","Best practices Jira-разработки: производительность (пагинация, CacheManager), безопасность (SQL injection, XSS, XSRF), UX (AUI, Atlaskit), upgrade tasks.","Best practices разработки для Jira: производительность, безопасность, UX — Gymterview","Рекомендации для Jira-разработки: пагинация, кэширование, параметризованные запросы, экранирование вывода, upgrade tasks.",[26,27,28,29,30,31,32,33,34],"Jira best practices","CacheManager","SQL injection","XSS","AUI","Atlaskit","upgrade tasks","PluginSettings","Java","Производительность: пагинация (никогда не загружать все данные), CacheManager для DC. Безопасность: параметризованные запросы AO (WHERE = ?), htmlEncode для Velocity, XSRF-токены. UX: AUI для DC, Atlaskit для Cloud, Atlassian Design System. Обратная совместимость: upgrade tasks, SAL PluginSettings. Feature flags для безопасного rollout.",true]