Clean Code Prinsipləri
Clean Code - oxunaqlı, sadə və genişləndirilə bilən kod yazma sənətidir. Bu prinsiplər kodu başa düşməyi və saxlamağı asanlaşdırır.
Ad Vermə Qaydaları
Məna ifadə edən adlar istifadə edin
Səhv nümunə:
int d; // günlərin sayı
List<int[]> list1; // oyun taxtası
public List<int[]> getThem() {
List<int[]> list1 = new ArrayList<int[]>();
for (int[] x : theList)
if (x[0] == 4)
list1.add(x);
return list1;
}
Düzgün nümunə:
int elapsedTimeInDays;
List<Cell> gameBoard;
public List<Cell> getFlaggedCells() {
List<Cell> flaggedCells = new ArrayList<Cell>();
for (Cell cell : gameBoard)
if (cell.isFlagged())
flaggedCells.add(cell);
return flaggedCells;
}
Axtarıla bilən adlar istifadə edin
Səhv nümunə:
for (int j = 0; j < 34; j++) {
s += (t[j] * 4) / 5;
}
Düzgün nümunə:
int realDaysPerIdealDay = 4;
const int WORK_DAYS_PER_WEEK = 5;
int sum = 0;
for (int j = 0; j < NUMBER_OF_TASKS; j++) {
int realTaskDays = taskEstimate[j] * realDaysPerIdealDay;
int realTaskWeeks = (realdays / WORK_DAYS_PER_WEEK);
sum += realTaskWeeks;
}
Funksiyalar
Kiçik funksiyalar yazın
Səhv nümunə:
public void processUser(String userData) {
// Məlumatları parse et
String[] parts = userData.split(",");
String name = parts[0];
String email = parts[1];
int age = Integer.parseInt(parts[2]);
// Validasiya et
if (name.isEmpty() || email.isEmpty()) {
throw new IllegalArgumentException("Name və email boş ola bilməz");
}
if (!email.contains("@")) {
throw new IllegalArgumentException("Email formatı səhvdir");
}
if (age < 0 || age > 150) {
throw new IllegalArgumentException("Yaş səhvdir");
}
// Database-ə yaz
User user = new User(name, email, age);
database.save(user);
// Email göndər
emailService.sendWelcomeEmail(email);
}
Düzgün nümunə:
public void processUser(String userData) {
UserData data = parseUserData(userData);
validateUserData(data);
User user = createUser(data);
saveUser(user);
sendWelcomeEmail(user.getEmail());
}
private UserData parseUserData(String userData) {
String[] parts = userData.split(",");
return new UserData(parts[0], parts[1], Integer.parseInt(parts[2]));
}
private void validateUserData(UserData data) {
validateName(data.getName());
validateEmail(data.getEmail());
validateAge(data.getAge());
}
private void validateName(String name) {
if (name.isEmpty()) {
throw new IllegalArgumentException("Ad boş ola bilməz");
}
}
Bir iş görən funksiyalar
Düzgün nümunə:
// Yalnız hesablamaya fokuslanır
public double calculateTotalPrice(List<Item> items) {
return items.stream()
.mapToDouble(Item::getPrice)
.sum();
}
// Yalnız formatlama işi görür
public String formatPrice(double price) {
return String.format("%.2f AZN", price);
}
// Yalnız çap işi görür
public void printInvoice(List<Item> items) {
double total = calculateTotalPrice(items);
String formattedPrice = formatPrice(total);
System.out.println("Cəmi: " + formattedPrice);
}
Şərhlərin Düzgün İstifadəsi
Yaxşı şərhlər
Qanuni şərhlər:
/**
* Bu metod User obyektini database-də yaddaşa saxlayır
* @param user saxlanılacaq User obyekti
* @return saxlanmış obyektin ID-si
* @throws DatabaseException əgər saxlama zamanı xəta baş verərsə
*/
public Long saveUser(User user) throws DatabaseException {
return userRepository.save(user);
}
Məlumatverici şərhlər:
// Regex: email formatını yoxlayır (example@domain.com)
Pattern emailPattern = Pattern.compile("^[A-Za-z0-9+_.-]+@([A-Za-z0-9.-]+\\.[A-Za-z]{2,})$");
// API limit: saniyədə maksimum 10 sorgu
Thread.sleep(100);
Pis şərhlər
Zəruri olmayan şərhlər:
// i-ni artır
i++;
// konstruktor
public User() {
}
Kod Formatlaması
Düzgün girintilər və boşluqlar:
public class UserService {
private UserRepository userRepository;
private EmailService emailService;
public UserService(UserRepository userRepository, EmailService emailService) {
this.userRepository = userRepository;
this.emailService = emailService;
}
public User createUser(String name, String email) {
if (isValidEmail(email)) {
User user = new User(name, email);
userRepository.save(user);
emailService.sendWelcomeEmail(email);
return user;
}
throw new IllegalArgumentException("Email formatı səhvdir");
}
private boolean isValidEmail(String email) {
return email != null && email.contains("@");
}
}
Xəta İdarəetməsi
Try-catch bloklarından düzgün istifadə:
public User getUserById(Long id) throws UserNotFoundException {
try {
return userRepository.findById(id);
} catch (DatabaseException e) {
logger.error("Database xətası: " + e.getMessage());
throw new UserNotFoundException("User tapılmadı: " + id);
}
}
Exception-lar yaratmaq:
public class UserNotFoundException extends Exception {
public UserNotFoundException(String message) {
super(message);
}
public UserNotFoundException(String message, Throwable cause) {
super(message, cause);
}
}
Class-lar
Kiçik class-lar:
// Yalnız User məlumatlarını saxlayır
public class User {
private String name;
private String email;
private LocalDateTime createdAt;
// constructor, getters, setters
}
// Yalnız User əməliyyatları
public class UserService {
public User createUser(UserCreateRequest request) {
// User yaratma məntiqi
}
public void updateUser(User user) {
// User yeniləmə məntiqi
}
}
// Yalnız database əməliyyatları
public class UserRepository {
public User save(User user) {
// Database-ə saxla
}
public User findById(Long id) {
// Database-dən tap
}
}
Nəticə
Clean Code prinsipləri:
- Kodun oxunaqlığını artırır
- Debug prosesini asanlaşdırır
- Komanda üzvləri arasında əməkdaşlığı yaxşılaşdırır
- Layihənin saxlanma xərclərini azaldır
- Yeni developer-lərin kodla tanış olmasını sürətləndirir