A few months ago, I published a post advocating for a universal naming convention across all projects.
The idea was simple:
-
snake_casefor folders -
camelCasefor files -
PascalCasefor classes - Consistency everywhere
At first, it sounded great.
One convention.
One mental model.
No context switching.
But the more technologies I worked with, the more I realized something important:
Professional developers don't force every technology to follow the same style.
They learn the language of each ecosystem.
- A Python project should feel like Python.
- A Java project should feel like Java.
- A React project should feel like React.
- A Laravel project should feel like Laravel.
The goal isn't to make every codebase look the same.
The goal is to make every codebase feel familiar to the developers who work on it.
🐍 Python (PEP 8)
| Element | Convention | Example |
|---|---|---|
| Files | snake_case.py |
user_service.py |
| Folders | snake_case |
user_management/ |
| Classes | PascalCase |
class UserProfile: |
| Functions | snake_case |
def get_user(): |
| Variables | snake_case |
user_name = "John" |
| Constants | UPPER_SNAKE_CASE |
MAX_RETRIES = 3 |
Frameworks
| Framework | Files | Folders | Classes | Functions |
|---|---|---|---|---|
| Django | snake_case.py |
snake_case |
PascalCase |
snake_case |
| Flask | snake_case.py |
snake_case |
PascalCase |
snake_case |
| FastAPI | snake_case.py |
snake_case |
PascalCase |
snake_case |
Python Rule: If it's not a class, it's probably
snake_case.
☕ Java
| Element | Convention | Example |
|---|---|---|
| Files | PascalCase.java |
UserService.java |
| Packages | lowercase |
com.company.users |
| Classes | PascalCase |
UserController |
| Interfaces | PascalCase |
UserRepository |
| Methods | camelCase |
getUserById() |
| Variables | camelCase |
userName |
| Constants | UPPER_SNAKE_CASE |
MAX_SIZE |
Frameworks
| Framework | Files | Packages | Classes | Methods |
|---|---|---|---|---|
| Spring Boot | PascalCase.java |
lowercase |
PascalCase |
camelCase |
Java Rule: Everything is
camelCaseexcept classes (PascalCase) and constants (UPPER_SNAKE_CASE).
📜 PHP (PSR Standards)
| Element | Convention | Example |
|---|---|---|
| Files | PascalCase.php |
UserService.php |
| Classes | PascalCase |
UserController |
| Methods | camelCase |
getUser() |
| Variables | camelCase |
$userName |
| Constants | UPPER_SNAKE_CASE |
MAX_RETRIES |
Frameworks
| Framework | Files | Directories | Classes | Methods |
|---|---|---|---|---|
| Laravel | PascalCase.php |
PascalCase |
PascalCase |
camelCase |
| Symfony | PascalCase.php |
PascalCase |
PascalCase |
camelCase |
Laravel Database Conventions
| Element | Convention | Example |
|---|---|---|
| Tables |
snake_case plural |
users, order_items
|
| Columns | snake_case |
first_name, created_at
|
PHP Rule: Classes and files are usually
PascalCase; methods and variables usecamelCase.
🟨 JavaScript & TypeScript
Unlike Python or Java, JavaScript is less strict.
Different frameworks and teams may adopt slightly different conventions.
| Element | Common Convention | Example |
|---|---|---|
| Files | kebab-case |
user-service.ts |
| Folders | kebab-case |
payment-gateway/ |
| Classes | PascalCase |
UserService |
| Functions | camelCase |
getUser() |
| Variables | camelCase |
userName |
| Constants | UPPER_SNAKE_CASE |
MAX_RETRIES |
JavaScript Rule: Most projects use
camelCasein code and oftenkebab-casefor files and folders.
⚛️ React
| Element | Convention | Example |
|---|---|---|
| Components | PascalCase |
UserCard |
| Component Files | PascalCase.tsx |
UserCard.tsx |
| Hooks | useCamelCase |
useAuth() |
| Props | camelCase |
userName |
| Variables | camelCase |
isLoading |
Examples
function UserCard() {
return <div>User</div>;
}
function useAuth() {}
React Rule: Components are
PascalCase; hooks always start withuse.
🟢 Vue
| Element | Convention | Example |
|---|---|---|
| Components | PascalCase |
UserCard.vue |
| Composables | useCamelCase |
useAuth() |
| Variables | camelCase |
userName |
| Methods | camelCase |
getUser() |
Vue Rule: Follow component conventions similar to React.
🔴 Angular
Angular has stronger conventions than most JavaScript frameworks.
| Element | Convention | Example |
|---|---|---|
| Components | user-card.component.ts |
user-card.component.ts |
| Services | user.service.ts |
user.service.ts |
| Directives | highlight.directive.ts |
highlight.directive.ts |
| Classes | PascalCase |
UserCardComponent |
| Methods | camelCase |
getUser() |
| Variables | camelCase |
userName |
Example
export class UserCardComponent {}
<app-user-card></app-user-card>
Angular Rule: Files use
kebab-case; classes usePascalCase.
⚡ Universal Conventions
These conventions are widely accepted regardless of language.
Repositories
user-auth-service
inventory-management-api
payment-gateway
Git Branches
feature/add-auth
feature/payment-module
feature/create-user
fix/login-bug
fix/token-validation
hotfix/security-patch
REST API Endpoints
/api/v1/user-orders
/api/v1/payment-history
Environment Variables
DATABASE_URL=
JWT_SECRET=
API_KEY=
REDIS_HOST=
📌 Quick Reference
| Technology | Files | Classes | Functions |
|---|---|---|---|
| Python | snake_case.py |
PascalCase |
snake_case |
| Django | snake_case.py |
PascalCase |
snake_case |
| Flask | snake_case.py |
PascalCase |
snake_case |
| FastAPI | snake_case.py |
PascalCase |
snake_case |
| Java | PascalCase.java |
PascalCase |
camelCase |
| Spring Boot | PascalCase.java |
PascalCase |
camelCase |
| PHP | PascalCase.php |
PascalCase |
camelCase |
| Laravel | PascalCase.php |
PascalCase |
camelCase |
| Symfony | PascalCase.php |
PascalCase |
camelCase |
| JavaScript | Usually kebab-case.js
|
PascalCase |
camelCase |
| TypeScript | Usually kebab-case.ts
|
PascalCase |
camelCase |
| React | PascalCase.tsx |
PascalCase |
camelCase |
| Vue | PascalCase.vue |
PascalCase |
camelCase |
| Angular | kebab-case.component.ts |
PascalCase |
camelCase |
🧠 Final Principle
Every ecosystem has already solved its naming conventions.
Learn them.
Use them.
Respect them.
The best naming convention is not the one you invent.
It's the one that every developer in that ecosystem already understands.
Top comments (0)