Sobes.tech
Middle+

Πώς σχετίζονται η αμεταβλητότητα και η καθαρότητα;

sobes.tech AI

Απάντηση από AI

Η αμεταβλητότητα (μη μεταβλητά αντικείμενα) και η καθαρότητα (λειτουργίες χωρίς παρενέργειες) είναι στενά συνδεδεμένα, καθώς η αμεταβλητότητα συμβάλλει στην επίτευξη της καθαρότητας.

Καθαρή λειτουργία:

  • Πάντα επιστρέφει το ίδιο αποτέλεσμα για τα ίδια δεδομένα εισόδου.
  • Δεν αλλάζει την κατάσταση εκτός του πεδίου δράσης της (δεν έχει παρενέργειες).

Αν μια λειτουργία λαμβάνει μεταβλητά αντικείμενα ως επιχειρήματα και τα τροποποιεί, δεν είναι καθαρή, καθώς η κλήση της μπορεί να αλλάξει την κατάσταση του συστήματος εκτός της λειτουργίας.

Χρησιμοποιώντας μη μεταβλητά αντικείμενα:

  • Η λειτουργία δεν μπορεί να αλλάξει τα περασμένα αντικείμενα, καθώς είναι αμετάβλητα.
  • Κάθε "αλλαγή" οδηγεί στη δημιουργία ενός νέου αντικειμένου, όχι στην τροποποίηση του υπάρχοντος.
  • Αυτό διασφαλίζει την απουσία παρενεργειών που σχετίζονται με την τροποποίηση των περασμένων επιχειρημάτων.

Παράδειγμα:

<?php

// Μεταβλητό αντικείμενο
class MutablePoint {
    public $x;
    public $y;

    public function __construct($x, $y) {
        $this->x = $x;
        $this->y = $y;
    }
}

// Μη καθαρή λειτουργία (τροποποιεί το περασμένο αντικείμενο)
function moveMutablePoint(MutablePoint $point, $dx, $dy) {
    $point->x += $dx;
    $point->y += $dy;
}

$mutablePoint = new MutablePoint(0, 0);
moveMutablePoint($mutablePoint, 1, 1);
// $mutablePoint τώρα είναι (1, 1) - η κατάσταση άλλαξε εκτός της λειτουργίας

// Αμετάβλητο αντικείμενο
final class ImmutablePoint {
    private $x;
    private $y;

    public function __construct($x, $y) {
        $this->x = $x;
        $this->y = $y;
    }

    public function getX(): int {
        return $this->x;
    }

    public function getY(): int {
        return $this->y;
    }

    // Η μέθοδος επιστρέφει ΝΕΟ αντικείμενο, δεν τροποποιεί το τρέχον
    public function move($dx, $dy): self {
        return new self($this->x + $dx, $this->y + $dy);
    }
}

// Καθαρή λειτουργία (δουλεύει με αμετάβλητα αντικείμενα)
function moveImmutablePoint(ImmutablePoint $point, $dx, $dy): ImmutablePoint {
    return $point->move($dx, $dy);
}

$immutablePoint = new ImmutablePoint(0, 0);
$newImmutablePoint = moveImmutablePoint($immutablePoint, 1, 1);
// $immutablePoint παρέμεινε στο (0, 0) - η κατάσταση δεν άλλαξε εκτός της λειτουργίας
// $newImmutablePoint τώρα είναι (1, 1) - δημιουργήθηκε νέο αντικείμενο

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