Η Σημασία του Clean Code στον Κώδικά μας

Νίκος Σταυρόπουλος - Feb 26 - - Dev Community

Στον κόσμο της ανάπτυξης λογισμικού, ο καθαρός κώδικας (clean code) δεν είναι απλώς μια "πολυτέλεια", αλλά μια αναγκαιότητα. Ένας κώδικας που είναι καλά δομημένος, ευανάγνωστος και εύκολος στη συντήρηση μπορεί να μειώσει σημαντικά τον χρόνο ανάπτυξης, να μειώσει τα σφάλματα και να βελτιώσει την απόδοση μιας ομάδας.

Τι Είναι ο Clean Code;

Ο Clean Code είναι ένας τρόπος γραφής κώδικα που ακολουθεί τις βέλτιστες πρακτικές και τις αρχές σχεδίασης, ώστε να είναι ευανάγνωστος, κατανοητός και εύκολα επεκτάσιμος.

Βασικά χαρακτηριστικά ενός clean code:
Καθαρή και περιγραφική ονοματοδοσία
Μικρές και σαφείς συναρτήσεις
Χωρισμός σε λογικές ενότητες (Separation of Concerns)
Αποφυγή code duplication (DRY – Don’t Repeat Yourself)
Χρήση σχεδιαστικών προτύπων (Design Patterns) όπου χρειάζεται
Σωστή διαχείριση των εξαιρέσεων (Exception Handling)


Πόσες γραμμές πρέπει να έχει μια κλάση και μια μέθοδος;

📌 Κλάση (Class)

✔ Μια κλάση δεν πρέπει να ξεπερνά τις 300-500 γραμμές κώδικα.
✔ Αν μια κλάση μεγαλώνει υπερβολικά, πιθανώς εκτελεί πολλές ευθύνες (Single Responsibility Principle - SRP).
✔ Είναι προτιμότερο να χωρίζουμε μεγάλες κλάσεις σε μικρότερες κλάσεις ή modules για να διατηρήσουμε τη συνοχή και την αναγνωσιμότητα του κώδικα.
✔ Ένα καλό μέτρο είναι μία κλάση = μία ξεκάθαρη λειτουργία (π.χ., UserService για διαχείριση χρηστών, PaymentProcessor για πληρωμές).

📌 Μέθοδος (Method)

✔ Μια μέθοδος ιδανικά δεν πρέπει να ξεπερνά τις 10-20 γραμμές κώδικα.
✔ Αν μια μέθοδος μεγαλώνει υπερβολικά, πιθανότατα εκτελεί περισσότερες από μία λειτουργίες και πρέπει να διαχωριστεί.
✔ Ο κανόνας "μια μέθοδος πρέπει να κάνει ένα και μόνο πράγμα" (Single Responsibility Principle) πρέπει να τηρείται αυστηρά.
✔ Αν παρατηρήσεις πολλές if ή switch δηλώσεις σε μια μέθοδο, εξετάστε αν μπορείς να χρησιμοποιήσεις design patterns (όπως Strategy ή Factory Pattern) για να διατηρήσεις τη δομή καθαρή.


Παράδειγμα Clean Code vs Bad Code σε C# (.NET Core)

Ας δούμε ένα κακό παράδειγμα κώδικα που δεν ακολουθεί clean code αρχές:

Bad Code Example (Μη καθαρός κώδικας)

public class UserService
{
    public void ProcessUser(string username, string email)
    {
        if (string.IsNullOrEmpty(username) || string.IsNullOrEmpty(email))
        {
            throw new Exception("Invalid data");
        }

        Console.WriteLine("Processing user...");
        // Save to database (hypothetically)
        Console.WriteLine($"User {username} saved with email {email}");
    }
}
Enter fullscreen mode Exit fullscreen mode

🔴 Τι είναι λάθος εδώ;

  • 1. Μη περιγραφικά ονόματα μεθόδων (ProcessUser - κάνει πολλά πράγματα ταυτόχρονα).
  • 2. Έλλειψη διαχωρισμού ευθυνών (validation, business logic, και αποθήκευση όλα σε μία μέθοδο).
  • 3. Κακή διαχείριση εξαιρέσεων (throw new Exception() δεν δίνει αρκετές πληροφορίες).
  • 4. Σκληρά κωδικοποιημένα δεδομένα στο Console.WriteLine.

