rmayormartins commited on
Commit
3f4b0f0
·
1 Parent(s): 7f98838

JAVA-OO333

Browse files
Files changed (1) hide show
  1. app.py +86 -33
app.py CHANGED
@@ -38,7 +38,7 @@ class JavaPOOEvaluator:
38
  else:
39
  feedback.append("⚠ Nenhuma instância de objeto criada.")
40
  except Exception as e:
41
- feedback.append(f"⚠ Erro ao analisar classes e objetos: {e}")
42
 
43
  return score, feedback
44
 
@@ -61,6 +61,31 @@ class JavaPOOEvaluator:
61
 
62
  return score, feedback
63
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
64
  def analyze_inheritance(self, code: str) -> Tuple[float, List[str]]:
65
  """Avalia o uso de herança"""
66
  score = 0
@@ -76,27 +101,52 @@ class JavaPOOEvaluator:
76
  else:
77
  feedback.append("⚠ Nenhum uso de herança encontrado.")
78
  except Exception as e:
79
- feedback.append(f"⚠ Erro ao analisar herança: {e}")
80
 
81
  return score, feedback
82
 
83
- def analyze_encapsulation(self, code: str) -> Tuple[float, List[str]]:
84
- """Avalia o encapsulamento"""
85
  score = 0
86
  feedback = []
87
 
88
  try:
89
  tree = javalang.parse.parse(code)
90
- fields = list(tree.filter(javalang.tree.FieldDeclaration))
91
- private_count = sum(1 for _, node in fields if 'private' in node.modifiers)
 
 
 
 
 
 
 
92
 
93
- if private_count:
 
 
 
 
 
 
 
 
 
 
 
 
94
  score += 5
95
- feedback.append(f"✓ {private_count} atributo(s) encapsulado(s) com 'private'.")
 
 
 
 
 
 
96
  else:
97
- feedback.append("⚠ Nenhum atributo privado encontrado.")
98
  except Exception as e:
99
- feedback.append(f"⚠ Erro ao analisar encapsulamento: {e}")
100
 
101
  return score, feedback
102
 
@@ -106,8 +156,14 @@ class JavaPOOEvaluator:
106
  meth_score, meth_feedback = self.analyze_methods(code)
107
  enc_score, enc_feedback = self.analyze_encapsulation(code)
108
  inh_score, inh_feedback = self.analyze_inheritance(code)
 
 
 
 
 
 
 
109
 
110
- total_score = cls_score + meth_score + enc_score + inh_score
111
  proficiency = "Necessita Melhorias"
112
  if total_score >= 90:
113
  proficiency = "Excelente"
@@ -118,48 +174,45 @@ class JavaPOOEvaluator:
118
 
119
  return {
120
  "total_score": total_score,
 
 
121
  "proficiency": proficiency,
122
  "feedback": {
123
  "classes_objetos": cls_feedback,
124
  "metodos": meth_feedback,
125
  "encapsulamento": enc_feedback,
126
  "heranca": inh_feedback,
 
 
127
  }
128
  }
129
 
130
  # Interface Gradio
131
- with gr.Blocks(title="Avaliador de POO em Java", css="#rubric_image img {max-width: 50%; height: auto; margin: 0 auto;}") as demo:
132
  gr.Markdown("# Avaliador de POO em Java")
133
- gr.Markdown("### [Visualizar a Rubrica em PDF](rubric.pdf)")
134
- gr.Image("rubric_table.png", label="Tabela Resumida da Rubrica", elem_id="rubric_image")
135
-
136
  upload = gr.File(label="Carregue arquivos Java para avaliação", file_types=[".java"], file_count="multiple")
137
  evaluate_button = gr.Button("Avaliar Código")
138
  output = gr.Textbox(label="Resultado da Avaliação", lines=25)
139
 
140
  def evaluate_code_files(files) -> str:
141
- """Função para avaliar múltiplos arquivos Java"""
142
  evaluator = JavaPOOEvaluator()
143
  results = []
144
 
145
  for file in files:
146
- try:
147
- with open(file.name, 'r', encoding='utf-8') as f:
148
- code = f.read()
149
- evaluation = evaluator.evaluate_code(code)
150
-
151
- result = f"\nArquivo: {file.name}\n"
152
- result += f"Pontuação Total: {evaluation['total_score']:.1f}/100\n"
153
- result += f"Nível: {evaluation['proficiency']}\n\n"
154
- result += "Feedback Detalhado:\n"
155
- for category, comments in evaluation['feedback'].items():
156
- result += f"\n{category.replace('_', ' ').title()}:\n"
157
- for comment in comments:
158
- result += f" {comment}\n"
159
- results.append(result)
160
- except Exception as e:
161
- results.append(f"Erro ao processar o arquivo {file.name}: {e}")
162
-
163
  return "\n".join(results)
164
 
165
  evaluate_button.click(fn=evaluate_code_files, inputs=upload, outputs=output)
 
38
  else:
39
  feedback.append("⚠ Nenhuma instância de objeto criada.")
40
  except Exception as e:
41
+ feedback.append("⚠ Erro ao analisar classes e objetos.")
42
 
43
  return score, feedback
44
 
 
61
 
62
  return score, feedback
63
 
