Aller au contenu

duplicate-code-semantic

Catégorie : Code dupliqué
Sévérité : Avertissement
Déclenchée par : pyscn analyze, pyscn check --select clones

Ce que fait cette règle

Signale les blocs de code syntaxiquement différents qui calculent le même résultat (clones de Type 4, similarité ≥ 0,65). Utilise l'analyse de flot de données pour comparer le comportement plutôt que la structure.

Pourquoi est-ce un problème ?

Les clones sémantiques sont les duplications que vous ne remarquez pas pendant la revue. Une fonction utilise une boucle, l'autre une compréhension ; l'une construit un dictionnaire via update, l'autre via la syntaxe de fusion. Le code a l'air différent et passe donc l'inspection visuelle, mais les deux implémentations font le même travail.

Les risques sont les mêmes que pour toute duplication — les modifications doivent être faites à plusieurs endroits — mais il y a un coût supplémentaire. Les lecteurs ne peuvent pas dire d'un coup d'œil si les deux implémentations s'accordent sur les cas limites. La version en boucle saute-t-elle aussi les None ? La compréhension lève-t-elle une exception sur une entrée vide ? L'audit mental doit être refait à chaque fois.

Réduire à une implémentation unique supprime l'audit et la divergence.

Exemple

def unique_emails(users):
    seen = set()
    result = []
    for u in users:
        if u.email not in seen:
            seen.add(u.email)
            result.append(u.email)
    return result

def distinct_emails(users):
    return list({u.email: None for u in users}.keys())

À utiliser à la place

Choisissez une implémentation et utilisez-la partout. Préférez la version la plus claire ; si les deux ont du mérite, conservez l'une et documentez pourquoi.

def unique_emails(users):
    """Return user emails in first-seen order, without duplicates."""
    return list(dict.fromkeys(u.email for u in users))

Options

Option Valeur par défaut Description
clones.type4_threshold 0.65 Similarité minimale pour qu'une paire soit signalée comme sémantique.
clones.enable_dfa true Active l'analyse de flot de données qui alimente la détection de Type 4.
clones.similarity_threshold 0.65 Plancher global appliqué avant les seuils par type.
clones.enabled_clone_types ["type1","type2","type4"] Incluez "type4" pour garder cette règle active.
clones.min_lines 5 Taille minimale du fragment en lignes.

Références