Hej, może zacznijmy ten post, zadaniem sobie pytania: czym są dobre praktyki programowania? Jakie korzyści one nam dają? Przyjrzyjmy się tym najbardziej popularnym oraz zobaczmy również te mniej znane.
Generalnie dobrymi praktykami programowania możemy nazwać zbiór zasad, które mają na celu pomóc programistom tworzyć lepszy, bardziej czytelny, łatwiejszy w utrzymaniu i skalowalny kod. Praktyki te obejmują szereg technik i narzędzi, które pomagają programistom tworzyć aplikacje o wysokiej jakości i efektywnie wykorzystywać czas i zasoby.
OKEJ, ale sprawdźmy te dobre praktyki programowania w akcji! Zacznijmy od DRY, KISS i YAGNI, czyli tych najpopularniejszych i najbardziej znanych.
DRY (Don’t Repeat Yourself)
Ta zasada mówi, że powinniśmy unikać powtarzania kodu w naszej aplikacji. Zamiast tego, powinniśmy tworzyć funkcje i klasy, które mogą być używane w wielu miejscach w naszym kodzie. Dzięki temu zmiany w kodzie są łatwiejsze do wprowadzenia, ponieważ musimy zmodyfikować tylko jeden fragment kodu zamiast wielu.
Prosty przykład DRY w php poniżej:
//z powtarzającym się kodem function calculateAreaOfSquare($side) { $area = $side * $side; return $area; } function calculateAreaOfRectangle($length, $width) { $area = $length * $width; return $area; } //bez powtarzającego się kodu function calculateArea($dimensions) { $area = 1; foreach($dimensions as $dimension) { $area *= $dimension; } return $area; } //Użycie $areaOfSquare = calculateArea([4]); $areaOfRectangle = calculateArea([4, 6]);
KISS (Keep It Simple, Stupid)
Ta zasada mówi, że powinniśmy tworzyć prosty kod, który jest łatwy do zrozumienia i utrzymania. Im prostszy kod, tym łatwiej jest go testować, debugować i wprowadzać zmiany.
Rzućmy okiem jak to może wyglądać:
// Zbyt skomplikowany kod function generateRandomString($length) { $characters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; $string = ""; for ($i = 0; $i < $length; $i++) { $randomNumber = mt_rand(0, strlen($characters)-1); $string .= $characters[$randomNumber]; } return $string; } //Prostszy kod function generateRandomString($length) { return bin2hex(random_bytes($length)); }
YAGNI (You Ain’t Gonna Need It)
To zasada, która mówi, że nie należy dodawać funkcjonalności do kodu, jeśli nie jest ona niezbędna. Oznacza to, że programiści powinni tworzyć tylko tyle kodu, ile jest potrzebne, a nie tworzyć kodu na zapas, który może nigdy nie być użyty.
Przykładem w PHP dla YAGNI może być sytuacja, w której programista przewiduje, że aplikacja będzie potrzebowała w przyszłości funkcjonalności do obsługi płatności. Może się zdarzyć, że programista będzie chciał dodać do kodu funkcję do obsługi płatności, zanim będzie to konieczne. Jednak zgodnie z zasadą YAGNI, nie powinien tego robić, dopóki nie będzie pewny, że taka funkcjonalność jest potrzebna.
Innym przykładem może być sytuacja, w której programista przewiduje, że będzie potrzebował kilku różnych klas do obsługi różnych typów danych. Może być skłonny do napisania kodu dla tych klas, zanim będzie potrzebował ich w swojej aplikacji. Zgodnie z zasadą YAGNI, nie powinien tego robić, dopóki nie będzie pewny, że takie klasy są niezbędne do realizacji funkcjonalności aplikacji.
W obu przypadkach programista powinien skupić się na napisaniu tylko tyle kodu, ile jest potrzebne do realizacji bieżących wymagań aplikacji, a nie tworzyć kodu na zapas, który może nigdy nie być użyty.
Oprócz DRY, KISS i YAGNI istnieje wiele innych dobrych praktyk programistycznych, które pomagają tworzyć dobre oprogramowanie. Postaram sie poniżej zebrać te najważniejsze:
SOLID
SOLID to skrót od pięciu zasad projektowania oprogramowania:
S - Single Responsibility Principle (Zasada pojedynczej odpowiedzialności) - każda klasa powinna być odpowiedzialna tylko za jedną funkcjonalność. Dzięki temu kod jest bardziej przejrzysty i łatwiejszy do utrzymania.
O - Open/Closed Principle (Zasada otwarte-zamknięte) - klasa powinna być otwarta na rozszerzenie, ale zamknięta na modyfikację. Oznacza to, że w przypadku zmiany wymagań, nie trzeba modyfikować istniejącego kodu, ale można go rozszerzyć o nową funkcjonalność.
L - Liskov Substitution Principle (Zasada podstawienia Liskov) - obiekty klasy bazowej powinny być zastępowalne przez obiekty klas pochodnych bez wprowadzania błędów lub nieoczekiwanych efektów.
I - Interface Segregation Principle (Zasada segregacji interfejsów) - klienci nie powinni być zmuszeni do implementowania metod, których nie potrzebują. Dzięki temu kod jest bardziej modularny i łatwiejszy do testowania.
D - Dependency Inversion Principle (Zasada odwrócenia zależności) - zależności między klasami powinny być oparte na abstrakcjach, a nie na konkretnych implementacjach. Dzięki temu kod jest bardziej elastyczny i łatwiejszy do testowania.
Te zasady pomagają programistom tworzyć elastyczny, łatwy do utrzymania kod, który jest bardziej odporny na zmiany. Więcej o solidnym kodzie z przykładami w php, znajdziesz w moim artykule tutaj -> SOLID z przykładami w php.
Test Driven Development (TDD)
TDD to praktyka polegająca na pisaniu testów jednostkowych przed napisaniem kodu aplikacji. Testy te mają pomóc programistom upewnić się, że ich kod działa zgodnie z oczekiwaniami. TDD pomaga uniknąć błędów i zapewnia, że kod jest łatwy do testowania.
Continuous Integration/Continuous Deployment (CI/CD)
CI/CD to praktyka polegająca na częstym i automatycznym dostarczaniu kodu do produkcji. CI/CD pomaga programistom zapewnić, że ich kod działa zgodnie z oczekiwaniami i że nie powoduje problemów w produkcji.
Przykładowe narzędzia, które mogą pomóc w realizacji procesu CI/CD:
- Travis CI – platforma do ciągłej integracji i wdrażania kodu
- Jenkins – system automatyzujący procesy deweloperskie, w tym CI/CD
- GitLab CI/CD – narzędzie do ciągłej integracji i wdrażania kodu, wbudowane w platformę GitLab
Code Reviews (CR)
Dobre praktyki programowania opierają się również na dobrym code review. Jest to proces, w którym kod napisany przez jednego programistę jest przeglądany i oceniany przez innego programistę. Czasami kodzik ocenia również grupa programistów np. poprzez szybki call. Celem każdego code review jest znalezienie błędów, poprawienia jakości kodu i zwiększenia efektywności wytwarzania oprogramowania.
Aby przeprowadzić skuteczne code review, warto zwrócić uwagę na kilka ważnych elementów:
- Przede wszystkim należy upewnić się, że kod jest czytelny i zrozumiały.
- Należy zwrócić uwagę na styl kodu, jego spójność i konsekwencję w stosowaniu nazewnictwa.
- Warto także upewnić się, że kod jest przetestowany i działa poprawnie.
- Należy zweryfikować, czy kod jest zgodny z wymaganiami funkcjonalnymi oraz czy spełnia założenia projektowe.
Podczas code review warto również zwrócić uwagę na wydajność kodu oraz na to, czy nie ma w nim potencjalnych luk w bezpieczeństwie. Należy także sprawdzić, czy kod jest łatwy do utrzymania i rozwijania.
Code review jest ważny, ponieważ pozwala na znalezienie błędów i problemów wcześniej w procesie wytwarzania oprogramowania, co może zaoszczędzić czas i pieniądze. Dzięki code review zwiększa się jakość kodu, co ma wpływ na jakość całego produktu. Ponadto, code review pozwala programistom na wzajemne uczenie się od siebie i podnoszenie swoich umiejętności.
Version Control
Korzystanie z systemów kontroli wersji, takich jak Git, pozwala programistom na śledzenie zmian w kodzie i łatwe cofanie się do wcześniejszych wersji. Systemy kontroli wersji pomagają również w pracy zespołowej, umożliwiając programistom pracę nad tym samym kodem równocześnie.
Clean Code
Praktykowanie „czystego kodu” to podejście do pisania kodu, które skupia się na tworzeniu czytelnego, zrozumiałego i łatwego do utrzymania kodu. Czysty kod powinien być łatwy do czytania i zmieniania przez innych programistów, co ułatwia rozwijanie i utrzymanie aplikacji.
Refaktoryzacja
Proces wprowadzania zmian w kodzie, które poprawiają jego jakość, ale nie zmieniają jego zachowania. Refaktoryzacja może polegać na usunięciu powtarzającego się kodu, poprawie nazw zmiennych i funkcji czy zmianie struktury kodu, aby był bardziej zrozumiały. Pomaga utrzymać kod w dobrej kondycji i łatwiejszym do utrzymania.
Wpięcie testów statycznych to też dobra praktyka w programowaniu
Testy statyczne wykorzystują specjalne narzędzia, takie jak analizatory kodu źródłowego, które przeglądają kod i wskazują potencjalne problemy, takie jak błędy składni, niespójności w nazewnictwie, niezainicjowane zmienne, nadużycie pamięci, zbyt złożone instrukcje warunkowe, brak obsługi wyjątków itp. Testy statyczne pozwalają programistom na wykrycie błędów i problemy zanim kod zostanie skompilowany i uruchomiony, co przyczynia się do szybszego i bardziej efektywnego procesu testowania i debugowania.
Nikt jeszcze nie komentował. Bądź pierwszy!