স্কিপ করে মূল কন্টেন্ট এ যান

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 করে! 📝