Initial commit

This commit is contained in:
Zhongwei Li
2025-11-29 17:59:01 +08:00
commit dbe64cbfbb
8 changed files with 568 additions and 0 deletions

View File

@@ -0,0 +1,159 @@
---
name: elegant-objects
description: >
Vérifie la conformité du code PHP aux principes Elegant Objects de Yegor Bugayenko.
Analyse un fichier spécifique ou tous les fichiers modifiés dans la branche.
allowed-tools: [Bash, Read, Grep, Glob]
model: sonnet
---
# Elegant Objects Reviewer Skill
## Variables
```bash
TARGET="$ARGUMENTS" # Fichier spécifique ou vide pour fichiers modifiés
```
## Workflow
### Étape 1: Déterminer les fichiers à analyser
```bash
if [ -n "$TARGET" ] && [ -f "$TARGET" ]; then
# Fichier spécifique fourni
FILES_TO_ANALYZE="$TARGET"
echo "📁 Analyse du fichier: $TARGET"
else
# Fichiers PHP modifiés dans la branche
BASE_BRANCH=$(git rev-parse --abbrev-ref HEAD@{upstream} 2>/dev/null || echo "main")
FILES_TO_ANALYZE=$(git diff --name-only "$BASE_BRANCH"...HEAD -- '*.php' 2>/dev/null || git diff --name-only HEAD -- '*.php')
if [ -z "$FILES_TO_ANALYZE" ]; then
echo "⚠️ Aucun fichier PHP modifié détecté"
exit 0
fi
echo "📁 Fichiers PHP modifiés dans la branche:"
echo "$FILES_TO_ANALYZE" | while read f; do echo " - $f"; done
fi
```
### Étape 2: Analyser chaque fichier
Pour chaque fichier PHP, vérifier les règles Elegant Objects.
#### Règles de conception des classes
1. **Classes final** - Toutes les classes doivent être `final` (sauf abstraites)
2. **Attributs max 4** - Chaque classe encapsule 1 à 4 attributs maximum
3. **Pas de getters** - Éviter les méthodes `getX()` (modèle anémique)
4. **Pas de setters** - Éviter les méthodes `setX()` (mutabilité)
5. **Pas de méthodes statiques** - Strictement interdites dans les classes
6. **Pas de classes utilitaires** - Classes avec uniquement des méthodes statiques interdites
7. **Noms sans -er** - Noms de classes ne finissant pas par -er (Manager, Handler, Helper...)
8. **Constructeur unique** - Un seul constructeur principal par classe
9. **Constructeurs simples** - Ne contiennent que des affectations
#### Règles de méthodes
1. **Pas de retour null** - Les méthodes ne doivent jamais retourner `null`
2. **Pas d'argument null** - `null` ne doit pas être passé en argument
3. **Corps sans lignes vides** - Les corps de méthodes sans lignes vides
4. **Corps sans commentaires** - Les corps de méthodes sans commentaires inline
5. **Noms verbes simples** - Noms de méthodes sont des verbes simples (pas composés)
6. **CQRS** - Séparation commandes (void) et queries (retour valeur)
#### Règles de style
1. **Messages sans point final** - Messages d'erreur/log sans point final
2. **Messages une phrase** - Messages d'erreur/log en une seule phrase
3. **Fail fast** - Exceptions lancées au plus tôt
#### Règles de tests
1. **Une assertion par test** - Chaque test ne contient qu'une assertion
2. **Assertion dernière** - L'assertion est la dernière instruction
3. **Pas de setUp/tearDown** - Ne pas utiliser ces méthodes
4. **Noms français** - Noms de tests en français décrivant le comportement
5. **Messages négatifs** - Assertions avec messages d'échec négatifs
6. **Pas de constantes partagées** - Pas de littéraux statiques partagés
### Étape 3: Générer le rapport
Format du rapport:
```
## Score de conformité Elegant Objects
Score global: X/100
## Violations critiques (bloquantes)
### [Règle violée]
- **Fichier:** /chemin/fichier.php:ligne
- **Problème:** Description précise
- **Suggestion:** Code corrigé ou approche
## Violations majeures (à corriger)
[Même format]
## Recommandations (améliorations)
[Même format]
## Statistiques
- Fichiers analysés: X
- Classes analysées: Y
- Méthodes analysées: Z
- Tests analysés: W
- Total violations: N
## Prochaines étapes
Liste priorisée des corrections à effectuer
```
## Calcul du score
- Violation critique: -10 points
- Violation majeure: -5 points
- Recommandation: -2 points
- Score de base: 100
## Patterns à détecter (regex)
```php
# Classes non-final
/^class\s+\w+/ # sans 'final' avant
# Getters
/public\s+function\s+get[A-Z]\w*\s*\(/
# Setters
/public\s+function\s+set[A-Z]\w*\s*\(/
# Méthodes statiques
/public\s+static\s+function/
# Noms en -er
/class\s+\w+(er|or|Manager|Handler|Helper|Builder|Factory|Provider|Controller|Processor)\b/
# Retour null
/return\s+null\s*;/
# Lignes vides dans méthodes
/\{\s*\n\s*\n/ # ouverture suivie de ligne vide
# Commentaires dans corps
/^\s+\/\// # à l'intérieur des méthodes
```
## Notes
- Ignorer fichiers vendor/, var/, cache/
- Contexte framework Symfony considéré (Controllers tolérés)
- Prioriser violations par criticité
- Proposer code corrigé quand possible