Najlepsze praktyki w programowaniu

Cześć! Jeśli jesteś programistą, to wiesz, że kodowanie to nie tylko „pisanie kodu”, ale i robienie tego w sposób, który będzie czytelny, efektywny i łatwy do utrzymania. Wiesz, o co chodzi? Czasem łatwiej jest napisać coś na szybko, ale potem… no właśnie, potem masz problem, bo nikt (a nawet ty!) nie potrafi zrozumieć, co ten kod robi.

Chciałbym ci dziś opowiedzieć o kilku podstawowych zasadach, które sprawią, że będziesz pisać kod, który nie tylko działa, ale także będzie łatwy do utrzymania, rozwoju i współpracy z innymi. Jeśli dopiero zaczynasz, to świetnie, bo te zasady staną się dla Ciebie fundamentem, na którym zbudujesz swoje umiejętności.

Pisanie czytelnego kodu (czyli KISS i DRY)

Zaczniemy od absolutnych podstaw, które musisz przyswoić jak najszybciej:

  • DRY (Don’t Repeat Yourself) – czyli „Nie powtarzaj się”. Chodzi o to, żeby unikać powielania tego samego fragmentu kodu w różnych miejscach.

  • 👉
    Kiedy tylko zauważysz, że ten sam kod pojawia się kilkakrotnie, warto go wyciągnąć do osobnej funkcji, klasy, lub po prostu napisać go raz, a później wywołać tam, gdzie to potrzebne. Dzięki temu zaoszczędzisz mnóstwo czasu i unikniesz błędów, które mogą wynikać z nieaktualnych kopii tego samego fragmentu kodu.
  • KISS (Keep It Simple, Stupid) – czyli „Zrób to prosto idioto”. Nie musisz pisać skomplikowanych rozwiązań, aby Twój kod był fajny.

  • 👉
    Jeśli potrafisz rozwiązać problem w 5 linijkach kodu, to nie rób tego w 50. Prosty kod jest łatwiejszy do zrozumienia, testowania i modyfikowania.

Przykład:

Zamiast pisać coś takiego:

// Sprawdzanie poprawności e-maila
if (filter_var($email, FILTER_VALIDATE_EMAIL)) {
    echo "Email jest poprawny!";
} else {
    echo "Email jest niepoprawny!";
}

// Sprawdzanie poprawności adresu URL
if (filter_var($url, FILTER_VALIDATE_URL)) {
    echo "URL jest poprawny!";
} else {
    echo "URL jest niepoprawny!";
}

Możesz stworzyć funkcję, aby nie powtarzać kodu:

enum InputTypeEnum: string
{
    case EMAIL = 'email';
    case URL = 'url';
}

function validateInput(string $input, InputTypeEnum $type): bool {
    return match($type) {
        InputTypeEnum::EMAIL => filter_var($input, FILTER_VALIDATE_EMAIL),
        InputTypeEnum::URL => filter_var($input, FILTER_VALIDATE_URL),
        default => false,
    };
}

// Użycie
$email = "test@example.com";
$url = "https://example.com";

if (validateInput($email, InputTypeEnum::EMAIL)) {
    echo "Email jest poprawny!";
} else {
    echo "Email jest niepoprawny!";
}

if (validateInput($url, InputTypeEnum::URL)) {
    echo "URL jest poprawny!";
} else {
    echo "URL jest niepoprawny!";
}
💡
Dzięki temu masz jedną funkcję, która wykonuje tę samą operację, ale w sposób bardziej elastyczny i skalowalny.

Komentowanie i dokumentowanie kodu

Komentowanie to podstawa, ale nie przesadzaj! Kod powinien mówić sam za siebie, ale jeśli już musisz dodać komentarz, rób to wtedy, gdy coś może być niezrozumiałe.

Przykład:

// Funkcja do obliczania średniej z tablicy
function calculateAverage(array $numbers): float {
    // Sprawdzenie, czy tablica nie jest pusta
    if (empty($numbers)) {
        return 0.0;
    }

    $sum = array_sum($numbers);

    return $sum / count($numbers);
}

$result = calculateAverage([10, 20, 30, 40]);

echo "Średnia wynosi: " . $result;
💡
Tutaj mamy komentarze tylko w kluczowych miejscach: przed funkcją i przy logicznych punktach w kodzie. To wystarczy, żeby każdy, kto czyta ten kod, wiedział, co się dzieje.

Nazewnictwo zmiennych, funkcji i klas

Dobre nazwy zmiennych, funkcji i klas to podstawa. Dzięki nim kod będzie bardziej zrozumiały. Chociaż języki programowania na to pozwalają i tworzenie nazw w języku polskim może kusić, dobrą praktyką jest używanie ich angielskich odpowiedników.

  • Zmienne: Używaj nazw, które jasno wskazują, do czego zmienna służy. Unikaj nazw typu $x czy $a.

  • 👉
    Zamiast $x nazwij zmienną np. $emailAddress lub $numberOfProducts.
  • Funkcje: Funkcje powinny robić jedną, konkretną rzecz i mieć nazwy zaczynające się od czasownika.

  • 👉
    Zamiast add, lepiej napisz addProductToCart. Należy również zwrócić uwagę na to, aby zawsze dodawać typy do parametrów danej funkcji oraz typ, jaki funkcja powinna zwracać.

Przykład:

