Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Sugerencias con respecto a Principios Solid #3

Open
TingoCarlos08 opened this issue Nov 13, 2023 · 0 comments
Open

Sugerencias con respecto a Principios Solid #3

TingoCarlos08 opened this issue Nov 13, 2023 · 0 comments

Comments

@TingoCarlos08
Copy link
Collaborator

TingoCarlos08 commented Nov 13, 2023

Diagrama UML del proyecto:

image

S - Principio de responsabilidad única (SRP)

En la clase “CopaMundial” en el método “listaCopasMundiales” realiza varias tareas, como la lectura de archivos, el procesamiento de datos y la manipulación de excepciones. Sería mejor dividir estas responsabilidades en métodos más pequeños y específicos.

Se crea una nueva clase llamada Mundial y el método listaCopasMundiales pasa a la clase Mundial.

public class Mundial {

 public static void main(String[] args) { 

    Equipo equipo = new Equipo(); 

    Partido partido = new Partido(); 

            Mundial mundial = new Mundial(); 

    ArrayList<CopaMundial> copasMundiales = mundial.listaCopasMundiales("copasMundiales.txt"); 

} 

 public ArrayList<CopaMundial> listaCopasMundiales(String archivo) { 

    ArrayList<CopaMundial> copasMundiales = new ArrayList<>(); 

    try (BufferedReader bf = new BufferedReader(new FileReader(archivo))) { 

        String linea; 

        while ((linea = bf.readLine()) != null) { 

            copasMundiales.add(CopaMundialMapper.crearCopaMundialDesdeLinea(linea)); 

        } 

    } catch (IOException ioe) { 

        // Manejo de excepciones 

    } 

    return copasMundiales; 

} 

}

Clase copaMundial con atributos y metodos

class CopaMundial {

// Atributos y métodos de Copa Mundial 

}

Creación de clase “CopaMundialMappeo” para manejar la lógica de mapeo desde una línea del archivo a un objeto “CopaMundial”.

class CopaMundialMapeo {

public static CopaMundial crearCopaMundialDesdeLinea(String linea) { 

    String[] datos = linea.split(","); 

            return new CopaMundial(Parámetros); 

} 

}

image

También se tiene la clase “Jugador” con el método “listaJugadores” realiza varias tareas, como la lectura de archivos, el procesamiento de datos y la manipulación de excepciones. Sería mejor dividir estas responsabilidades en métodos más pequeños y específicos.

Se crea una interfaz “JugadorReader” para abstraer el proceso de lectura de datos de los jugadores.

interface JugadorReader {

List<Jugador> readJugadores(String archivo) throws IOException; 

}

Se implementa la clase “JugadorFileReader” para manejar la lectura de datos desde un archivo.

class JugadorFileReader implements JugadorReader {

@Override 

public List<Jugador> readJugadores(String archivo) throws IOException { 

    List<Jugador> listaJ = new ArrayList<>(); 

    try (BufferedReader bf = new BufferedReader(new FileReader(archivo, StandardCharsets.UTF_8))) { 

        String linea; 

        while ((linea = bf.readLine()) != null) { 

            String[] datos = linea.trim().split(","); 

            listaJ.add(JugadorMapper.crearJugadorDesdeDatos(datos)); 

        } 

    } 

    listaJ.remove(0); 

    return listaJ; 

} 

}

Y por último se crea la clase "JugadorMappeo” para encapsular la lógica de creación de objetos Jugador desde datos.

class JugadorMappeo {

public static Jugador crearJugadorDesdeDatos(String[] datos) { 

    // Lógica para crear un jugador desde datos... 

    return new Jugador (datos[0].trim(), datos[1].trim(), datos[2].trim(), datos[3].trim(), 

            datos[4].trim(), datos[5].trim(), datos[6].trim(), datos[7].trim(), datos[8].trim(), null); 

} 

}

public class Jugador {

private String roundId; 

private String matchId; 

private String inciales; 

private String entrenador; 

private String alineacion; 

private String numeroCamiseta; 

private String nombreJug; 

private String position; 

private String evento; 



// Constructor y métodos getter y setter... 

@Override 

public String toString() { 

    return nombreJug + "_" + inciales; 

} 

}

image

Además de la clase “Partido” el método “listaPartido” realiza múltiples tareas, como la lectura de archivos y la creación de objetos Partido. La solución para esto sería dividir estas responsabilidades en métodos más pequeños y específicos.

