-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathupdated-god-object-detection.py
66 lines (60 loc) · 1.73 KB
/
updated-god-object-detection.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
import ast
class AntiPatternDetector(ast.NodeVisitor):
def __init__(self, threshold: int = 10):
self.threshold = threshold
self.god_objects = []
def visit_ClassDef(self, node: ast.ClassDef) -> None:
method_count = 0
for child in ast.iter_child_nodes(node):
if isinstance(child, (ast.FunctionDef, ast.AsyncFunctionDef)):
method_count += 1
if method_count > self.threshold:
self.god_objects.append({
'name': node.name,
'lineno': node.lineno,
'col_offset': node.col_offset
})
def detect_anti_patterns(code: str, threshold: int = 10) -> list:
try:
tree = ast.parse(code)
detector = AntiPatternDetector(threshold)
detector.visit(tree)
return detector.god_objects
except Exception as e:
print(f"Error: {e}")
return []
def report_anti_patterns(anti_patterns: list) -> None:
if anti_patterns:
print("Detected anti-patterns:")
for pattern in anti_patterns:
print(f"- God Object: {pattern['name']} (line {pattern['lineno']}, column {pattern['col_offset']})")
else:
print("No anti-patterns detected.")
# example usage
code = """
class GodObject:
def method1(self):
pass
def method2(self):
pass
def method3(self):
pass
def method4(self):
pass
def method5(self):
pass
def method6(self):
pass
def method7(self):
pass
def method8(self):
pass
def method9(self):
pass
def method10(self):
pass
def method11(self):
pass
"""
anti_patterns = detect_anti_patterns(code)
report_anti_patterns(anti_patterns)