// Dobra nazwa funkcji
function addProductToCart(int $productId): void {
    // Logika dodawania produktu do koszyka
    echo "Produkt o ID $productId został dodany do koszyka.";
}

$productId = 123;
addProductToCart($productId);
💡
Nazwy klas w PHP zapisuje się w stylu PascalCase. Przykład: Client, Order.
💡
Obecnie, tworząc kod, powinniśmy stosować się do zasad zdefiniowanych przez PHP Framework Interop Group (PHP-FIG) w ramach projektu PER Coding Style, który określa zasady formatowania kodu źródłowego w języku PHP. Zasady te mają na celu ujednolicenie stylu kodowania w projektach napisanych w języku PHP, co ułatwia zrozumienie kodu przez różnych programistów oraz ułatwia jego utrzymanie.

Refaktoryzacja kodu – poprawianie kodu, nie tylko jego pisanie

Refaktoryzacja to proces poprawiania istniejącego kodu, aby był bardziej efektywny i czytelny, ale bez zmieniania jego funkcji.

Przykład:

Przykład kodu, który można poprawić:

$product1Price = 20;
$product2Price = 30;
$product3Price = 15;

$total = $product1Price + $product2Price + $product3Price;

Zamiast tego stwórz tablicę:

$productPrices = [20, 30, 15];

$total = array_sum($productPrices);
echo "Suma cen produktów: " . $total;
🎯
Teraz możesz dodać więcej produktów bez konieczności edytowania każdej zmiennej osobno, a kod jest czystszy i bardziej elastyczny.

Testowanie – Bo kod musi działać!

Testowanie to jedna z najważniejszych rzeczy, których nie możesz pominąć. Pisanie testów zapewnia, że kod działa zgodnie z oczekiwaniami, a jeśli coś się zmieni, będziesz mógł szybko wykryć błędy.

W PHP najczęściej używa się frameworka PHPUnit do testowania.

Przykład:

Załóżmy, że mamy funkcję do obliczania ceny z rabatem:

function calculateDiscount(int $price, int $discount): int {
    return $price - ($price * ($discount / 100));
}

Test jednostkowy za pomocą PHPUnit może wyglądać tak:

use PHPUnit\Framework\Attributes\DataProvider;
use PHPUnit\Framework\TestCase;

class DiscountTest extends TestCase
{
    public static function discountProvider(): array
    {
        return [
            // Format: [cena, rabat, oczekiwany wynik]
            [100, 10, 90],  // Cena 100, rabat 10% = 90
            [200, 20, 160], // Cena 200, rabat 20% = 160
            [150, 0, 150],  // Cena 150, rabat 0% = 150
            [300, 50, 150], // Cena 300, rabat 50% = 150
            [250, 100, 0],  // Cena 250, rabat 100% = 0
        ];
    }

    #[DataProvider('discountProvider')]
    public function testCalculateDiscount(int $price, int $discount, int $expected)
    {
        $this->assertEquals($expected, calculateDiscount($price, $discount));
    }
}
💡
Dzięki temu, gdy zmienisz coś w funkcji calculateDiscount(), testy szybko zweryfikują, czy kod wciąż działa poprawnie.

Zarządzanie wersjami (Git)

Używanie Git jest absolutnie konieczne. Dzięki temu możesz śledzić historię swojego kodu, wracać do wcześniejszych wersji i współpracować z innymi programistami.

Przykład:

git init  # Tworzymy nowe repozytorium
git add .  # Dodajemy wszystkie zmiany do repo
git commit -m "feat: add discount calculation function"  # Komitujemy zmiany
git push # Wysyłamy zmiany do zdalnego repozytorium
💡
Git pozwala na pełną kontrolę nad wersjami i bardzo ułatwia współpracę, szczególnie jeśli pracujesz w zespole.
💡
Dobra praktyką w przypadku GIT-a jest stosowanie tzw. „Semantycznych komunikatów commit” (Conventional Commits), które zapewniają łatwy zestaw reguł do tworzenia jawnej historii commitów.

Unikaj „Hardcoding”

Hardcoding to twarde zakodowanie wartości w kodzie, które później trudno zmienić. Zamiast tego używaj zmiennych konfiguracyjnych lub plików zewnętrznych.

Zły przykład:

// Hardkodowany URL
$apiUrl = "https://example.com/api/v1/product";

Dobry przykład:

// Przechowywanie URL w pliku konfiguracyjnym
$config = require_once('config.php');
$apiUrl = $config['apiUrl'];
💡
Pliki konfiguracyjne (np. config.php) to świetny sposób na przechowywanie takich wartości.

Podsumowanie

Pamiętaj, że te zasady to tylko początek drogi do bycia dobrym programistą. Postaraj się pisać prosty, czysty kod, nie powtarzaj się, komentuj tylko wtedy kiedy to konieczne, testuj i używaj Git-a do zarządzania wersjami. Kiedy te praktyki wejdą Ci w nawyk, zobaczysz, jak łatwiej będzie Ci pracować i utrzymywać swój kod.

Powodzenia i niech kod zawsze będzie z Tobą! 💻🚀

0
Subscribe to my newsletter

Read articles from Andrzej Kostrzewa directly inside your inbox. Subscribe to the newsletter, and don't miss out.

Written by

Andrzej Kostrzewa
Andrzej Kostrzewa