-
Notifications
You must be signed in to change notification settings - Fork 51
Correción de SRP en clase Admi.java #4
Copy link
Copy link
Open
Description
Problema actual
Actualmente, Admin.java hace tres cosas a la vez:
- Interfaz gráfica (UI): Crear botones, tablas, labels, etc.
- Lógica de negocio: Aprobar o rechazar usuarios, decidir acciones según su estado.
- Acceso a base de datos: Conectar, ejecutar consultas y actualizar datos.
Esto hace que la clase sea difícil de mantener y de probar.
Propuesta de solución usando SRP
Se propone separar responsabilidades en clases distintas:
User→ Modelo de datosAdminUI→ Interfaz y eventosAdminService→ Lógica de negocioUserRepository→ Acceso a base de datos
Código ejemplo de User
public class User {
private String name;
private String email;
private String password;
private String sq;
private String answer;
private String status;
public User(String name, String email, String password, String sq, String answer, String status) {
this.name = name;
this.email = email;
this.password = password;
this.sq = sq;
this.answer = answer;
this.status = status;
}
public String getName() { return name; }
public String getEmail() { return email; }
public String getPassword() { return password; }
public String getSq() { return sq; }
public String getAnswer() { return answer; }
public String getStatus() { return status; }
public void setStatus(String status) { this.status = status; }
}Código ejemplo de AdminUI
import javax.swing.*;
import javax.swing.table.DefaultTableModel;
import java.awt.event.*;
import java.util.List;
import java.util.Vector;
public class AdminUI extends JFrame {
private JTable jTable1;
private JTextField txtEmail;
private JButton jButtonSearch, jButtonRefresh, jButtonClose;
private JLabel jLabel1, jLabel2, jLabel4;
private AdminService adminService;
public AdminUI(AdminService adminService) {
this.adminService = adminService;
initComponents();
refreshTable();
txtEmail.requestFocus();
}
private void initComponents() {
setUndecorated(true);
getContentPane().setLayout(new org.netbeans.lib.awtextra.AbsoluteLayout());
jLabel1 = new JLabel("Double Click on Table row to change Status");
jLabel1.setFont(new java.awt.Font("Segoe UI", 1, 18));
jLabel1.setForeground(new java.awt.Color(0,0,153));
getContentPane().add(jLabel1, new org.netbeans.lib.awtextra.AbsoluteConstraints(540, 50, 410, 36));
jLabel2 = new JLabel("Search by Email");
jLabel2.setFont(new java.awt.Font("Segoe UI", 1, 18));
jLabel2.setForeground(new java.awt.Color(0,153,153));
getContentPane().add(jLabel2, new org.netbeans.lib.awtextra.AbsoluteConstraints(390, 150, 140, 30));
txtEmail = new JTextField();
getContentPane().add(txtEmail, new org.netbeans.lib.awtextra.AbsoluteConstraints(540, 140, 186, 40));
jButtonSearch = new JButton("Search");
jButtonSearch.setBackground(new java.awt.Color(204,0,0));
jButtonSearch.setForeground(new java.awt.Color(255,255,255));
jButtonSearch.setFont(new java.awt.Font("Segoe UI",1,14));
jButtonSearch.addActionListener(e -> onSearchButtonClicked());
getContentPane().add(jButtonSearch, new org.netbeans.lib.awtextra.AbsoluteConstraints(740, 150, -1, -1));
jButtonRefresh = new JButton("Refresh");
jButtonRefresh.setBackground(new java.awt.Color(204,0,0));
jButtonRefresh.setForeground(new java.awt.Color(255,255,255));
jButtonRefresh.setFont(new java.awt.Font("Segoe UI",1,14));
jButtonRefresh.addActionListener(e -> refreshTable());
getContentPane().add(jButtonRefresh, new org.netbeans.lib.awtextra.AbsoluteConstraints(820, 150, -1, -1));
jButtonClose = new JButton(new ImageIcon(getClass().getResource("/image/close.png")));
jButtonClose.addActionListener(e -> dispose());
getContentPane().add(jButtonClose, new org.netbeans.lib.awtextra.AbsoluteConstraints(1309, 0, -1, -1));
jTable1 = new JTable();
jTable1.setFont(new java.awt.Font("Segoe UI Semilight", 1, 14));
jTable1.setModel(new DefaultTableModel(
new Object [][] {},
new String [] {"Name", "Email", "Password", "Security Question", "Answer", "Status"}
) {
boolean[] canEdit = new boolean[] {false,false,false,false,false,false};
public boolean isCellEditable(int rowIndex, int columnIndex) { return canEdit[columnIndex]; }
});
jTable1.addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent evt) {
if(evt.getClickCount()==2) onTableRowDoubleClicked();
}
});
JScrollPane jScrollPane1 = new JScrollPane(jTable1);
getContentPane().add(jScrollPane1, new org.netbeans.lib.awtextra.AbsoluteConstraints(10, 200, 1340, 550));
jLabel4 = new JLabel(new ImageIcon(getClass().getResource("/image/admin Home.png")));
getContentPane().add(jLabel4, new org.netbeans.lib.awtextra.AbsoluteConstraints(0, 0, 1390, 770));
pack();
}
private void onSearchButtonClicked() {
String email = txtEmail.getText();
if(email.isEmpty()) {
JOptionPane.showMessageDialog(this,"Record Not Found");
} else {
List<User> users = adminService.getUsersByEmail(email);
updateTable(users);
}
}
private void onTableRowDoubleClicked() {
int selectedRow = jTable1.getSelectedRow();
if(selectedRow < 0) return;
DefaultTableModel model = (DefaultTableModel) jTable1.getModel();
String email = (String) model.getValueAt(selectedRow, 1);
String status = (String) model.getValueAt(selectedRow, 5);
User user = new User(
(String)model.getValueAt(selectedRow,0),
email,
(String)model.getValueAt(selectedRow,2),
(String)model.getValueAt(selectedRow,3),
(String)model.getValueAt(selectedRow,4),
status
);
int yes = JOptionPane.showConfirmDialog(this, "Change status for " + status + "?");
if(yes == JOptionPane.YES_OPTION) {
adminService.toggleUserStatus(user);
refreshTable();
}
}
private void updateTable(List<User> users) {
DefaultTableModel model = (DefaultTableModel) jTable1.getModel();
model.setRowCount(0);
for(User user : users) {
Vector<String> row = new Vector<>();
row.add(user.getName());
row.add(user.getEmail());
row.add(user.getPassword());
row.add(user.getSq());
row.add(user.getAnswer());
row.add(user.getStatus());
model.addRow(row);
}
}
private void refreshTable() {
List<User> users = adminService.getAllUsers();
updateTable(users);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> {
UserRepository repo = new UserRepository();
AdminService service = new AdminService(repo);
new AdminUI(service).setVisible(true);
});
}
}Código ejemplo de AdminService
import java.util.List;
public class AdminService {
private UserRepository userRepository;
public AdminService(UserRepository userRepository) {
this.userRepository = userRepository;
}
public List<User> getAllUsers() {
return userRepository.getAllUsers();
}
public List<User> getUsersByEmail(String email) {
return userRepository.findByEmail(email);
}
public void toggleUserStatus(User user) {
String newStatus = user.getStatus().equalsIgnoreCase("pending") ? "approved" : "pending";
user.setStatus(newStatus);
userRepository.updateStatus(user.getEmail(), newStatus);
}
}Código ejemplo de UserRepository
import java.sql.*;
import java.util.ArrayList;
import java.util.List;
public class UserRepository {
private Connection getConnection() throws SQLException, ClassNotFoundException {
Class.forName("com.mysql.cj.jdbc.Driver");
return DriverManager.getConnection("jdbc:mysql://localhost:3306/hotel","root","Sudhir@123");
}
public List<User> getAllUsers() {
List<User> users = new ArrayList<>();
try (Connection con = getConnection();
PreparedStatement pst = con.prepareStatement("SELECT * FROM signup");
ResultSet rs = pst.executeQuery()) {
while(rs.next()) {
users.add(new User(
rs.getString("name"),
rs.getString("email"),
rs.getString("password"),
rs.getString("sq"),
rs.getString("answer"),
rs.getString("status")
));
}
} catch(Exception e) { e.printStackTrace(); }
return users;
}
public List<User> findByEmail(String email) {
List<User> users = new ArrayList<>();
try (Connection con = getConnection();
PreparedStatement pst = con.prepareStatement("SELECT * FROM signup WHERE email=?")) {
pst.setString(1, email);
try (ResultSet rs = pst.executeQuery()) {
while(rs.next()) {
users.add(new User(
rs.getString("name"),
rs.getString("email"),
rs.getString("password"),
rs.getString("sq"),
rs.getString("answer"),
rs.getString("status")
));
}
}
} catch(Exception e) { e.printStackTrace(); }
return users;
}
public void updateStatus(String email, String status) {
try (Connection con = getConnection();
PreparedStatement pst = con.prepareStatement("UPDATE signup SET status=? WHERE email=?")) {
pst.setString(1, status);
pst.setString(2, email);
pst.executeUpdate();
} catch(Exception e) { e.printStackTrace(); }
}
}Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
No labels