slogan3

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

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.