64
+ def analyze_encapsulation(self, code: str) -> Tuple[float, List[str]]:
65
+ """Avalia encapsulamento e uso de modificadores"""
66
+ score = 0
67
+ feedback = []
68
+
69
+ try:
70
+ tree = javalang.parse.parse(code)
71
+ fields = list(tree.filter(javalang.tree.FieldDeclaration))
72
+
73
+ private_count = sum(1 for _, node in fields if 'private' in node.modifiers)
74
+ if private_count:
75
+ score += 5
76
+ feedback.append(f"✓ {private_count} atributo(s) encapsulado(s) com 'private'.")
77
+
78
+ getters_setters = [method for _, method in tree.filter(javalang.tree.MethodDeclaration) if method.name.startswith('get') or method.name.startswith('set')]
79
+ if getters_setters:
80
+ score += 5
81
+ feedback.append(f"✓ {len(getters_setters)} getter(s) ou setter(s) implementado(s).")
82
+ else:
83
+ feedback.append("⚠ Nenhum getter ou setter encontrado.")
84
+ except Exception as e:
85
+ feedback.append("⚠ Erro ao analisar encapsulamento.")
86
+
87
+ return score, feedback
88
+
89
  def analyze_inheritance(self, code: str) -> Tuple[float, List[str]]:
90
  """Avalia o uso de herança"""
91
  score = 0
 
101
  else:
102
  feedback.append("⚠ Nenhum uso de herança encontrado.")
103
  except Exception as e:
104
+ feedback.append("⚠ Erro ao analisar herança.")
105
 
106
  return score, feedback
107
 
108
+ def analyze_polymorphism(self, code: str) -> Tuple[float, List[str]]:
109
+ """Avalia o uso de polimorfismo"""
110
  score = 0
111
  feedback = []
112
 
113
  try:
114
  tree = javalang.parse.parse(code)
115
+ overridden_methods = [node for _, node in tree.filter(javalang.tree.MethodDeclaration) if 'Override' in (node.annotations or [])]
116
+
117
+ if overridden_methods:
118
+ score += 10
119
+ feedback.append(f"✓ {len(overridden_methods)} método(s) sobrescrito(s) corretamente.")
120
+ else:
121
+ feedback.append("⚠ Nenhum uso de polimorfismo encontrado.")
122
+ except Exception as e:
123
+ feedback.append("⚠ Erro ao analisar polimorfismo.")
124
 
125
+ return score, feedback
126
+
127
+ def analyze_abstraction(self, code: str) -> Tuple[float, List[str]]:
128
+ """Avalia o uso de abstração"""
129
+ score = 0
130
+ feedback = []
131
+
132
+ try:
133
+ tree = javalang.parse.parse(code)
134
+ abstract_classes = [node for _, node in tree.filter(javalang.tree.ClassDeclaration) if 'abstract' in node.modifiers]
135
+ interfaces = list(tree.filter(javalang.tree.InterfaceDeclaration))
136
+
137
+ if abstract_classes:
138
  score += 5
139
+ feedback.append(f"✓ {len(abstract_classes)} classe(s) abstrata(s) declarada(s).")
140
+ else:
141
+ feedback.append("⚠ Nenhuma classe abstrata encontrada.")
142
+
143
+ if interfaces:
144
+ score += 5
145
+ feedback.append(f"✓ {len(interfaces)} interface(s) declarada(s).")
146
  else:
147
+ feedback.append("⚠ Nenhuma interface encontrada.")
148
  except Exception as e:
149
+ feedback.append("⚠ Erro ao analisar abstração.")
150
 
151
  return score, feedback
152
 
 
156
  meth_score, meth_feedback = self.analyze_methods(code)
157
  enc_score, enc_feedback = self.analyze_encapsulation(code)
158
  inh_score, inh_feedback = self.analyze_inheritance(code)
159
+ poly_score, poly_feedback = self.analyze_polymorphism(code)
160
+ abs_score, abs_feedback = self.analyze_abstraction(code)
161
+
162
+ essential_score = cls_score + meth_score
163
+ bonus_score = enc_score + inh_score + poly_score + abs_score
164
+ total_score = essential_score + bonus_score
165
+ total_score = min(100, total_score)
166
 
 
167
  proficiency = "Necessita Melhorias"
168
  if total_score >= 90:
169
  proficiency = "Excelente"
 
174
 
175
  return {
176
  "total_score": total_score,
177
+ "essential_score": essential_score,
178
+ "bonus_score": bonus_score,
179
  "proficiency": proficiency,
180
  "feedback": {
181
  "classes_objetos": cls_feedback,
182
  "metodos": meth_feedback,
183
  "encapsulamento": enc_feedback,
184
  "heranca": inh_feedback,
185
+ "polimorfismo": poly_feedback,
186
+ "abstracao": abs_feedback,
187
  }
188
  }
189
 
190
  # Interface Gradio
191
+ with gr.Blocks(title="Avaliador de POO em Java") as demo:
192
  gr.Markdown("# Avaliador de POO em Java")
 
 
 
193
  upload = gr.File(label="Carregue arquivos Java para avaliação", file_types=[".java"], file_count="multiple")
194
  evaluate_button = gr.Button("Avaliar Código")
195
  output = gr.Textbox(label="Resultado da Avaliação", lines=25)
196
 
197
  def evaluate_code_files(files) -> str:
 
198
  evaluator = JavaPOOEvaluator()
199
  results = []
200
 
201
  for file in files:
202
+ with open(file.name, 'r', encoding='utf-8') as f:
203
+ code = f.read()
204
+ evaluation = evaluator.evaluate_code(code)
205
+
206
+ result = f"\nArquivo: {file.name}\n"
207
+ result += f"Pontuação Total: {evaluation['total_score']:.1f}/100\n"
208
+ result += f"Nível: {evaluation['proficiency']}\n\n"
209
+ result += "Feedback Detalhado:\n"
210
+ for category, comments in evaluation['feedback'].items():
211
+ result += f"\n{category.replace('_', ' ').title()}:\n"
212
+ for comment in comments:
213
+ result += f" {comment}\n"
214
+ results.append(result)
215
+
 
 
 
216
  return "\n".join(results)
217
 
218
  evaluate_button.click(fn=evaluate_code_files, inputs=upload, outputs=output)