Ejercicio: Análisis y documentación de código mediante herramientas de GitHub Copilot

Completado

GitHub Copilot puede ayudarle a comprender y documentar un código base mediante la generación de explicaciones y documentación. En este ejercicio, usará GitHub Copilot para analizar y documentar la aplicación de biblioteca. También creará un repositorio de GitHub para la aplicación de biblioteca y generará un archivo LÉAME para el repositorio mediante GitHub Copilot.

Este ejercicio incluye las siguientes tareas:

  • Use GitHub Copilot para explicar el código base de la aplicación de biblioteca.
  • Use Visual Studio Code para crear un repositorio de GitHub para la aplicación de biblioteca.
  • Use extensiones de GitHub Copilot para analizar la solución y crear un archivo README.md para el repositorio.

Examen del código base de la aplicación de biblioteca

Antes de crear un repositorio de código y un archivo LÉAME, debe tardar algún tiempo en examinar el código base. Es importante comprender la arquitectura de la aplicación y las características clave antes de documentar el proyecto. También debe ejecutar la aplicación para asegurarse de que funciona según lo previsto.

Uso de GitHub Copilot para explicar el código base de la aplicación de biblioteca

GitHub Copilot puede ayudarle a comprender un código base desconocido mediante la generación de explicaciones en los niveles de solución y características.