Se crea una interfaz “PartidoReader” para abstraer el proceso de lectura de datos de los partidos.

interface PartidoReader {

List<Partido> readPartidos(String archivo) throws IOException; 

}

Se implementa la clase “PartidoFileReader” para manejar la lectura de datos desde un archivo.

class PartidoFileReader implements PartidoReader {

@Override 

public List<Partido> readPartidos(String archivo) throws IOException { 

    List<Partido> listaPartidos = new ArrayList<>(); 

    try (BufferedReader bf = new BufferedReader(new FileReader(archivo))) { 

        String linea; 

        while ((linea = bf.readLine()) != null) { 

            String[] datos = linea.split("\\|"); 

            listaPartidos.add(PartidoMapper.crearPartidoDesdeDatos(datos)); 

        } 

    } 

    listaPartidos.remove(0); 

    return listaPartidos; 

} 

}

Se crea la clase “PartidoMappeo” para encapsular la lógica de creación de objetos “Partido” desde datos.

class PartidoMappeo {

public static Partido crearPartidoDesdeDatos(String[] datos) { 

    // Lógica para crear un partido desde datos... 

    return new Partido( 

            datos[0].trim(), datos[1].trim(), datos[2].trim(), datos[3].trim(), 

            datos[4].trim(), datos[5].trim(), datos[6].trim(), datos[7].trim(), 

            datos[8].trim(), datos[9].trim(), datos[10].trim(), datos[11].trim(), 

            datos[12].trim(), datos[13].trim(), datos[14].trim(), datos[15].trim(), 

            datos[16].trim(), datos[17].trim(), datos[18].trim(), datos[19].trim() 

    ); 

} 

}

image

O - Principio de Abierto/Cerrado (OCP - Open/Closed Principle)

La clase “CopaMundial” no tiene métodos o extensiones que permitan una fácil extensión sin modificar el código existente. Podría ser beneficioso agregar métodos o interfaces que permitan extensiones futuras sin modificar la clase actual.

import java.util.List;

// Interfaz para el gestor de la Copa Mundial

interface GestorCopaMundial {

void organizarCopaMundial(List<Partido> partidos); 



// Métodos para gestionar la Copa Mundial 

}

// Implementación específica del gestor de la Copa Mundial

class CopaMundial implements GestorCopaMundial {

private List<Partido> partidos; 



// Constructor 

public CopaMundial(List<Partido> partidos) { 

    this.partidos = partidos; 

} 



// Método para organizar la Copa Mundial 

@Override 

public void organizarCopaMundial(List<Partido> partidos) { 

    // Implementación para organizar la Copa Mundial 

    } 

}

image

D - Principio de Inversión de Dependencia (DIP - Dependency Inversion Principle):

La clase “CopaMundial”, “Jugador” y “Partido” depende directamente de las clases FileReader, BufferedReader, y ArrayList. Podría considerarse la inversión de estas dependencias mediante la introducción de interfaces o abstracciones.

DIP clase CopaMundial

import java.util.List;

// Interfaz para el gestor de la Copa Mundial

interface GestorCopaMundial {

void organizarCopaMundial(List<Partido> partidos); 

// Métodos adicionales para gestionar la Copa Mundial 

}

// Implementación del gestor de la Copa Mundial

class CopaMundial implements GestorCopaMundial {

private List<Partido> partidos; 

 public CopaMundial(List<Partido> partidos) { 

    this.partidos = partidos; 

} 



// Método para organizar la Copa Mundial 

@Override 

public void organizarCopaMundial(List<Partido> partidos) { 

    // Implementación para organizar la Copa Mundial 

    } 

}

image

DIP clase Jugadores

// Interfaz para el servicio de jugadores

interface ServicioJugadores {

List<Jugador> listaJugadores(String archivo); 

// Metodos de jugadores 

}

// Implementación específica del servicio de jugadores

class JugadorService implements ServicioJugadores {

@Override 

public List<Jugador> listaJugadores(String archivo) { 

    // Implementación para cargar jugadores desde un archivo 

   } 

}

image

DIP clase Partido

// Interfaz para el servicio de partidos

interface ServicioPartidos {

List<Partido> listaPartidos(String archivo); 

// Métodos de partidos 

}

// Implementación del servicio de partidos

class PartidoService implements ServicioPartidos {

@Override 

public List<Partido> listaPartidos(String archivo) { 

    // Implementación para cargar partidos desde un archivo 

    } 

}

image

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant