[{"data":1,"prerenderedAt":1123},["ShallowReactive",2],{"blog-uk-camelcase-vs-snakecase":3},{"id":4,"title":5,"alt":6,"author":7,"body":8,"category":1086,"description":1087,"extension":1088,"faq":1089,"image":1111,"meta":1112,"navigation":667,"path":1113,"publishedAt":1114,"seo":1115,"stem":1116,"tags":1117,"__hash__":1122},"blog\u002Fuk\u002Fcamelcase-vs-snakecase.md","camelCase vs snake_case: коли що обрати (з прикладами)","Порівняння конвенцій іменування змінних camelCase та snake_case з іконками мов програмування","Vibe Apps Pro Team",{"type":9,"value":10,"toc":1076},"minimark",[11,20,23,26,31,34,314,317,319,323,335,340,365,378,392,394,398,408,412,439,445,478,480,484,487,493,507,521,527,534,537,547,549,553,556,562,745,759,764,810,826,836,852,860,862,866,900,926,947,975,977,981,984,1008,1014,1022,1024,1028,1066,1072],[12,13,14,15,19],"p",{},"Відповідь дається секунд за 30, а інтерналізувати її повністю — справа всієї кар'єри: ",[16,17,18],"strong",{},"бери те, що вже вирішила спільнота мови",". camelCase у JavaScript. snake_case у Python. Готово.",[12,21,22],{},"Але справжня складність — на межах: JSON API, схеми баз даних, конфіги і кросмовні проєкти, де стикаються дві спільноти. Саме там починається безлад — і саме про це ця стаття.",[24,25],"hr",{},[27,28,30],"h2",{"id":29},"коротка-довідка-яка-конвенція-куди","Коротка довідка: яка конвенція куди",[12,32,33],{},"Перш ніж занурюватися в «чому», ось остаточна таблиця-шпаргалка:",[35,36,37,53],"table",{},[38,39,40],"thead",{},[41,42,43,47,50],"tr",{},[44,45,46],"th",{},"Контекст",[44,48,49],{},"Конвенція",[44,51,52],{},"Приклад",[54,55,56,75,91,107,122,138,154,167,180,194,211,225,239,254,269,284,299],"tbody",{},[41,57,58,62,65],{},[59,60,61],"td",{},"Змінні \u002F функції в JavaScript",[59,63,64],{},"camelCase",[59,66,67,71,72],{},[68,69,70],"code",{},"wordCount",", ",[68,73,74],{},"parseText()",[41,76,77,80,83],{},[59,78,79],{},"Класи в JavaScript",[59,81,82],{},"PascalCase",[59,84,85,71,88],{},[68,86,87],{},"TextAnalyzer",[68,89,90],{},"WordCounter",[41,92,93,96,99],{},[59,94,95],{},"Константи в JavaScript",[59,97,98],{},"UPPER_SNAKE_CASE",[59,100,101,71,104],{},[68,102,103],{},"MAX_WORDS",[68,105,106],{},"DEFAULT_WPM",[41,108,109,112,114],{},[59,110,111],{},"Інтерфейси \u002F типи в TypeScript",[59,113,82],{},[59,115,116,71,119],{},[68,117,118],{},"TextStats",[68,120,121],{},"AnalysisResult",[41,123,124,127,130],{},[59,125,126],{},"Назви файлів TypeScript \u002F Vue",[59,128,129],{},"kebab-case",[59,131,132,71,135],{},[68,133,134],{},"word-counter.ts",[68,136,137],{},"text-analyzer.vue",[41,139,140,143,146],{},[59,141,142],{},"Змінні \u002F функції в Python",[59,144,145],{},"snake_case",[59,147,148,71,151],{},[68,149,150],{},"word_count",[68,152,153],{},"parse_text()",[41,155,156,159,161],{},[59,157,158],{},"Класи в Python",[59,160,82],{},[59,162,163,71,165],{},[68,164,87],{},[68,166,90],{},[41,168,169,172,174],{},[59,170,171],{},"Константи в Python",[59,173,98],{},[59,175,176,71,178],{},[68,177,103],{},[68,179,106],{},[41,181,182,185,187],{},[59,183,184],{},"Ruby \u002F Rails",[59,186,145],{},[59,188,189,71,191],{},[68,190,150],{},[68,192,193],{},"parse_text",[41,195,196,199,202],{},[59,197,198],{},"Go",[59,200,201],{},"camelCase \u002F PascalCase",[59,203,204,206,207,210],{},[68,205,70],{}," (неекспортований), ",[68,208,209],{},"WordCount"," (експортований)",[41,212,213,216,218],{},[59,214,215],{},"Публічні методи Java \u002F Kotlin",[59,217,64],{},[59,219,220,71,223],{},[68,221,222],{},"getWordCount()",[68,224,74],{},[41,226,227,230,232],{},[59,228,229],{},"Назви колонок у SQL",[59,231,145],{},[59,233,234,71,236],{},[68,235,150],{},[68,237,238],{},"created_at",[41,240,241,244,246],{},[59,242,243],{},"Назви CSS-класів",[59,245,129],{},[59,247,248,71,251],{},[68,249,250],{},"word-counter",[68,252,253],{},"text-toolbar",[41,255,256,259,261],{},[59,257,258],{},"URL-слаги",[59,260,129],{},[59,262,263,71,266],{},[68,264,265],{},"\u002Fcase-converter",[68,267,268],{},"\u002Fremove-spaces",[41,270,271,274,276],{},[59,272,273],{},"Назви npm-пакетів",[59,275,129],{},[59,277,278,71,281],{},[68,279,280],{},"nuxt-gtag",[68,282,283],{},"vue-router",[41,285,286,289,292],{},[59,287,288],{},"Ключі JSON у REST API",[59,290,291],{},"camelCase (JS-first) або snake_case (Python-first)",[59,293,294,296,297],{},[68,295,70],{}," \u002F ",[68,298,150],{},[41,300,301,304,306],{},[59,302,303],{},"Змінні середовища",[59,305,98],{},[59,307,308,71,311],{},[68,309,310],{},"NODE_ENV",[68,312,313],{},"API_SECRET",[12,315,316],{},"Збережи цю таблицю в закладки. Вона покриває 95% рішень, які ти ухвалюватимеш на проєкті.",[24,318],{},[27,320,322],{"id":321},"camelcase-вибір-javascript-і-java","camelCase: вибір JavaScript і Java",[12,324,325,326,71,328,71,331,334],{},"camelCase склеює слова, пишучи з великої літери перше слово після першого: ",[68,327,70],{},[68,329,330],{},"parseText",[68,332,333],{},"maxRetries",".",[12,336,337],{},[16,338,339],{},"Де це закон:",[341,342,343,347,350,353,356],"ul",{},[344,345,346],"li",{},"Змінні, функції і властивості об'єктів у JavaScript та TypeScript",[344,348,349],{},"Методи екземплярів і змінні в Java",[344,351,352],{},"Методи в Objective-C",[344,354,355],{},"Ключі JSON, які споживають JavaScript-фронтенди (за угодою, не за специфікацією)",[344,357,358,359,361,362,364],{},"Неекспортовані ідентифікатори в Go (",[68,360,70],{},") та експортовані через PascalCase (",[68,363,209],{},")",[12,366,367,368,71,371,71,374,377],{},"Походження camelCase у JavaScript веде безпосередньо до Java. Брендан Айк спроєктував синтаксис JavaScript так, щоб він подобався Java-розробникам у 1995-му, і вбудовані API JavaScript пішли за угодою Java: ",[68,369,370],{},"getElementById",[68,372,373],{},"addEventListener",[68,375,376],{},"hasOwnProperty",". П'ятнадцять років браузерних API навчили ціле покоління друкувати camelCase інстинктивно.",[12,379,380,383,384,71,386,71,389,391],{},[16,381,382],{},"Варіант PascalCase"," (UpperCamelCase) пише з великої кожне слово, включно з першим: ",[68,385,87],{},[68,387,388],{},"HttpRequest",[68,390,90],{},". У JavaScript PascalCase сигналізує «це конструктор або клас». У C# і Java його використовують для всіх публічних методів — пастка, коли ти вперше читаєш сорси .NET, прийшовши зі світу JS.",[24,393],{},[27,395,397],{"id":396},"snake_case-вибір-python-і-баз-даних","snake_case: вибір Python і баз даних",[12,399,400,401,71,403,71,405,334],{},"snake_case пише все з малої й розділяє слова підкресленнями: ",[68,402,150],{},[68,404,193],{},[68,406,407],{},"max_retries",[12,409,410],{},[16,411,339],{},[341,413,414,417,420,423,426,436],{},[344,415,416],{},"Змінні, функції і назви модулів у Python (PEP 8 — без варіантів у будь-якому серйозному Python-проєкті)",[344,418,419],{},"Методи і змінні в Ruby та Rails",[344,421,422],{},"Назви колонок у PostgreSQL і MySQL (нав'язано угодою, не рушієм БД)",[344,424,425],{},"Змінні і функції в Rust",[344,427,428,429,71,432,435],{},"Функції стандартної бібліотеки C (",[68,430,431],{},"printf",[68,433,434],{},"strlen"," — технічно без роздільника, але це окремі слова)",[344,437,438],{},"Назви змінних середовища у варіанті UPPER_SNAKE_CASE",[12,440,441,444],{},[16,442,443],{},"Чому Python обрав snake_case:"," Гвідо ван Россум написав PEP 8 у 2001-му, щоб описати стиль, який уже використовувала стандартна бібліотека Python. Бібліотека з'явилася раніше за PEP 8 і використовувала snake_case, бо Unix-утиліти і C уже встановили цей патерн для багатослівних ідентифікаторів. Python просто закодифікував наявну практику.",[12,446,447,450,451,453,454,457,458,461,462,465,466,469,470,474,475,477],{},[16,448,449],{},"Пастка PostgreSQL з колонками в camelCase:"," SQL за специфікацією нечутливий до регістру, а PostgreSQL зводить кожен незакавичений ідентифікатор до нижнього регістру на етапі парсингу. Якщо ти створиш колонку з назвою ",[68,452,70],{},", Postgres збереже її як ",[68,455,456],{},"wordcount",". Твій запит ",[68,459,460],{},"SELECT wordCount FROM ..."," тихо працює — поки якийсь джун не напише ",[68,463,464],{},"SELECT \"wordCount\" FROM ..."," з лапками, не отримає помилку ",[68,467,468],{},"column \"wordCount\" does not exist"," і не згаює годину на дебаг. Виправлення — завжди ставити лапки, а це означає, що тобі доведеться ставити їх ",[471,472,473],"em",{},"усюди"," і назавжди. У ",[68,476,150],{}," такої пастки немає — він переживає зведення регістру цілим. Бери snake_case і збережи собі нерви на суперечках про дрібниці. snake_case ще й узгоджується з тим, як ORM на кшталт SQLAlchemy, Prisma та ActiveRecord за замовчуванням генерують назви колонок у міграціях.",[24,479],{},[27,481,483],{"id":482},"проблема-межі-api","Проблема межі API",[12,485,486],{},"Саме тут більшість команд припускається помилок.",[12,488,489,490],{},"Python-бекенд (snake_case), що обслуговує JavaScript-фронтенд (camelCase), створює дилему: ",[16,491,492],{},"чия конвенція перемагає на рівні API?",[12,494,495,498,499,502,503,506],{},[16,496,497],{},"Варіант 1: snake_case усюди","\nБекенд повертає ",[68,500,501],{},"{ \"word_count\": 432 }",". Фронтенд звертається до ",[68,504,505],{},"response.word_count",". Це працює, але в JavaScript почувається неправильно — властивості, що виглядають як Python. Якщо ти на TypeScript, твої інтерфейси тепер мають ключі в snake_case, що виділяється на тлі кожної угоди JavaScript.",[12,508,509,512,513,516,517,520],{},[16,510,511],{},"Варіант 2: camelCase усюди","\nБекенд серіалізує в ",[68,514,515],{},"{ \"wordCount\": 432 }",". FastAPI робить це автоматично через ",[68,518,519],{},"alias_generator",". Django REST Framework підтримує це через кастомний рендерер. Фронтенд отримує ключі, що виглядають рідними.",[12,522,523,526],{},[16,524,525],{},"Варіант 3: обери стандарт і тримайся його","\nСпецифікація JSON:API використовує camelCase. Рекомендації OpenAPI віддають перевагу camelCase. GraphQL (схема і запити) за угодою — строго camelCase. Якщо ти будуєш публічний API, більшість генераторів SDK очікують саме camelCase.",[12,528,529,530,533],{},"Найгірший варіант: змішувати їх. ",[68,531,532],{},"{ \"wordCount\": 432, \"created_at\": \"2026-05-13\" }"," — ось що стається, коли двоє людей написали серіалізатор, не поговоривши між собою. Нормалізуй на рівні серіалізатора, а не клієнта.",[12,535,536],{},"Ось як ці три варіанти виглядають на практиці:",[538,539,544],"pre",{"className":540,"code":542,"language":543},[541],"language-text","┌─────────────────────────────────────────────────────────────┐\n│                    API BOUNDARY OPTIONS                     │\n├───────────────┬─────────────────┬───────────────────────────┤\n│ Option        │ API Response    │ Frontend access            │\n├───────────────┼─────────────────┼───────────────────────────┤\n│ snake_case    │ word_count: 432 │ response.word_count        │\n│ camelCase     │ wordCount: 432  │ response.wordCount  ✓      │\n│ Mixed (avoid) │ wordCount: 432, │ response.wordCount +       │\n│               │ created_at: …   │ response.created_at  ✗    │\n└───────────────┴─────────────────┴───────────────────────────┘\n","text",[68,545,542],{"__ignoreMap":546},"",[24,548],{},[27,550,552],{"id":551},"конвертація-між-конвенціями","Конвертація між конвенціями",[12,554,555],{},"Рано чи пізно тобі доведеться конвертувати — рефакторячи кодову базу, адаптуючи відповідь стороннього API чи мігруючи схему БД.",[12,557,558,561],{},[16,559,560],{},"Підхід через регулярку"," — найнадійніший спосіб програмно конвертувати camelCase у snake_case:",[538,563,567],{"className":564,"code":565,"language":566,"meta":546,"style":546},"language-js shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\u002F\u002F camelCase → snake_case\nconst toSnakeCase = (str) =>\n  str.replace(\u002F([a-z])([A-Z])\u002Fgu, '$1_$2').toLowerCase()\n\n\u002F\u002F snake_case → camelCase\nconst toCamelCase = (str) =>\n  str.replace(\u002F_([a-z])\u002Fgu, (_, c) => c.toUpperCase())\n","js",[68,568,569,578,605,662,669,675,693],{"__ignoreMap":546},[570,571,574],"span",{"class":572,"line":573},"line",1,[570,575,577],{"class":576},"sHwdD","\u002F\u002F camelCase → snake_case\n",[570,579,581,585,589,593,596,600,602],{"class":572,"line":580},2,[570,582,584],{"class":583},"spNyl","const",[570,586,588],{"class":587},"sTEyZ"," toSnakeCase ",[570,590,592],{"class":591},"sMK4o","=",[570,594,595],{"class":591}," (",[570,597,599],{"class":598},"sHdIc","str",[570,601,364],{"class":591},[570,603,604],{"class":583}," =>\n",[570,606,608,611,613,617,620,623,627,630,633,636,640,643,646,649,652,654,656,659],{"class":572,"line":607},3,[570,609,610],{"class":587},"  str",[570,612,334],{"class":591},[570,614,616],{"class":615},"s2Zo4","replace",[570,618,619],{"class":587},"(",[570,621,622],{"class":591},"\u002F([",[570,624,626],{"class":625},"sfazB","a-z",[570,628,629],{"class":591},"])([",[570,631,632],{"class":625},"A-Z",[570,634,635],{"class":591},"])\u002F",[570,637,639],{"class":638},"sbssI","gu",[570,641,642],{"class":591},",",[570,644,645],{"class":591}," '",[570,647,648],{"class":625},"$1_$2",[570,650,651],{"class":591},"'",[570,653,364],{"class":587},[570,655,334],{"class":591},[570,657,658],{"class":615},"toLowerCase",[570,660,661],{"class":587},"()\n",[570,663,665],{"class":572,"line":664},4,[570,666,668],{"emptyLinePlaceholder":667},true,"\n",[570,670,672],{"class":572,"line":671},5,[570,673,674],{"class":576},"\u002F\u002F snake_case → camelCase\n",[570,676,678,680,683,685,687,689,691],{"class":572,"line":677},6,[570,679,584],{"class":583},[570,681,682],{"class":587}," toCamelCase ",[570,684,592],{"class":591},[570,686,595],{"class":591},[570,688,599],{"class":598},[570,690,364],{"class":591},[570,692,604],{"class":583},[570,694,696,698,700,702,704,707,710,713,715,717,719,721,723,725,727,730,732,735,737,739,742],{"class":572,"line":695},7,[570,697,610],{"class":587},[570,699,334],{"class":591},[570,701,616],{"class":615},[570,703,619],{"class":587},[570,705,706],{"class":591},"\u002F",[570,708,709],{"class":625},"_",[570,711,712],{"class":591},"([",[570,714,626],{"class":625},[570,716,635],{"class":591},[570,718,639],{"class":638},[570,720,642],{"class":591},[570,722,595],{"class":591},[570,724,709],{"class":598},[570,726,642],{"class":591},[570,728,729],{"class":598}," c",[570,731,364],{"class":591},[570,733,734],{"class":583}," =>",[570,736,729],{"class":587},[570,738,334],{"class":591},[570,740,741],{"class":615},"toUpperCase",[570,743,744],{"class":587},"())\n",[12,746,747,748,751,752,755,756,758],{},"Ключовий патерн — ",[68,749,750],{},"([a-z])([A-Z])",": він знаходить кожен перехід від малої літери до великої, а це і є межа camelCase. Зверни увагу на прапорець ",[68,753,754],{},"u",": хоча саме цей патерн працює лише з ASCII-літерами, звичку ставити ",[68,757,754],{}," варто виробити для будь-якого патерну, що працює з Unicode-текстом.",[12,760,761],{},[16,762,763],{},"VS Code, крок за кроком (без плагінів):",[765,766,767,778,785,793,800,803],"ol",{},[344,768,769,770,773,774,777],{},"Відкрий Find & Replace: ",[68,771,772],{},"Ctrl+H"," (Windows\u002FLinux) або ",[68,775,776],{},"⌘+H"," (Mac)",[344,779,780,781,784],{},"Натисни іконку ",[68,782,783],{},".*",", щоб увімкнути режим regex",[344,786,787,790,791],{},[16,788,789],{},"Знайти:"," ",[68,792,750],{},[344,794,795,790,798],{},[16,796,797],{},"Замінити:",[68,799,648],{},[344,801,802],{},"Тисни Replace All — це вставить підкреслення на кожній межі camelCase",[344,804,805,806,809],{},"Відкрий термінал і прожени файл через переведення в нижній регістр, або зроби другий прохід Find All → ",[68,807,808],{},"[A-Z]"," → у нижній регістр вручну",[12,811,812,815,816,819,820,822,823,825],{},[68,813,814],{},"$1"," і ",[68,817,818],{},"$2"," в рядку заміни посилаються на дві групи захоплення в патерні — ",[68,821,814],{}," це мала літера перед межею, ",[68,824,818],{}," це велика літера після неї. Багато розробників не знають, що regex-заміна у VS Code підтримує зворотні посилання на групи захоплення з коробки, без жодних розширень.",[12,827,828,829,835],{},"Для разових конвертацій встав свій ідентифікатор у наш інструмент ",[16,830,831],{},[832,833,834],"a",{"href":265},"Зміна регістру"," — він працює на 100% у твоєму браузері, на сервер не йде жоден байт — і обери формат виводу з випадайки.",[12,837,838,839,845,846,848,849,851],{},"Для масового перейменування по документу чи вставленому блоку коду скористайся ",[16,840,841],{},[832,842,844],{"href":843},"\u002Ffind-replace","Пошуком і заміною"," з регуляркою ",[68,847,750],{}," → ",[68,850,648],{},", щоб конвертувати camelCase у snake_case, а потім зроби другий прохід для переведення в нижній регістр. Інструмент підтримує повноцінні регулярні вирази з підстановкою груп захоплення і показує живий лічильник збігів, перш ніж ти застосуєш зміни.",[12,853,854,855,859],{},"Якщо цікаво, як підхід із регуляркою порівнюється з іншими патернами обробки тексту, ",[832,856,858],{"href":857},"\u002Fblog\u002Fregex-find-replace-guide","гайд із пошуку й заміни за регулярними виразами"," детально розбирає групи захоплення, квантифікатори і випереджальні перевірки.",[24,861],{},[27,863,865],{"id":864},"крайові-випадки-на-яких-усі-спотикаються","Крайові випадки, на яких усі спотикаються",[12,867,868,871,872,875,876,879,880,875,883,886,887,71,889,891,892,895,896,899],{},[16,869,870],{},"Абревіатури в camelCase:"," має бути ",[68,873,874],{},"parseHTML"," чи ",[68,877,878],{},"parseHtml","? ",[68,881,882],{},"getURL",[68,884,885],{},"getUrl","? Гайд зі стилю Java від Google каже трактувати абревіатури як слова: ",[68,888,878],{},[68,890,885],{},". Гайд Microsoft для C# каже лишати їх у верхньому регістрі, якщо вони 2 символи: ",[68,893,894],{},"GetIO",", але ",[68,897,898],{},"GetUrl",". У JavaScript універсального правила немає. Обери одне і задокументуй — реальна проблема саме в неузгодженості всередині кодової бази.",[12,901,902,790,905,875,908,911,912,71,914,917,918,921,922,925],{},[16,903,904],{},"Числа в ідентифікаторах:",[68,906,907],{},"base64Encode",[68,909,910],{},"base_64_encode","? Конвенція — трактувати числа як символи слова в нижньому регістрі: ",[68,913,907],{},[68,915,916],{},"to_utf8",". Одні команди пишуть ",[68,919,920],{},"toUtf8",", інші ",[68,923,924],{},"toUTF8"," — і знову, гайд зі стилю важливіший за окремий вибір.",[12,927,928,790,931,934,935,938,939,942,943,946],{},[16,929,930],{},"Підкреслення на початку:",[68,932,933],{},"_privateMethod"," — це угода JavaScript (не нав'язана мовою), щоб сигналізувати «не викликай це ззовні модуля». Python використовує одне підкреслення на початку (",[68,936,937],{},"_private",") так само, а подвійне (",[68,940,941],{},"__mangled",") запускає name mangling у класах. У сучасному JavaScript із синтаксисом ",[68,944,945],{},"#privateField"," угода з підкресленням здебільшого застаріла, але ти все ще побачиш її в старіших кодових базах.",[12,948,949,952,953,956,957,875,960,963,964,71,967,970,971,974],{},[16,950,951],{},"Первинні ключі в базах даних:"," більшість фреймворків очікують ",[68,954,955],{},"id",", а не ",[68,958,959],{},"Id",[68,961,962],{},"ID",". Зовнішні ключі йдуть за патерном ",[68,965,966],{},"user_id",[68,968,969],{},"post_id"," — snake_case із суфіксом ",[68,972,973],{},"_id",". Тримай це послідовно, інакше твій ORM генеруватиме запити, що не збігаються зі схемою.",[24,976],{},[27,978,980],{"id":979},"кілька-слів-про-примус-інструментами","Кілька слів про примус інструментами",[12,982,983],{},"Найважливіша властивість конвенції іменування — те, що про неї не треба думати. Якщо твоя команда сперечається про регістр на код-рев'ю, ви витрачаєте розумову енергію не на те.",[12,985,986,989,990,815,993,996,997,1000,1001,815,1004,1007],{},[16,987,988],{},"ESLint"," має правила ",[68,991,992],{},"camelcase",[68,994,995],{},"@typescript-eslint\u002Fnaming-convention",", що нав'язують регістр на рівні лінтера. ",[16,998,999],{},"Black"," (форматер Python) не перейменовує змінні, але ",[16,1002,1003],{},"pylint",[16,1005,1006],{},"flake8"," з плагінами PEP 8 підсвітять порушення snake_case. Налаштуй правило лінтера один раз, нав'яжи на CI — і розмова закінчена.",[12,1009,1010,1011,1013],{},"Для разової роботи з текстом — відповіді API, конфіги, скрипти міграцій — інструмент ",[832,1012,834],{"href":265}," обробляє всі поширені формати, включно з camelCase, snake_case, PascalCase, kebab-case та UPPER_SNAKE_CASE, одним кліком.",[12,1015,1016,1017,1021],{},"А якщо ти колись вставляв блок тексту з неузгодженим регістром і його треба було нормалізувати — підхід зі статті ",[832,1018,1020],{"href":1019},"\u002Fblog\u002Fhow-to-remove-extra-spaces-from-text-online","як прибрати зайві пробіли в тексті онлайн"," працює і тут: спершу почисти текст, потім трансформуй.",[24,1023],{},[27,1025,1027],{"id":1026},"коротка-відповідь","Коротка відповідь",[341,1029,1030,1036,1042,1048,1054,1060],{},[344,1031,1032,1035],{},[16,1033,1034],{},"JavaScript \u002F TypeScript:"," camelCase для змінних і функцій, PascalCase для класів",[344,1037,1038,1041],{},[16,1039,1040],{},"Python:"," snake_case для змінних і функцій, PascalCase для класів, PEP 8 не опційний",[344,1043,1044,1047],{},[16,1045,1046],{},"SQL \u002F бази даних:"," snake_case, завжди",[344,1049,1050,1053],{},[16,1051,1052],{},"CSS \u002F URL \u002F npm:"," kebab-case",[344,1055,1056,1059],{},[16,1057,1058],{},"Змінні середовища:"," UPPER_SNAKE_CASE",[344,1061,1062,1065],{},[16,1063,1064],{},"JSON API:"," camelCase якщо JS-first, snake_case якщо Python-first — обери одне і серіалізуй послідовно",[12,1067,1068,1069,1071],{},"Коли працюєш через кілька шарів і треба швидко конвертувати, інструмент ",[832,1070,834],{"href":265}," обробляє всі формати, не виходячи з браузера.",[1073,1074,1075],"style",{},"html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":546,"searchDepth":580,"depth":580,"links":1077},[1078,1079,1080,1081,1082,1083,1084,1085],{"id":29,"depth":580,"text":30},{"id":321,"depth":580,"text":322},{"id":396,"depth":580,"text":397},{"id":482,"depth":580,"text":483},{"id":551,"depth":580,"text":552},{"id":864,"depth":580,"text":865},{"id":979,"depth":580,"text":980},{"id":1026,"depth":580,"text":1027},"Dev Tools","camelCase чи snake_case? Залежить від мови, шару й угоди команди. Повний розбір: правила мов, пастки в JSON API і конвертер регістру онлайн.","md",[1090,1093,1096,1099,1102,1105,1108],{"question":1091,"answer":1092},"camelCase чи snake_case — що читабельніше?","Дослідження не дають однозначної відповіді, але контекст важливіший за вподобання. Експерименти з ай-трекінгу показують, що snake_case трохи швидше читається для довгих ідентифікаторів — підкреслення дають чітке візуальне розділення, як пробіли. camelCase швидше друкувати (не треба Shift для підкреслення). Більшість відмінностей у читабельності зникає на ідентифікаторах коротших за 15 символів. Справжня відповідь: бери те, що вже стандартизувала спільнота твоєї мови.",{"question":1094,"answer":1095},"Яку конвенцію іменування використовує JavaScript?","JavaScript використовує camelCase для змінних, назв функцій і властивостей об'єктів (const wordCount, function parseText). PascalCase (він же UpperCamelCase) зарезервований для класів і конструкторів (class TextAnalyzer). Константи часто пишуть як UPPER_SNAKE_CASE (const MAX_WORDS = 50000). Сам JavaScript використовує camelCase у всіх вбудованих API: getElementById, addEventListener, querySelector.",{"question":1097,"answer":1098},"Яку конвенцію іменування використовує Python?","PEP 8 — гайд зі стилю Python — наказує snake_case для змінних, назв функцій і модулів (word_count, parse_text, my_module). PascalCase — для назв класів (TextAnalyzer). UPPER_SNAKE_CASE — для констант (MAX_WORDS). Стандартна бібліотека Python майже всюди дотримується PEP 8, що створює сильний тиск спільноти робити так само.",{"question":1100,"answer":1101},"Яку конвенцію обрати для ключів JSON у REST API?","camelCase поширеніший для JSON API, які споживають JavaScript-клієнти — це знімає потребу перетворювати ключі на фронтенді. Проте багато Python-орієнтованих API (Django REST Framework, FastAPI за замовчуванням) повертають ключі в snake_case. Справжня проблема виникає, коли їх змішують: Python-бекенд, що віддає snake_case на JavaScript-фронтенд, породжує шар перекладу. Обери одну конвенцію на весь стек або налаштуй серіалізацію послідовно.",{"question":1103,"answer":1104},"Що таке PascalCase і чим він відрізняється від camelCase?","PascalCase (його ще називають UpperCamelCase) пише з великої літери кожне слово, включно з першим: TextAnalyzer, WordCounter, HttpRequest. Звичайний camelCase (lowerCamelCase) починається з малої: textAnalyzer, wordCounter, httpRequest. Різниця важлива: JavaScript використовує camelCase для функцій і змінних, але PascalCase для класів. C# і Java використовують PascalCase для публічних методів — що дивує JS-розробників, які переходять на ці мови.",{"question":1106,"answer":1107},"А як щодо kebab-case? Коли його використовують?","kebab-case використовує дефіси: word-counter, text-analyzer, my-component. Це стандарт для назв CSS-класів, HTML-атрибутів, URL-слагів і назв npm-пакетів. kebab-case не можна використовувати для назв змінних у JavaScript (дефіс — це оператор мінус), тому CSS-in-JS і однофайлові компоненти Vue дозволяють обидва варіанти — kebab-case у шаблонах, camelCase у скрипті. У деяких проєктах kebab-case також застосовують для назв файлів (word-counter.ts).",{"question":1109,"answer":1110},"Як масово конвертувати ідентифікатори з camelCase у snake_case?","Найнадійніший підхід — пошук і заміна за регулярним виразом. Патерн ([a-z])([A-Z]) знаходить кожен перехід від малої літери до великої — це межа camelCase. Заміни на $1_$2 (або \\1_\\2 у деяких рушіях), а потім переведи результат у нижній регістр. У VS Code: Ctrl+H, увімкни regex, шукай ([a-z])([A-Z]), заміняй на $1_$2. Для масової конвертації по файлах скористайся інструментом [Пошук і заміна](\u002Ffind-replace) з тим самим патерном.","\u002Farticles\u002Fcamelcase-vs-snakecase\u002Fhero.webp",{},"\u002Fuk\u002Fcamelcase-vs-snakecase","2026-05-13",{"title":5,"description":1087},"uk\u002Fcamelcase-vs-snakecase",[1118,1119,992,145,1120,1121],"конвенції іменування","іменування змінних","javascript","python","1Tc5T4INzB3h4qQY3cG40zrG8dA3yZGTbZNDjU9EvS8",1782712870571]