✅ Clean Code Example (Καθαρός κώδικας)

public class User
{
    public string Username { get; }
    public string Email { get; }

    public User(string username, string email)
    {
        if (string.IsNullOrWhiteSpace(username)) throw new ArgumentException("Username cannot be empty.");
        if (string.IsNullOrWhiteSpace(email) || !email.Contains("@")) throw new ArgumentException("Invalid email.");

        Username = username;
        Email = email;
    }
}

public interface IUserRepository
{
    void Save(User user);
}

public class UserRepository : IUserRepository
{
    public void Save(User user)
    {
        Console.WriteLine($"User {user.Username} saved with email {user.Email}");
    }
}

public class UserService
{
    private readonly IUserRepository _userRepository;

    public UserService(IUserRepository userRepository)
    {
        _userRepository = userRepository;
    }

    public void RegisterUser(string username, string email)
    {
        var user = new User(username, email);
        _userRepository.Save(user);
    }
}
Enter fullscreen mode Exit fullscreen mode

🟢 Τι βελτιώσαμε;

Διαχωρισμός ευθυνών (Separation of Concerns) – Κάθε κλάση έχει συγκεκριμένο ρόλο.
Εξαίρεση με σαφή μηνύματα (ArgumentException) – Αντί για Exception, χρησιμοποιούμε πιο συγκεκριμένες εξαιρέσεις.
Χρήση IUserRepository για διαχείριση δεδομένων – Διαχωρισμός του persistence layer από το business logic.
Περιορισμός ευθύνης στην UserService – Ασχολείται μόνο με τη λογική εγγραφής του χρήστη.


Γιατί Είναι Σημαντικός ο Clean Code;

1️⃣ Ευκολία Συντήρησης – Όταν ο κώδικας είναι καθαρός, κάθε προγραμματιστής μπορεί εύκολα να τον διαβάσει και να τον κατανοήσει.
2️⃣ Λιγότερα Bugs – Ένας καλά οργανωμένος κώδικας μειώνει την πιθανότητα λαθών και απρόβλεπτων προβλημάτων.
3️⃣ Καλύτερη Συνεργασία – Όταν εργάζονται πολλοί προγραμματιστές στο ίδιο project, ένας καθαρός κώδικας επιτρέπει καλύτερη συνεργασία.
4️⃣ Βελτιωμένη Απόδοση – Αν ο κώδικας είναι σωστά δομημένος, μπορεί να βελτιώσει την απόδοση και την επεκτασιμότητα του συστήματος.


Συμπέρασμα

Ο Clean Code δεν είναι απλά μια προγραμματιστική τεχνική, αλλά ένας τρόπος σκέψης. Ένας καθαρός, οργανωμένος και κατανοητός κώδικας οδηγεί σε λιγότερα λάθη, καλύτερη απόδοση και πιο ευέλικτα συστήματα.

Αν γράφεις κώδικα καθημερινά, κάνε τη συνήθεια να βελτιώνεις συνεχώς τον τρόπο που γράφεις κώδικα. Οι μικρές αλλαγές στη δομή και στη λογική του κώδικα μπορούν να κάνουν τεράστια διαφορά μακροπρόθεσμα.

1️⃣ Βιβλία
📖 Clean Code: A Handbook of Agile Software Craftsmanship – Robert C. Martin (Uncle Bob)
📖 The Clean Coder: A Code of Conduct for Professional Programmers – Robert C. Martin
📖 Refactoring: Improving the Design of Existing Code – Martin Fowler

2️⃣ Online Tutorials & Documentation
🔗 Microsoft .NET Coding Guidelines
🔗 Refactoring Guru – Clean Code & Design Patterns

3️⃣ Video Courses
🎥 Clean Code – Pluralsight (μαθήματα από τον Robert C. Martin)
🎥 SOLID Principles in C# – Udemy, Coursera
🎥 Clean Architecture in .NET – YouTube tutorials από διάσημους developers
🎥 clean-code

. . . . . . .