Przejdź do głównej zawartości

Najlepsze praktyki organizacji kodu

Właściwa organizacja kodu jest niezbędna dla utrzymania, skalowalności i współpracy zespołu.

Dobrze zorganizowany moduł XOOPS powinien następować tę strukturę:

mymodule/
├── xoops_version.php # Metadane modułu
├── index.php # Punkt wejścia frontenu
├── admin.php # Punkt wejścia admina
├── class/
│ ├── Controller/ # Obsługiwacze żądań
│ ├── Handler/ # Obsługiwacze danych
│ ├── Repository/ # Dostęp do danych
│ ├── Entity/ # Obiekty domenowe
│ ├── Service/ # Logika biznesowa
│ ├── DTO/ # Obiekty transferu danych
│ └── Exception/ # Wyjątki niestandardowe
├── templates/ # Szablony Smarty
│ ├── admin/ # Szablony admina
│ └── blocks/ # Szablony bloków
├── assets/
│ ├── css/ # Arkusze stylów
│ ├── js/ # JavaScript
│ └── images/ # Obrazy
├── sql/ # Schematy baz danych
├── tests/ # Testy jednostkowe i integracyjne
├── docs/ # Dokumentacja
└── composer.json # Konfiguracja Composer
Classes: PascalCase (UserController, PostRepository)
Methods: camelCase (getUserById, createUser)
Properties: camelCase ($userId, $username)
Constants: UPPER_SNAKE_CASE (DEFAULT_LIMIT, MAX_USERS)
Functions: snake_case (get_user_data, validate_email)
Files: PascalCase.php (UserController.php)
  • Jedna klasa na plik
  • Nazwa pliku odpowiada nazwie klasy
  • Struktura katalogów odpowiada hierarchii namespace
  • Trzymaj powiązane klasy razem
  • Używaj konsystentnego nazewnictwa w całym module
{
"autoload": {
"psr-4": {
"Xoops\\Module\\Mymodule\\": "class/"
}
}
}
<?php
class Autoloader
{
public static function register()
{
spl_autoload_register([self::class, 'autoload']);
}
public static function autoload($class)
{
$prefix = 'Xoops\\Module\\Mymodule\\';
if (strpos($class, $prefix) !== 0) {
return;
}
$relative = substr($class, strlen($prefix));
$file = __DIR__ . '/' .
str_replace('\\', '/', $relative) . '.php';
if (file_exists($file)) {
require $file;
}
}
}
?>
  • Każda klasa powinna mieć jeden powód do zmiany
  • Rozdziel obawy do różnych klas
  • Trzymaj klasy skoncentrowane i spójne
  • Używaj znaczących, opisowych nazw
  • Postępuj zgodnie ze standardami kodowania PSR-12
  • Unikaj skrótów, chyba że są oczywiste
  • Używaj konsystentnych wzorców
  • Grupuj powiązane klasy razem
  • Rozdziel obawy do podkatalogów
  • Trzymaj szablony i zasoby zorganizowane
  • Używaj konsystentnego nazewnictwa plików
  • Używaj odpowiednich namespace dla wszystkich klas
  • Postępuj zgodnie z autoładowaniem PSR-4
  • Namespace odpowiada strukturze katalogów
  • Scentralizuj konfigurację w katalogu konfiguracji
  • Używaj konfiguracji opartej na środowisku
  • Nie koduj ustawień na stałe
<?php
class Bootstrap
{
private static $serviceContainer;
private static $initialized = false;
public static function initialize()
{
if (self::$initialized) {
return;
}
global $xoopsDB;
self::$serviceContainer = new ServiceContainer($xoopsDB);
self::$initialized = true;
}
public static function getServiceContainer()
{
if (!self::$initialized) {
self::initialize();
}
return self::$serviceContainer;
}
}
?>

Zobacz też:

  • Obsługa błędów dla zarządzania wyjątkami
  • Testowanie dla organizacji testów
  • ../Patterns/MVC-Pattern dla struktury kontrolera

Tags: #best-practices #code-organization #psr-4 #module-development