Naming Conventions
Clean Architecture Flutter প্রজেক্টের জন্য comprehensive naming conventions এবং code style guidelines।
🎯 General Principles
1. Consistency (সামঞ্জস্য)
- পুরো প্রজেক্টে একই naming pattern follow করুন
- Team members সবাই same convention follow করবে
2. Descriptive Names (বর্ণনামূলক নাম)
- Name দেখেই বুঝা যাবে purpose কি
- Abbreviation avoid করুন (যতটা সম্ভব)
3. Context Awareness (প্রসঙ্গ সচেতনতা)
- File location এবং purpose অনুযায়ী naming
📁 File Naming Conventions
Domain Layer Files
Entities:
✅ user_entity.dart
✅ product_entity.dart
✅ order_entity.dart
✅ auth_entity.dart
❌ user.dart # Too generic
❌ UserEntity.dart # PascalCase for files
❌ user_model.dart # This is entity, not model
Repositories (Abstract):
✅ user_repository.dart
✅ auth_repository.dart
✅ product_repository.dart
❌ user_repo.dart # Don't abbreviate
❌ UserRepository.dart # PascalCase for files
Use Cases:
✅ login_usecase.dart
✅ get_user_profile_usecase.dart
✅ update_user_usecase.dart
✅ logout_usecase.dart
❌ login_uc.dart # Don't abbreviate
❌ login.dart # Too generic
❌ user_login.dart # Use verb first
Data Layer Files
Models:
✅ user_model.dart
✅ auth_model.dart
✅ product_model.dart
❌ user_dto.dart # Use 'model' instead of 'dto'
❌ user_data.dart # Too generic
Repository Implementations:
✅ user_repository_impl.dart
✅ auth_repository_impl.dart
✅ product_repository_impl.dart
❌ user_repository_implementation.dart # Too long
❌ user_repo_impl.dart # Don't abbreviate
Data Sources:
✅ user_remote_data_source.dart
✅ user_local_data_source.dart
✅ auth_remote_data_source.dart
❌ user_api.dart # Too generic
❌ user_remote_datasource.dart # Use underscore
❌ user_rds.dart # Don't abbreviate
Presentation Layer Files
Controllers (GetX):
✅ auth_controller.dart
✅ dashboard_controller.dart
✅ profile_controller.dart
❌ auth_ctrl.dart # Don't abbreviate
❌ authentication_controller.dart # Too long, use 'auth'
BLoC Files:
✅ auth_bloc.dart
✅ auth_event.dart
✅ auth_state.dart
✅ dashboard_bloc.dart
✅ dashboard_event.dart
✅ dashboard_state.dart
Pages:
✅ login_page.dart
✅ dashboard_page.dart
✅ profile_page.dart
✅ settings_page.dart
❌ login_screen.dart # Use 'page' instead of 'screen'
❌ login_view.dart # Use 'page' instead of 'view'
Widgets:
✅ custom_button.dart
✅ user_profile_card.dart
✅ loading_indicator.dart
❌ btn.dart # Don't abbreviate
❌ my_button.dart # Don't use 'my'
Bindings (GetX):
✅ auth_binding.dart
✅ dashboard_binding.dart
✅ profile_binding.dart
🏷️ Class Naming Conventions
Domain Layer Classes
Entities:
✅ class UserEntity
✅ class ProductEntity
✅ class AuthEntity
❌ class User # Add 'Entity' suffix
❌ class UserData # Use 'Entity' not 'Data'
Repositories:
✅ abstract class UserRepository
✅ abstract class AuthRepository
❌ abstract class IUserRepository # Don't use 'I' prefix
❌ abstract class UserRepositoryInterface # Too long
Use Cases:
✅ class LoginUseCase
✅ class GetUserProfileUseCase
✅ class UpdateUserUseCase
❌ class Login # Add 'UseCase' suffix
❌ class UserLoginUseCase # Use verb first: Login, not UserLogin
Data Layer Classes
Models:
✅ class UserModel extends UserEntity
✅ class AuthModel extends AuthEntity
❌ class UserDto # Use 'Model' not 'Dto'
❌ class UserData # Use 'Model' not 'Data'
Repository Implementations:
✅ class UserRepositoryImpl implements UserRepository
✅ class AuthRepositoryImpl implements AuthRepository
❌ class UserRepositoryImplementation # Too long
❌ class ConcreteUserRepository # Use 'Impl' suffix
Data Sources:
✅ class UserRemoteDataSource
✅ class UserLocalDataSource
✅ class AuthRemoteDataSource
❌ class UserApi # Too generic
❌ class UserRemoteDataSrc # Don't abbreviate
Presentation Layer Classes
Controllers:
✅ class AuthController extends GetxController
✅ class DashboardController extends GetxController
❌ class AuthenticationController # Too long
❌ class AuthCtrl # Don't abbreviate
BLoC Classes:
✅ class AuthBloc extends Bloc<AuthEvent, AuthState>
✅ class DashboardBloc extends Bloc<DashboardEvent, DashboardState>
// Events
✅ abstract class AuthEvent
✅ class LoginSubmitted extends AuthEvent
✅ class LogoutRequested extends AuthEvent
// States
✅ abstract class AuthState
✅ class AuthInitial extends AuthState
✅ class AuthLoading extends AuthState
✅ class AuthSuccess extends AuthState
✅ class AuthFailure extends AuthState
Pages:
✅ class LoginPage extends StatelessWidget
✅ class DashboardPage extends StatefulWidget
❌ class LoginScreen # Use 'Page' not 'Screen'
❌ class LoginView # Use 'Page' not 'View'
🔤 Variable Naming Conventions
Method Names
✅ getUserProfile()
✅ updateUserData()
✅ validateEmail()
✅ handleLoginSubmit()
❌ get_user_profile() # Use camelCase
❌ GetUserProfile() # Don't use PascalCase for methods
❌ getUserData() # Be specific: 'Profile' not just 'Data'
Variable Names
✅ final String userName;
✅ final List<Product> productList;
✅ final bool isLoading;
✅ final int totalCount;
❌ final String user_name; # Use camelCase
❌ final List<Product> list; # Be specific
❌ final bool loading; # Use 'is' prefix for booleans
❌ final int count; # Be specific: 'totalCount'
Constants
✅ static const String apiBaseUrl = 'https://api.example.com';
✅ static const int maxRetryAttempts = 3;
✅ static const Duration requestTimeout = Duration(seconds: 30);
❌ static const String API_BASE_URL; # Use camelCase
❌ static const String url; # Be descriptive
Private Variables
✅ final AuthRepository _authRepository;
✅ final String _accessToken;
✅ bool _isInitialized = false;
❌ final AuthRepository authRepository; # Use underscore for private
❌ final String __accessToken; # Single underscore only
📂 Folder Structure Naming
Feature Folders:
✅ auth/
✅ dashboard/
✅ profile/
✅ settings/
❌ authentication/ # Too long, use 'auth'
❌ user_dashboard/ # Don't use underscore in folder names
❌ Auth/ # Use lowercase
Layer Folders:
✅ domain/
✅ data/
✅ presentation/
❌ Domain/ # Use lowercase
❌ business/ # Use 'domain'
❌ ui/ # Use 'presentation'
Sub-folders:
✅ entities/
✅ repositories/
✅ usecases/
✅ models/
✅ datasources/
✅ controllers/
✅ pages/
✅ widgets/
❌ use_cases/ # No underscore
❌ data_sources/ # No underscore
❌ Entities/ # Use lowercase
🎨 Code Style Guidelines
Import Organization
// ✅ Correct order:
// 1. Dart SDK imports
import 'dart:async';
import 'dart:convert';
// 2. Flutter imports
import 'package:flutter/material.dart';
// 3. Third-party packages
import 'package:get/get.dart';
import 'package:http/http.dart' as http;
// 4. Project imports
import 'package:myapp/features/auth/domain/entities/auth_entity.dart';
import 'package:myapp/features/auth/domain/repositories/auth_repository.dart';
Constructor Naming
✅ class UserEntity {
const UserEntity({
required this.id,
required this.name,
required this.email,
});
}
✅ class UserModel extends UserEntity {
const UserModel({
required super.id,
required super.name,
required super.email,
});
factory UserModel.fromJson(Map<String, dynamic> json) { ... }
UserModel copyWith({ ... }) { ... }
}
Method Naming Patterns
Repository Methods:
abstract class UserRepository {
✅ Future<UserEntity> getUserById(String id);
✅ Future<List<UserEntity>> getAllUsers();
✅ Future<void> createUser(UserEntity user);
✅ Future<void> updateUser(UserEntity user);
✅ Future<void> deleteUser(String id);
❌ Future<UserEntity> getUser(String id); # Be specific
❌ Future<UserEntity> fetchUserById(String id); # Use 'get' instead of 'fetch'
}
Use Case Methods:
class LoginUseCase {
✅ Future<AuthEntity> call(String email, String password);
✅ Future<AuthEntity> execute(String email, String password);
❌ Future<AuthEntity> login(String email, String password); # Use 'call' or 'execute'
}
Controller Methods:
class AuthController extends GetxController {
✅ Future<void> handleLogin();
✅ Future<void> handleLogout();
✅ void updateEmail(String email);
✅ void validateForm();
❌ Future<void> doLogin(); # Use 'handle' prefix
❌ void email(String email); # Use descriptive names
}
🧪 Test File Naming
Unit Tests:
✅ test/features/auth/domain/usecases/login_usecase_test.dart
✅ test/features/auth/data/repositories/auth_repository_impl_test.dart
✅ test/features/auth/data/models/auth_model_test.dart
❌ test/login_test.dart # Not specific enough
❌ test/auth/login_usecase_test.dart # Follow same folder structure
Widget Tests:
✅ test/features/auth/presentation/pages/login_page_test.dart
✅ test/features/auth/presentation/widgets/custom_button_test.dart
Integration Tests:
✅ integration_test/auth_flow_test.dart
✅ integration_test/dashboard_integration_test.dart
✅ Quick Reference Checklist
File Names:
- snake_case ব্যবহার করেছেন
- Descriptive names দিয়েছেন
- Appropriate suffixes ব্যবহার করেছেন (_entity, _model, _repository, etc.)
- Abbreviations avoid করেছেন
Class Names:
- PascalCase ব্যবহার করেছেন
- Appropriate suffixes দিয়েছেন (Entity, Repository, UseCase, etc.)
- Context appropriate names দিয়েছেন
Variable/Method Names:
- camelCase ব্যবহার করেছেন
- Boolean variables এ 'is', 'has', 'can' prefix দিয়েছেন
- Private variables এ underscore (_) ব্যবহার করেছেন
- Descriptive names দিয়েছেন
Folder Structure:
- lowercase ব্যবহার করেছেন
- Feature-based organization follow করেছেন
- Clean Architecture layers maintain করেছেন
মনে রাখবেন: Consistent naming conventions আপনার code readability এবং maintainability significantly improve করে! 📝