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

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