Ontwerp een geautomatiseerde code refactoring tool
description
Met deze prompt krijg je gerichte ondersteuning bij het ontwikkelen van een tool die je helpt om automatisch je code te verbeteren. Dit bespaart tijd, verhoogt de codekwaliteit en maakt je software onderhoudsvriendelijker. In tegenstelling tot algemene refactoring adviezen, biedt deze prompt concrete technieken en een voorbeeldimplementatie, waardoor je sneller aan de slag kunt.
prompt
Help me bij het ontwerpen van een geautomatiseerde tool die mijn bestaande code kan analyseren en refactoren om de leesbaarheid en onderhoudbaarheid te verbeteren. Beschrijf welke technieken ...
try_prompt
generate_helper
disclaimerOnPageApi
tags
ai_answers
provider: openai
model: gpt-4.1-nano
Natuurlijk! Hier is een overzicht van technieken en algoritmes die je kunt gebruiken voor het detecteren van codegeuren en het voorstellen van verbeteringen, plus een voorbeeld in Python.
**Technieken en algoritmes voor detectie en refactoring:**
1. **Static Code Analysis (Statische code-analyse):**
Analysetools die de code zonder uitvoering scannen op patronen die wijzen op codegeuren (bijv. lange functies, duplicatie, complexe conditionele logica).
2. **Pattern Matching en Regelgebaseerde Detectie:**
Gebruik reguliere expressies of abstracte syntaxbomen (AST) om specifieke codepatronen te identificeren die duiden op codegeuren.
3. **Abstracte Syntax Trees (AST):**
Door de code om te zetten naar een AST kun je structureel patronen detecteren, zoals diepe geneste functies of grote classes.
4. **Machine Learning (optioneel):**
Training van modellen op voorbeeldcode om codegeuren te classificeren en suggesties te doen, al is dit complex en minder gebruikelijk.
5. **Refactoring Suggesties:**
Na detectie kunnen heuristieken en regels worden toegepast om verbeteringen voor te stellen, bijvoorbeeld het splitsen van grote functies of het elimineren van duplicatie.
**Voorbeeld aanpak in Python:**
- Gebruik de `ast` module om de code te parsen.
- Detecteer bijvoorbeeld functies langer dan een bepaalde regelcount.
- Detecteer duplicatie door code te vergelijken (bijvoorbeeld met hashingen of tekstvergelijking).
- Voorgestelde verbeteringen: functies splitsen, duplicaten verwijderen.
---
**Voorbeeldimplementatie in Python:**
```python
import ast
class CodeAnalyzer(ast.NodeVisitor):
def __init__(self):
self.long_functions = []
self.function_lengths = {}
self.code_duplicates = []
def visit_FunctionDef(self, node):
# Meet de lengte van de functie
start_line = node.lineno
end_line = self._find_end_line(node)
length = end_line - start_line + 1
self.function_lengths[node.name] = length
if length > 20: # voorbeeld drempel voor lange functies
self.long_functions.append((node.name, length))
self.generic_visit(node)
def _find_end_line(self, node):
# Bepaal de laatste regel van een functie
max_lineno = node.lineno
for child in ast.walk(node):
if hasattr(child, 'lineno'):
if child.lineno > max_lineno:
max_lineno = child.lineno
return max_lineno
def detect_long_functions(code, threshold=20):
tree = ast.parse(code)
analyzer = CodeAnalyzer()
analyzer.visit(tree)
return analyzer.long_functions
def main():
code = '''
def korte_functie():
pass
def lange_functie():
# Simuleer lange functie
for i in range(25):
print(i)
'''
long_funcs = detect_long_functions(code, threshold=10)
if long_funcs:
print("Gevonden lange functies (meer dan 10 regels):")
for name, length in long_funcs:
print(f"- {name} ({length} regels)")
print("Aanbevolen: functies splitsen of refactoren voor betere leesbaarheid.")
else:
print("Geen lange functies gevonden.")
if __name__ == "__main__":
main()
```
**Samenvatting:**
- Gebruik AST voor structuuranalyses.
- Detecteer codegeuren zoals lange functies.
- Stel refactoringen voor, zoals functies splitsen.
- Voor complexere detectie (duplicatie, complexiteit) kunnen externe tools of meer geavanceerde algoritmes worden ingezet.
Wil je een uitgebreidere versie of specifieke codegeuren detecteren?
provider: deepseek
model: deepseek-chat
Zeker, hierbij een gedetailleerd overzicht voor het ontwerpen van een geautomatiseerde refactoring-tool in Python.
### Technieken en Algoritmes voor Code-analyse
**1. Abstract Syntax Trees (AST) Parsing**
- **Gebruik**: `ast` module in Python om code te parseren naar een boomstructuur
- **Doel**: Structurele analyse van code zonder deze uit te voeren
- **Toepassing**: Detectie van complexe geneste structuren, lange functies, identifier naming
**2. Statische Code Analyse**
- **Metriek berekening**:
- Cyclomatische complexiteit (McCabe)
- Lines of Code (LOC) per functie/klasse
- Nesting depth van controlestructuren
- Comment density ratio
**3. Pattern Matching voor Codegeuren**
- **Lange Methode**: Functies > 15 regels code
- **Grote Klasse**: Klassen met te veel verantwoordelijkheden
- **Duplicate Code**: Identieke of vergelijkbare codefragmenten
- **Primitive Obsession**: Overmatig gebruik primitieve types i.p.v. objecten
**4. Natural Language Processing (NLP)**
- **Naamconventies**: Analyse van identifier namen (camelCase, snake_case)
- **Semantische analyse**: Consistentie in naming (bijv. `get_user()` vs `fetch_data()`)
**5. Machine Learning (Optioneel)**
- Getrainde modellen voor codekwaliteitsvoorspelling
- Anomaliedetectie in codepatronen
### Voorbeeldimplementatie in Python
```python
import ast
import astor
from collections import defaultdict
import radon.metrics
from radon.complexity import cc_visit
class CodeAnalyzer(ast.NodeVisitor):
def __init__(self):
self.issues = []
self.function_lengths = defaultdict(int)
self.current_function = None
def visit_FunctionDef(self, node):
self.current_function = node.name
lines = node.end_lineno - node.lineno if node.end_lineno else 0
self.function_lengths[node.name] = lines
# Detectie lange methoden
if lines > 15:
self.issues.append({
'type': 'LONG_METHOD',
'message': f'Functie {node.name} is te lang ({lines} regels)',
'line': node.lineno,
'suggestion': 'Split de functie in kleinere, herbruikbare onderdelen'
})
self.generic_visit(node)
self.current_function = None
def visit_If(self, node):
# Detectie diepe nesting
nesting_level = self.get_nesting_level(node)
if nesting_level > 3:
self.issues.append({
'type': 'DEEP_NESTING',
'message': f'Te diepe geneste structuren (niveau {nesting_level})',
'line': node.lineno,
'suggestion': 'Overweeg guard clauses of extract method'
})
self.generic_visit(node)
def get_nesting_level(self, node, level=0):
parent = node
while hasattr(parent, 'parent'):
if isinstance(parent, (ast.If, ast.For, ast.While, ast.Try)):
level += 1
parent = parent.parent
return level
class RefactoringTool:
def __init__(self):
self.analyzer = CodeAnalyzer()
def analyze_code(self, code):
"""Analyseer code en identificeer codegeuren"""
tree = ast.parse(code)
# Voeg parent referenties toe voor nesting analyse
for node in ast.walk(tree):
for child in ast.iter_fields(node):
if isinstance(child, ast.AST):
child.parent = node
self.analyzer.visit(tree)
return self.analyzer.issues
def suggest_refactorings(self, issues):
"""Genereer refactoring suggesties op basis van issues"""
suggestions = []
for issue in issues:
if issue['type'] == 'LONG_METHOD':
suggestions.append({
'action': 'EXTRACT_METHOD',
'target': issue['message'].split()[1],
'description': issue['suggestion']
})
elif issue['type'] == 'DEEP_NESTING':
suggestions.append({
'action': 'SIMPLIFY_CONDITIONALS',
'target': f'regel {issue["line"]}',
'description': 'Vervang geneste conditionals door guard clauses'
})
return suggestions
def refactor_code(self, code, suggestions):
"""Pas automatische refactoring toe (basisimplementatie)"""
tree = ast.parse(code)
# Implementeer hier daadwerkelijke AST transformaties
# Bijv.: extract method, rename variable, etc.
return astor.to_source(tree)
# Gebruiksvoorbeeld
def demo_refactoring_tool():
sample_code = """
def calculate_total(items, user):
total = 0
for item in items:
if item.available:
if user.premium:
discount = 0.2
else:
if user.member:
discount = 0.1
else:
discount = 0
price = item.price * (1 - discount)
total += price
return total
"""
tool = RefactoringTool()
issues = tool.analyze_code(sample_code)
print("Gevonden codegeuren:")
for issue in issues:
print(f"- {issue['message']} (regel {issue['line']})")
suggestions = tool.suggest_refactorings(issues)
print("\nRefactoring suggesties:")
for suggestion in suggestions:
print(f"- {suggestion['action']}: {suggestion['description']}")
# Refactored code (conceptueel)
refactored = tool.refactor_code(sample_code, suggestions)
print(f"\nRefactored code:\n{refactored}")
if __name__ == "__main__":
demo_refactoring_tool()
```
### Aanbevolen Python Bibliotheken
1. **`ast`** - Standaard AST parsing
2. **`astor`** - AST naar code terug converteren
3. **`radon`** - Code metrics en complexiteit
4. **`rope`** - Refactoring library voor Python
5. **`pylint`**/**`flake8`** - Statische analyse
### Uitbreidingsmogelijkheden
- **Integration met IDE's**: Plugins voor VSCode/PyCharm
- **CI/CD Integration**: Automatische code reviews
- **Learning Mode**: Suggesties op basis van projectgeschiedenis
- **Test Generation**: Automatische testgeneratie bij refactoring
Deze tool zou kunnen evolueren naar een volwaardig codekwaliteitsplatform met continue analyse en automatische verbeteringssuggesties.