Code OrganizationΒΆ
This guide covers best practices for organizing code structure, file layout, and project architecture across different programming languages.
π― Core Organization PrinciplesΒΆ
Single Responsibility PrincipleΒΆ
Each file, class, and module should have one clear responsibility.
Good ExampleΒΆ
# user_service.py - Only handles user business logic
class UserService:
def create_user(self, user_data):
# User creation logic only
pass
def update_user(self, user_id, user_data):
# User update logic only
pass
# user_repository.py - Only handles data access
class UserRepository:
def save(self, user):
# Database operations only
pass
def find_by_id(self, user_id):
# Database queries only
pass
Bad ExampleΒΆ
# user_manager.py - Multiple responsibilities
class UserManager:
def create_user(self, user_data):
# User creation logic
pass
def save_to_database(self, user):
# Database logic (wrong place)
pass
def send_email(self, user):
# Email logic (wrong place)
pass
def validate_input(self, data):
# Validation logic (wrong place)
pass
Dependency DirectionΒΆ
Dependencies should point inward, from high-level to low-level modules.
Application Layer (High Level)
β depends on
Business Logic Layer
β depends on
Data Access Layer (Low Level)
π Directory Structure Best PracticesΒΆ
Standard Project LayoutΒΆ
project_name/
βββ src/ # Source code
β βββ main/ # Production code
β β βββ java/ # Java source files
β β βββ python/ # Python source files
β β βββ resources/ # Configuration files
β βββ test/ # Test code
β βββ java/ # Test source files
β βββ python/ # Test source files
βββ docs/ # Documentation
βββ config/ # Configuration files
βββ scripts/ # Build and deployment scripts
βββ tests/ # Integration tests
βββ build/ # Build output
βββ README.md # Project documentation
Language-Specific StructuresΒΆ
Java Maven StructureΒΆ
my-java-project/
βββ src/
β βββ main/
β β βββ java/
β β β βββ com/
β β β βββ mycompany/
β β β βββ controller/
β β β βββ service/
β β β βββ repository/
β β β βββ model/
β β βββ resources/
β β βββ application.properties
β β βββ logback.xml
β βββ test/
β βββ java/
β βββ com/
β βββ mycompany/
β βββ controller/
β βββ service/
β βββ repository/
βββ pom.xml
βββ README.md
Python Package StructureΒΆ
my-python-project/
βββ my_package/
β βββ __init__.py
β βββ models/
β β βββ __init__.py
β β βββ user.py
β β βββ product.py
β βββ services/
β β βββ __init__.py
β β βββ user_service.py
β β βββ product_service.py
β βββ repositories/
β β βββ __init__.py
β β βββ user_repository.py
β β βββ product_repository.py
β βββ utils/
β βββ __init__.py
β βββ validators.py
β βββ helpers.py
βββ tests/
β βββ test_models/
β βββ test_services/
β βββ test_repositories/
βββ requirements.txt
βββ setup.py
βββ README.md
C Project StructureΒΆ
my-c-project/
βββ src/
β βββ main.c
β βββ user/
β β βββ user.h
β β βββ user.c
β βββ product/
β β βββ product.h
β β βββ product.c
β βββ utils/
β βββ utils.h
β βββ utils.c
βββ include/
β βββ common.h
β βββ config.h
βββ tests/
β βββ test_user.c
β βββ test_product.c
βββ build/
βββ Makefile
βββ README.md
ποΈ Architectural PatternsΒΆ
Layered ArchitectureΒΆ
βββββββββββββββββββββββββββββββββββββββ
β Presentation Layer β (Controllers, UI)
βββββββββββββββββββββββββββββββββββββββ€
β Business Layer β (Services, Logic)
βββββββββββββββββββββββββββββββββββββββ€
β Data Access Layer β (Repositories, DAOs)
βββββββββββββββββββββββββββββββββββββββ€
β Database Layer β (Database, Files)
βββββββββββββββββββββββββββββββββββββββ
Java ImplementationΒΆ
// Controller Layer
@RestController
@RequestMapping("/api/users")
public class UserController {
private UserService userService;
@GetMapping("/{id}")
public ResponseEntity<User> getUser(@PathVariable Long id) {
User user = userService.findById(id);
return ResponseEntity.ok(user);
}
}
// Service Layer
@Service
public class UserService {
private UserRepository userRepository;
public User findById(Long id) {
return userRepository.findById(id)
.orElseThrow(() -> new UserNotFoundException(id));
}
}
// Repository Layer
@Repository
public interface UserRepository extends JpaRepository<User, Long> {
Optional<User> findById(Long id);
}
Modular ArchitectureΒΆ
βββββββββββββββ βββββββββββββββ βββββββββββββββ
β User β β Product β β Order β
β Module β β Module β β Module β
βββββββββββββββ βββββββββββββββ βββββββββββββββ
β β β
ββββββββββββββββββΌβββββββββββββββββ
β
βββββββββββββββ
β Common β
β Module β
βββββββββββββββ
Python ImplementationΒΆ
# user/module.py
from ..common.database import DatabaseConnection
from ..common.validators import validate_email
class UserModule:
def __init__(self):
self.db = DatabaseConnection()
def create_user(self, user_data):
if validate_email(user_data['email']):
return self.db.insert('users', user_data)
raise ValueError("Invalid email")
# product/module.py
from ..common.database import DatabaseConnection
class ProductModule:
def __init__(self):
self.db = DatabaseConnection()
def create_product(self, product_data):
return self.db.insert('products', product_data)
# common/database.py
class DatabaseConnection:
def __init__(self):
self.connection = self._create_connection()
def insert(self, table, data):
# Database insertion logic
pass
π File Organization RulesΒΆ
Naming ConventionsΒΆ
## File Naming Standards
### General Rules
- Use descriptive, meaningful names
- Be consistent across the project
- Use language-specific conventions
- Avoid abbreviations unless widely understood
### Language-Specific Conventions
- **Java**: PascalCase for classes (UserService.java)
- **Python**: snake_case for modules (user_service.py)
- **C**: snake_case for files (user_service.c)
- **Oracle**: snake_case for packages (user_management.pks)
File Size GuidelinesΒΆ
## File Size Recommendations
### Maximum File Sizes
- **Classes**: 300-500 lines maximum
- **Functions**: 50-100 lines maximum
- **Modules**: 1000 lines maximum
- **Configuration files**: As needed
### When to Split Files
- Single file exceeds 500 lines
- Multiple distinct responsibilities
- Different abstraction levels
- Different feature areas
π§ Code Organization TechniquesΒΆ
Package/Module OrganizationΒΆ
// Good: Organized by feature
com.company.app
βββ user/
β βββ UserController.java
β βββ UserService.java
β βββ UserRepository.java
β βββ User.java
βββ product/
β βββ ProductController.java
β βββ ProductService.java
β βββ ProductRepository.java
β βββ Product.java
βββ common/
βββ BaseController.java
βββ BaseService.java
βββ BaseEntity.java
// Bad: Organized by type
com.company.app
βββ controller/
β βββ UserController.java
β βββ ProductController.java
β βββ OrderController.java
βββ service/
β βββ UserService.java
β βββ ProductService.java
β βββ OrderService.java
βββ repository/
βββ UserRepository.java
βββ ProductRepository.java
βββ OrderRepository.java
Dependency InjectionΒΆ
# Good: Dependency injection
class UserService:
def __init__(self, user_repository: UserRepository, email_service: EmailService):
self.user_repository = user_repository
self.email_service = email_service
def create_user(self, user_data):
user = self.user_repository.save(user_data)
self.email_service.send_welcome_email(user.email)
return user
# Bad: Hard dependencies
class UserService:
def __init__(self):
self.user_repository = UserRepository() # Hard dependency
self.email_service = EmailService() # Hard dependency
def create_user(self, user_data):
user = self.user_repository.save(user_data)
self.email_service.send_welcome_email(user.email)
return user
Configuration ManagementΒΆ
# config/application.yml
app:
name: "My Application"
version: "1.0.0"
database:
url: "jdbc:postgresql://localhost:5432/mydb"
username: "user"
password: "password"
logging:
level: "INFO"
file: "logs/application.log"
// Configuration class
@Configuration
@ConfigurationProperties(prefix = "app")
public class AppConfig {
private String name;
private String version;
// getters and setters
}
@Service
public class ApplicationService {
private final AppConfig config;
public ApplicationService(AppConfig config) {
this.config = config;
}
public String getAppInfo() {
return config.getName() + " v" + config.getVersion();
}
}
π Documentation OrganizationΒΆ
Code DocumentationΒΆ
/**
* Service for managing user operations.
*
* <p>This service provides methods for creating, updating, and retrieving users.
* It handles business logic and coordinates with the repository layer.</p>
*
* @author John Doe
* @version 1.0
* @since 1.0
*/
@Service
public class UserService {
/**
* Creates a new user.
*
* @param userDto the user data transfer object
* @return the created user
* @throws IllegalArgumentException if user data is invalid
* @throws EmailAlreadyExistsException if email already exists
*/
public User createUser(UserDto userDto) {
// Implementation
}
}
README StructureΒΆ
# Project Name
## Description
Brief description of the project purpose and functionality.
## Quick Start
Instructions for getting the project running quickly.
## Project Structure
Overview of the project organization and key directories.
## Configuration
How to configure the project for different environments.
## API Documentation
Link to API documentation or key endpoints.
## Contributing
Guidelines for contributing to the project.
## License
Project license information.
π Refactoring OrganizationΒΆ
Signs of Poor OrganizationΒΆ
- Large files with multiple responsibilities
- Deep nesting and complex hierarchies
- Circular dependencies
- Duplicated code across modules
- Difficult to locate specific functionality
Refactoring StepsΒΆ
- Identify Problems: Use code analysis tools and reviews
- Plan Changes: Create refactoring plan with minimal risk
- Extract Modules: Break large files into smaller modules
- Reorganize Dependencies: Fix dependency direction issues
- Update Tests: Ensure all tests pass after refactoring
- Document Changes: Update documentation and README files
π Related ResourcesΒΆ
- General Programming Principles - SOLID, DRY, KISS principles
- Debugging Strategies - Troubleshooting organized code
- Code Review Checklist - Evaluate code organization
- Self-Assessment Techniques - Assess organization skills
π Language-Specific OrganizationΒΆ
- Java Best Practices - Java organization patterns
- Python Best Practices - Python package organization
- C Best Practices - C project structure
- Oracle Best Practices - Oracle code organization