Completa los siguientes pasos para usar esta sección del ejercicio:

  1. Asegúrese de que tiene abierta la solución AccelerateDevGitHubCopilot en Visual Studio Code.

  2. Abra la vista Chat y escriba un mensaje que use el participante de @workspace GitHub Copilot para generar una descripción del proyecto.

    Por ejemplo, escriba el siguiente símbolo del sistema en la vista Chat:

    @workspace Describe this project
    
  3. Tómese un par de minutos para revisar la respuesta.

    Debería ver una respuesta similar a la descripción siguiente:

    This project is a library management system implemented in C#. It consists of three main components:
    
    1. **Library.ApplicationCore**: This is the core application library containing the main business logic, entities, enums, and interfaces. It includes:
    
        - Entities such as Book, Patron, Loan, etc.
        - Enums like MembershipRenewalStatus, LoanReturnStatus, and LoanExtensionStatus.
        - Services like LoanService and PatronService.
        - Interfaces like ILoanRepository, IPatronRepository, ILoanService, and IPatronService.
    
    2. **Library.Console**: This is a console application that interacts with the user. It includes:
    
        - The main entry point in Program.cs.
        - Configuration settings in appSettings.json.
        - Console interaction logic in ConsoleApp.cs.
    
    3. **Library.Infrastructure**: This library handles data persistence. It includes:
    
        - JSON-based repositories like JsonPatronRepository and JsonLoanRepository.
        - Data loading and saving logic in JsonData.
    
    Additionally, there are unit tests located in the UnitTests directory, which test the functionality of the core services using the NSubstitute mocking framework and xUnit.
    
    The project uses .NET 8.0 and is configured to build and test using GitHub Actions as defined in the build-test.yml file. The solution file is AccelerateDevGitHubCopilot.sln, which includes all the projects and their configurations.
    
  4. Use la vista Explorador de soluciones para expandir las carpetas del proyecto.

  5. Busque el archivo ConsoleApp.cs y ábralo.

    El archivo ConsoleApp.cs se encuentra en la carpeta src/Library.Console.

  6. Escriba un mensaje en la vista Chat que genera una descripción de la clase ConsoleApp.

    Por ejemplo, escriba el siguiente símbolo del sistema en la vista Chat:

    @workspace #editor Describe the ConsoleApp class
    
  7. Tómese un par de minutos para revisar la respuesta.

    Debería ver una respuesta similar a la descripción siguiente:

    The `ConsoleApp` class in `ConsoleApp.cs` is responsible for managing the console-based user interface of the library management system. It handles user interactions, processes user inputs, and coordinates actions with the underlying services and repositories.
    
    ### Fields
    - `_currentState`: Tracks the current state of the console application.
    - `matchingPatrons`: A list of patrons that match a search query.
    - `selectedPatronDetails`: Holds details of the currently selected patron.
    - `selectedLoanDetails`: Holds details of the currently selected loan.
    - `_patronRepository`: An instance of `IPatronRepository` for accessing patron data.
    - `_loanRepository`: An instance of `ILoanRepository` for accessing loan data.
    - `_loanService`: An instance of `ILoanService` for performing loan-related operations.
    - `_patronService`: An instance of `IPatronService` for performing patron-related operations.
    
    ### Constructor
    - `ConsoleApp(ILoanService loanService, IPatronService patronService, IPatronRepository patronRepository, ILoanRepository loanRepository)`: Initializes the `ConsoleApp` with the provided services and repositories.
    
    ### Methods
    - `Run()`: The main entry point for running the console application.
    - `PatronSearch()`: Handles the logic for searching patrons.
    - `ReadPatronName()`: Reads the patron's name from the console input.
    - `PrintPatronsList(List<Patron> matchingPatrons)`: Prints a list of matching patrons to the console.
    - `PatronSearchResults()`: Handles the logic for displaying and selecting from the search results.
    - `ReadInputOptions(CommonActions options, out int optionNumber)`: Reads input options from the console.
    - `WriteInputOptions(CommonActions options)`: Writes the available input options to the console.
    - `PatronDetails()`: Displays details of the selected patron.
    - `LoanDetails()`: Displays details of the selected loan and handles actions like extending or returning the loan.
    
    The class uses a state machine approach to manage different states of the console application, such as searching for patrons, displaying search results, showing patron details, and handling loan details.
    
  8. Abra el archivo Program.cs .

  9. Escriba un mensaje en la vista Chat que genera una descripción del archivo Program.cs.

    Por ejemplo, escriba el siguiente símbolo del sistema en la vista Chat:

    @workspace #editor Describe the Program.cs file
    
  10. Tómese un par de minutos para revisar la respuesta.

    Debería ver una respuesta similar a la descripción siguiente:

    The `Program.cs` file is the entry point for the console application. It sets up the dependency injection container, configures services, and starts the `ConsoleApp`.
    
    1. **Dependency Injection Setup**:
        - Creates a `ServiceCollection` to register services.
        - Builds a configuration object from the `appSettings.json` file.
        - Registers various services and repositories with different lifetimes (singleton, scoped).
    
    2. **Service Registration**:
        - Registers the repositories: JsonPatronRepository and JsonLoanRepository.
        - Registers the services: LoanService and PatronService.
        - Registers the JsonData class as a singleton.
        - Registers the ConsoleApp class as a singleton.
    
    3. **Service Provider**:
        - Builds the service provider from the registered services.
        - Retrieves the `ConsoleApp` service and runs it asynchronously.
    
    This setup ensures that all dependencies are properly injected and configured before the application starts running.
    
  11. Expanda la carpeta del proyecto Library.Infrastructure.

  12. Agregue los archivos JsonData.cs, JsonLoanRepository.cs, y JsonPatronRepository.cs al contexto chat.

    Use el botón Asociar contexto para agregar los archivos al contexto de chat. También puede usar una operación de arrastrar y colocar para agregar los archivos al contexto de chat.

  13. Escriba un mensaje en la vista Chat que genera una explicación de las clases de acceso a datos.

    Por ejemplo, escriba el siguiente símbolo del sistema en la vista Chat:

    @workspace /explain Explain how the data access classes work
    
  14. Tómese un par de minutos para revisar la respuesta.

    Debería ver una respuesta similar a la descripción siguiente:

    The `JsonData` class in `JsonData.cs` is responsible for managing the loading and saving of data from JSON files. It handles various entities such as `Author`, `Book`, `BookItem`, Patron`, and `Loan`. The class uses the `IConfiguration` interface to read file paths from the configuration settings, ensuring that the correct JSON files are loaded.
    
    The constructor of the `JsonData` class initializes the file paths for each entity by reading from the configuration section "JsonPaths". If the paths are not specified in the configuration, it defaults to specific paths within a "Json" directory.
    
    The `EnsureDataLoaded` method checks if the data is already loaded and, if not, calls the `LoadData` method to load the data from the JSON files. The `LoadData` method reads the JSON files and deserializes them into the respective lists of entities.
    
    The `SaveLoans` and `SavePatrons` methods handle saving the loan and patron data back to the JSON files. These methods ensure that only a subset of properties is saved, maintaining data integrity and consistency.
    
    The class also provides methods to populate entities with related data. For example, `GetPopulatedPatrons` and `GetPopulatedPatron` methods populate patron entities with their associated loans. Similarly, `GetPopulatedLoan` and `GetPopulatedBookItem` methods populate loan and book item entities with their related data.
    
    The `LoadJson` and `SaveJson` methods are utility methods for reading from and writing to JSON files. They use the `JsonSerializer` class to handle the serialization and deserialization processes.
    
    Overall, the `JsonData` class serves as a central point for managing the persistence of data in JSON format, ensuring that the application can load, save, and manipulate data efficiently.
    
  15. Tómese un par de minutos para examinar los archivos de datos JSON que se usan para simular los registros de la biblioteca.

    Los archivos de datos JSON se encuentran en la carpeta src/Library.Console/Json.

    Los archivos de datos usan propiedades de identificador para vincular entidades. Por ejemplo, Loanun objeto tiene unaPatronId propiedad que se vincula a un Patronobjeto con el mismo identificador. Los archivos JSON contienen datos para autores, libros, artículos de libros, patrones y préstamos.

    Nota:

    Tenga en cuenta que los nombres de autor, los títulos de los libros y los nombres de los clientes se han anonimizado para los fines de este proyecto guiado.

Compilación y ejecución de la aplicación

La ejecución de la aplicación le ayudará a comprender la interfaz de usuario, las características clave de la aplicación y cómo interactúan los componentes de la aplicación.

Completa los siguientes pasos para usar esta sección del ejercicio:

  1. Asegúrese de que tiene abierta la vista del Explorador de soluciones .

    La vista Explorador de soluciones no es la misma que la vista explorador. La vista Explorador de soluciones usa archivos de proyecto y solución como nodos "directorio" para mostrar la estructura de la solución.

  2. Para ejecutar la aplicación, haga clic con el botón derecho en Library.Console, seleccione Depurary, a continuación, seleccione Iniciar nueva instancia.

    Si no se muestran las opciones Depurar y Iniciar nueva instancia, asegúrese de que usa la vista Explorador de soluciones y no la vista Explorador.

    Los pasos siguientes le guían a través de un caso de uso sencillo.

  3. Cuando se le solicite un nombre de patrón, escriba Uno y presione Entrar.

    Debería ver una lista de clientes que coinciden con la consulta de búsqueda.

    Nota:

    La aplicación usa un proceso de búsqueda que distingue mayúsculas de minúsculas.

  4. En el símbolo del sistema "Opciones de entrada", escriba 2 y presione Entrar.

    Al escribir 2, se selecciona el segundo patrón de la lista.

    Debería ver el nombre del patrón y el estado de suscripción seguido de los detalles del préstamo del libro.

  5. En el símbolo del sistema "Opciones de entrada", escriba 1 y presione Entrar.

    Al escribir 1, se selecciona el primer libro de la lista.

    Debería ver los detalles del libro en la lista, incluida la fecha de vencimiento y el estado de devolución.

  6. En el símbolo del sistema "Opciones de entrada", escriba r y presione Entrar.

    Al escribir r, se devuelve el libro.

  7. Compruebe que se muestra el mensaje "Book was successfully returned" (Libro devuelto correctamente).

    El mensaje "El libro se devolvió correctamente". Debe ir seguido de los detalles del libro. Los libros devueltos se marcan con Returned: True.

  8. Para iniciar una nueva búsqueda, escriba s y presione Entrar.

  9. Cuando se le solicite un nombre de patrón, escriba Uno y presione Entrar.

  10. En el símbolo del sistema "Opciones de entrada", escriba 2 y presione Entrar.

  11. Compruebe que el primer préstamo de libros está marcado Returned: True.

  12. En el símbolo del sistema "Opciones de entrada", escriba q y presione Entrar.

  13. Detenga la sesión de depuración.

Creación del repositorio de GitHub para el código

La creación del repositorio de GitHub para el código le habilitará compartir su trabajo con otros usuarios y colaborar en el proyecto.

Nota:

Use su propia cuenta de GitHub para crear un repositorio privado de GitHub para la aplicación de biblioteca.

Completa los siguientes pasos para usar esta sección del ejercicio:

  1. Abra una ventana del explorador y navegue a la cuenta de GitHub.

    La página de inicio de sesión de GitHub es: https://github.com/login.

  2. Inicie sesión en su cuenta de GitHub.

  3. Abra el menú de la cuenta de GitHub y seleccione Los repositorios.

  4. Cambie a la ventana de Visual Studio Code.

  5. En Visual Studio Code, abra la vista Control de código fuente.

  6. Seleccione Publicación en GitHub.

  7. Acepte el nombre predeterminado del repositorio (AccelerateDevGitHubCopilotSelect) y seleccione Publicar en el repositorio privado de GitHub.

    Nota:

    Si no ha iniciado sesión en GitHub en Visual Studio Code, se le pedirá que inicie sesión. Una vez que haya iniciado sesión, autorice Visual Studio Code con los permisos solicitados.

  8. En la vista Control de código fuente, escriba un mensaje de confirmación, como "Confirmación inicial" y, a continuación, seleccione Publicar rama.

  9. Observe que Visual Studio Code muestra los mensajes de estado durante el proceso de publicación.

    Cuando finalice el proceso de publicación, verá un mensaje que le informa de que el código se publicó correctamente en el repositorio de GitHub que especificó.

  10. Cambie a la ventana del explorador de la cuenta de GitHub.

  11. Abra el nuevo repositorio AccelerateDevGitHubCopilot en la cuenta de GitHub.

    Si no ve el repositorio AccelerateDevGitHubCopilot, actualice la página. Si sigue sin ver el repositorio, pruebe los pasos siguientes:

    1. Vaya a Visual Studio Code.
    2. Abra las notificaciones (se generó una notificación cuando se publicó el nuevo repositorio).
    3. Seleccione Abrir en GitHub para abrir el repositorio.
  12. En la pestaña Código del repositorio AccelerateDevGitHubCopilot, seleccione Agregar un archivo LÉAME.

  13. En el editor de LÉAME.md, escriba Próximamente y seleccione Confirmar cambios.

  14. En el cuadro de Commit changes diálogo, seleccione Confirmar cambios.

  15. Cambie a Visual Studio Code y asegúrese de que la vista Control de código fuente está abierta.

  16. Abra el menú Vistas y más acciones y, a continuación, seleccione extracción.

    El menú Vistas y más acciones se puede abrir mediante los puntos suspensivos de la esquina superior derecha de la vista Control de código fuente.

  17. Abra la vista Explorador (no el Explorador de soluciones) y expanda la carpeta AccelerateDevGitHubCopilot.

  18. Abra el archivo README.md.

    Debería ver el mensaje "Próximamente".

Usará Chat de GitHub Copilot para actualizar el archivo LÉAME del repositorio en la sección siguiente de este ejercicio.

Creación de la documentación del proyecto para el archivo LÉAME

El archivo LÉAME es una parte esencial de cualquier repositorio de GitHub. El archivo LÉAME proporciona información basada en las necesidades del proyecto, los colaboradores del proyecto y las partes interesadas.

Para este ejercicio de proyecto guiado, el archivo LÉAME debe incluir las secciones siguientes:

  • Título del proyecto: un título breve y claro del proyecto.
  • Descripción: una explicación detallada de lo que es el proyecto y lo que hace.
  • Estructura del proyecto: Desglose de la estructura del proyecto, incluidas las carpetas de claves y los archivos.
  • clases clave e interfaces: Lista de clases e interfaces clave del proyecto.
  • Uso: instrucciones sobre cómo usar el proyecto, a menudo se incluyen ejemplos de código.
  • Licencia: la licencia en la que está el proyecto.

En esta sección del ejercicio, usará GitHub Copilot para crear documentación del proyecto y agregarla al README.md archivo.

Completa los siguientes pasos para usar esta sección del ejercicio:

  1. Abra la vista Chat.

  2. Use operaciones de arrastrar y colocar para agregar archivos al contexto de vista chat.

  3. Para generar documentación del proyecto para el archivo LÉAME, escriba el siguiente símbolo del sistema:

    @workspace Generate the contents of a README.md file for the code repository. Use "Library App" as the project title. The README file should include the following sections: Description, Project Structure, Key Classes and Interfaces, Usage, License. Format all sections as raw markdown. Use a bullet list with indents to represent the project structure. Do not include ".gitignore" or the ".github", "bin", and "obj" folders.
    

    Nota:

    Con varias solicitudes, una para cada sección del archivo LÉAME generaría más Resultados detallados En este ejercicio se usa una simple solicitud para simplificar el proceso.

  4. Revise la respuesta para asegurarse de que cada sección tiene el formato markdown.

    Nota:

    Puede actualizar secciones individualmente para proporcionar información más detallada o si no tienen el formato correcto. También puede copiar la respuesta de GitHub Copilot al archivo LÉAME y, a continuación, realizar correcciones directamente en el archivo markdown.

  5. Copie las secciones de documentación sugeridas en el archivo LÉAME.md.

    # Library App
    
    ## Description
    Library App is a console-based application for managing library operations such as patron management, book loans, and membership renewals. It uses a JSON-based data storage system and provides various services to handle library functionalities.
    
    ## Project Structure
    - AccelerateDevGitHubCopilot.sln
    - README.md
    - src
      - `Library.ApplicationCore/`
        - `Entities/`
          - `Author.cs`
          - `Book.cs`
          - `BookItem.cs`
          - `Loan.cs`
          - `Patron.cs`
        - `Enums/`
          - `LoanExtensionStatus.cs`
          - `LoanReturnStatus.cs`
          - `MembershipRenewalStatus.cs`
        - `Interfaces/`
          - `IPatronRepository.cs`
          - `IPatronService.cs`
          - `ILoanRepository.cs`
          - `ILoanService.cs`
        - `Library.ApplicationCore.csproj`
        - `Services/`
          - `PatronService.cs`
          - `LoanService.cs`
      - `Library.Console/`
        - `appSettings.json`
        - `CommonActions.cs`
        - `ConsoleApp.cs`
        - `ConsoleState.cs`
        - `Library.Console.csproj`
        - `Program.cs`
      - `Library.Infrastructure/`
        - `Data/`
          - `JsonData.cs`
          - `JsonLoanRepository.cs`
          - `JsonPatronRepository.cs`
        - `Library.Infrastructure.csproj`
    - tests
      - `UnitTests/`
        - `ApplicationCore/`
          - `LoanService/`
            - `ReturnLoan.cs`
            - `ExtendLoan.cs`
          - `PatronService/`
            - `RenewMembership.cs`
        - `UnitTests.csproj`
    
    ## Key Classes and Interfaces
    - **Entities**
      - **Author**: Represents an author with properties like `Id` and `Name`.
      - **Book**: Represents a book with properties like `Id`, `Title`, `AuthorId`, `Genre`, `ImageName`, and `ISBN`.
      - **BookItem**: Represents a specific copy of a book with properties like `Id`, `BookId`, `AcquisitionDate`, and `Condition`.
      - **Loan**: Represents a loan with properties like `Id`, `BookItemId`, `PatronId`, `LoanDate`, `DueDate`, and `ReturnDate`.
      - **Patron**: Represents a library patron with properties like `Id`, `Name`, `MembershipStart`, `MembershipEnd`, and `Loans`.
    
    - **Enums**
      - **LoanExtensionStatus**: Enum for loan extension statuses.
      - **LoanReturnStatus**: Enum for loan return statuses.
      - **MembershipRenewalStatus**: Enum for membership renewal statuses.
    
    - **Interfaces**
      - **IPatronRepository**: Interface for patron repository with methods like `GetPatron`, `SearchPatrons`, and `UpdatePatron`.
      - **IPatronService**: Interface for patron service with method `RenewMembership`.
      - **ILoanRepository**: Interface for loan repository with methods like `GetLoan` and `UpdateLoan`.
      - **ILoanService**: Interface for loan service with methods like `ReturnLoan` and `ExtendLoan`.
    
    - **Services**
      - **PatronService**: Implements `IPatronService` to handle patron-related operations.
      - **LoanService**: Implements `ILoanService` to handle loan-related operations.
    
    - **Console**
      - **ConsoleApp**: Main console application class that handles user interactions and application flow.
      - **ConsoleState**: Enum for different states of the console application.
      - **CommonActions**: Enum for common actions in the console application.
    
    - **Infrastructure**
      - **JsonData**: Handles loading and saving data to JSON files.
      - **JsonLoanRepository**: Implements `ILoanRepository` to manage loan data.
      - **JsonPatronRepository**: Implements `IPatronRepository` to manage patron data.
    
    ## Usage
    1. Clone the repository.
    2. Open the solution file AccelerateDevGitHubCopilot.sln in Visual Studio.
    3. Build the solution to restore dependencies.
    4. Run the `Library.Console` project to start the console application.
    5. Follow the on-screen instructions to search for patrons, view patron details, extend loans, return books, and renew memberships.
    
    ## License
    This project is licensed under the MIT License.
    
  6. Ajuste el formato manualmente si es necesario y guarde el archivo README.md actualizado.

  7. Abre la vista Control de código fuente de Visual Studio Code.

  8. Para que GitHub Copilot genere un mensaje de confirmación, seleccione el icono situado en el lado derecho del cuadro de mensaje.

    Debería ver un mensaje de confirmación similar al siguiente:

    chore: Update README.md with project description and usage instructions
    
  9. Almacenar provisionalmente y confirmar las actualizaciones de archivos.

  10. Sincronice (o inserte) las actualizaciones en el repositorio de GitHub.

Comprobar el trabajo

Para comprobar el trabajo, complete los pasos siguientes:

  1. Abra el repositorio de GitHub para el proyecto AccelerateDevGitHubCopilot.

  2. Use la pestaña Código para revisar el archivo de LÉAME.md actualizado.

  3. Asegúrese de que la estructura del proyecto descrita en el archivo LÉAME alinea la estructura de carpetas del repositorio.

  4. Revise el historial de confirmaciones y busque el mensaje de confirmación generado por GitHub Copilot.