Ejercicio: Desarrollo de características de código mediante herramientas de GitHub Copilot

Completado

Usted y su compañero de trabajo se reúnen para discutir sus objetivos para la aplicación de biblioteca. Quiere mejorar la experiencia del usuario para los bibliotecarios y los clientes. Se describen varias características nuevas que se pueden agregar a la aplicación.

Acepta trabajar con las siguientes características:

  • Disponibilidad del libro: Habilite un bibliotecario para determinar el estado de disponibilidad de un libro. Esta característica debe mostrar un mensaje que indica si un libro está disponible para el préstamo o la fecha de vencimiento de devolución si el libro está actualmente en préstamo a otro patrón.

  • Préstamos de libros: Permitir que un bibliotecario preste un libro a un patrón (si el libro está disponible). Esta característica debe mostrar la opción de que un cliente reciba un libro en préstamo, actualice Loans.json con el nuevo préstamo y muestre los detalles del préstamo para el patrón.

  • Reservación de libros: Permitir que un bibliotecario reserve un libro para un patrón (a menos que el libro ya esté reservado). Esta característica debe implementar un nuevo proceso de reserva de libros. Esta característica puede requerir la creación de un nuevo archivo Reservations.json junto con las nuevas clases e interfaces necesarias para admitir el proceso de reserva.

Cada una de ellas trabajará en una de las nuevas características y, a continuación, volverá a agruparse. Trabajará en la característica para determinar el estado de disponibilidad de un libro. Su compañero de trabajo trabajará en la característica para prestar un libro a un patrón. La última característica, para reservar un libro para un patrón, se desarrollará después de que se completen las otras dos características.

Durante este ejercicio, completará las siguientes tareas:

  1. Cree una rama de "disponibilidad de libros" en el repositorio de código.

  2. Desarrollar una nueva característica de "disponibilidad de libros".

    • Use sugerencias de GitHub Copilot para ayudar a implementar el código de forma más rápida y precisa.
    • Sincronice las actualizaciones del código a la rama "disponibilidad de libros" del repositorio remoto.
  3. Cree una solicitud de incorporación de cambios para combinar los cambios en la rama principal del repositorio.

Creación de una rama en el repositorio

Antes de empezar a desarrollar la nueva característica "disponibilidad de libros", debe crear una nueva rama en el repositorio. Esto le permite trabajar en la nueva característica sin afectar a la rama principal del repositorio. Puede combinar la nueva característica en la rama principal cuando esté lista.

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. Seleccione la vista Control de código fuente y asegúrese de que el repositorio local está sincronizado con el repositorio remoto (Extracción o Sincronización).

  3. En la esquina inferior izquierda de la ventana, seleccione principal.

  4. Para crear una nueva rama, escribe disponibilidad de libro y después selecciona + Crear nueva rama.

  5. Para insertar la nueva rama en el repositorio remoto, seleccione Publicar rama.

Desarrollo de una característica que permite a un bibliotecario determinar el estado de disponibilidad de un libro

En esta sección del ejercicio, usará GitHub Copilot para ayudarle a implementar una nueva característica para la aplicación de biblioteca. La nueva característica permite a un bibliotecario determinar el estado de disponibilidad de un libro.

La característica de disponibilidad del libro debe incluir las siguientes actualizaciones de código:

  • Agregue una nueva acción SearchBooks a CommonActions.
  • Actualice el método WriteInputOptions en ConsoleApp.cs. Agregue compatibilidad con la nueva opciónCommonActions.SearchBooks. Muestra la opción para comprobar si hay un libro disponible para el préstamo.
  • Actualice el método ReadInputOptions en ConsoleApp.cs. Agregue compatibilidad con la nueva opciónCommonActions.SearchBooks.
  • Actualice el método PatronDetails en ConsoleApp.cs. Agregue CommonActions.SearchBooks a options antes de llamar a ReadInputOptions. Agregue un else if para controlar la acción SearchBooks. El bloque else if debe llamar a un nuevo método denominado SearchBooks.
  • Cree un nuevo método SearchBooks en ConsoleApp.cs. El método SearchBooks debe leer un título de libro proporcionado por el usuario. Compruebe si un libro está disponible para el préstamo y muestre un mensaje que indique "book.title está disponible para el préstamo" o "book.title está en préstamo a otro patrón. La fecha de vencimiento de devolución es loan.DueDate.

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

  1. Abra la vista EXPLORADOR DE SOLUCIONES.

  2. Abra el archivo CommonActions.cs y seleccione la enumeración CommonActions.

    Debe agregar una nueva acción de SearchBooks a CommonActions.

  3. Abra el chat en línea y escriba el siguiente símbolo del sistema:

    Update selection to include a new `SearchBooks` action.
    

    GitHub Copilot debe sugerir una actualización de código que agregue la nueva acción SearchBooks a la enumeración CommonActions.

  4. Revise la actualización sugerida y seleccione Aceptar.

    public enum CommonActions
    {
        Repeat = 0,
        Select = 1,
        Quit = 2,
        SearchPatrons = 4,
        RenewPatronMembership = 8,
        ReturnLoanedBook = 16,
        ExtendLoanedBook = 32,
        SearchBooks = 64
    }
    
  5. Abra el archivo ConsoleApp.cs.

  6. Busque y, a continuación, seleccione el método WriteInputOptions.

    Debe agregar compatibilidad con la nueva opción CommonActions.SearchBooks. Muestra la opción para comprobar si hay un libro disponible para el préstamo.

  7. Abra el chat en línea y escriba el siguiente símbolo del sistema:

    Update selection to include an option for the `CommonActions.SearchBooks` action. Use the letter "b" and the message "to check for book availability".
    

    GitHub Copilot debe sugerir una actualización de código que agregue un nuevo bloque de if para la acción SearchBooks.

  8. Revise la actualización sugerida y seleccione Aceptar.

    La actualización sugerida debe ser similar al siguiente fragmento de código:

    static void WriteInputOptions(CommonActions options)
    {
        Console.WriteLine("Input Options:");
        if (options.HasFlag(CommonActions.ReturnLoanedBook))
        {
            Console.WriteLine(" - \"r\" to mark as returned");
        }
        if (options.HasFlag(CommonActions.ExtendLoanedBook))
        {
            Console.WriteLine(" - \"e\" to extend the book loan");
        }
        if (options.HasFlag(CommonActions.RenewPatronMembership))
        {
            Console.WriteLine(" - \"m\" to extend patron's membership");
        }
        if (options.HasFlag(CommonActions.SearchPatrons))
        {
            Console.WriteLine(" - \"s\" for new search");
        }
        if (options.HasFlag(CommonActions.SearchBooks))
        {
            Console.WriteLine(" - \"b\" to check for book availability");
        }
        if (options.HasFlag(CommonActions.Quit))
        {
            Console.WriteLine(" - \"q\" to quit");
        }
        if (options.HasFlag(CommonActions.Select))
        {
            Console.WriteLine("Or type a number to select a list item.");
        }
    }
    
  9. Desplácese hacia arriba ligeramente para buscar y, a continuación, seleccione el método ReadInputOptions.

    Debe agregar compatibilidad con la nueva opción CommonActions.SearchBooks. Incluya un caso que controle al usuario seleccionando la acción SearchBooks.

  10. Abra el chat en línea y escriba el siguiente símbolo del sistema:

    Update selection to include an option for the `CommonActions.SearchBooks` action.
    

    GitHub Copilot debe sugerir una actualización de código que agregue un nuevo case que controle al usuario la selección de la acción SearchBooks.

  11. Revise la actualización sugerida y seleccione Aceptar.

    La actualización sugerida debe ser similar al siguiente fragmento de código:

    static CommonActions ReadInputOptions(CommonActions options, out int optionNumber)
    {
        CommonActions action;
        optionNumber = 0;
        do
        {
            Console.WriteLine();
            WriteInputOptions(options);
            string? userInput = Console.ReadLine();
    
            action = userInput switch
            {
                "q" when options.HasFlag(CommonActions.Quit) => CommonActions.Quit,
                "s" when options.HasFlag(CommonActions.SearchPatrons) => CommonActions.SearchPatrons,
                "m" when options.HasFlag(CommonActions.RenewPatronMembership) => CommonActions.RenewPatronMembership,
                "e" when options.HasFlag(CommonActions.ExtendLoanedBook) => CommonActions.ExtendLoanedBook,
                "r" when options.HasFlag(CommonActions.ReturnLoanedBook) => CommonActions.ReturnLoanedBook,
                "b" when options.HasFlag(CommonActions.SearchBooks) => CommonActions.SearchBooks,
                _ when int.TryParse(userInput, out optionNumber) => CommonActions.Select,
                _ => CommonActions.Repeat
            };
    
            if (action == CommonActions.Repeat)
            {
                Console.WriteLine("Invalid input. Please try again.");
            }
        } while (action == CommonActions.Repeat);
        return action;
    }
    
  12. Desplácese hacia abajo para buscar y, a continuación, seleccione el método PatronDetails.

    Hay dos cosas que debe realizar:

    • Debe agregar CommonActions.SearchBooks a options antes de llamar a ReadInputOptions.
    • También debe agregar un else if para controlar la acción SearchBooks. El bloque else if debe llamar a un nuevo método denominado SearchBooks.

    Puede abordar ambos juntos.

  13. Abra el chat en línea y escriba el siguiente símbolo del sistema:

    Update selection to add `CommonActions.SearchBooks` to `options` before calling `ReadInputOptions`. Add an `else if` block to handle the `SearchBooks` action. The `else if` block should call a new method named `SearchBooks`.
    

    GitHub Copilot debe sugerir una actualización de código que agregue CommonActions.SearchBooks a options antes de llamar a ReadInputOptions.

  14. Revise la actualización sugerida y seleccione Aceptar.

    async Task<ConsoleState> PatronDetails()
    {
        Console.WriteLine($"Name: {selectedPatronDetails.Name}");
        Console.WriteLine($"Membership Expiration: {selectedPatronDetails.MembershipEnd}");
        Console.WriteLine();
        Console.WriteLine("Book Loans:");
        int loanNumber = 1;
        foreach (Loan loan in selectedPatronDetails.Loans)
        {
            Console.WriteLine($"{loanNumber}) {loan.BookItem!.Book!.Title} - Due: {loan.DueDate} - Returned: {(loan.ReturnDate != null).ToString()}");
            loanNumber++;
        }
    
        CommonActions options = CommonActions.SearchPatrons | CommonActions.Quit | CommonActions.Select | CommonActions.RenewPatronMembership | CommonActions.SearchBooks;
        CommonActions action = ReadInputOptions(options, out int selectedLoanNumber);
        if (action == CommonActions.Select)
        {
            if (selectedLoanNumber >= 1 && selectedLoanNumber <= selectedPatronDetails.Loans.Count())
            {
                var selectedLoan = selectedPatronDetails.Loans.ElementAt(selectedLoanNumber - 1);
                selectedLoanDetails = selectedPatronDetails.Loans.Where(l => l.Id == selectedLoan.Id).Single();
                return ConsoleState.LoanDetails;
            }
            else
            {
                Console.WriteLine("Invalid book loan number. Please try again.");
                return ConsoleState.PatronDetails;
            }
        }
        else if (action == CommonActions.Quit)
        {
            return ConsoleState.Quit;
        }
        else if (action == CommonActions.SearchPatrons)
        {
            return ConsoleState.PatronSearch;
        }
        else if (action == CommonActions.RenewPatronMembership)
        {
            var status = await _patronService.RenewMembership(selectedPatronDetails.Id);
            Console.WriteLine(EnumHelper.GetDescription(status));
            // reloading after renewing membership
            selectedPatronDetails = (await _patronRepository.GetPatron(selectedPatronDetails.Id))!;
            return ConsoleState.PatronDetails;
        }
        else if (action == CommonActions.SearchBooks)
        {
            return await SearchBooks();
        }
    
        throw new InvalidOperationException("An input option is not handled.");
    }
    

    Nota:

    Las sugerencias de chat en línea también pueden crear código auxiliar para el método SearchBooks.

  15. Dedique un minuto a tener en cuenta los requisitos de proceso para el método SearchBooks.

    ¿Qué necesita hacer el método? ¿Qué debe devolver? ¿Requiere parámetros?

    El método SearchBooks debe implementar el siguiente proceso:

    1. Pida al usuario un título de libro.

    2. Lea el título del libro proporcionado por el usuario.

    3. Compruebe si hay un libro disponible para el préstamo

    4. Muestra un mensaje que indica una de las siguientes opciones:

      • "book.title está disponible para préstamo"
      • "book.title está en préstamo a otro patrón. La fecha de vencimiento de devolución es loan.DueDate.

    Para compilar las opciones de mensaje, el código tendrá que acceder a los siguientes archivos JSON:

    • Books.json es necesario para buscar los Title y BookIdcoincidentes.
    • Loans.json es necesario para encontrar el ReturnDate y DueDate para el coincidenteBookItemId. El BookItemId es el mismo que el BookId de Books.json.
  16. Asegúrese de que tiene el siguiente método SearchBooks creado en el archivo ConsoleApp.cs:

    async Task<ConsoleState> SearchBooks()
    {
    
        return ConsoleState.PatronDetails;
    }
    

    Nota:

    Asegúrese de quitar los comentarios de código creados por GitHub Copilot. Los comentarios innecesarios e inexactos pueden influir negativamente en las sugerencias de GitHub Copilot.

  17. Seleccione el método SearchBooks.

  18. Abra el chat en línea y escriba el siguiente símbolo del sistema:

    Update selection to obtain a book title. Prompt the user to "Enter a book title to search for". Read the user input and ensure the book title isn't null.
    

    GitHub Copilot debe sugerir una actualización de código que capture el título del libro proporcionado por el usuario.

  19. Revise la actualización sugerida y seleccione Aceptar.

    async Task<ConsoleState> SearchBooks()
    {
        string? bookTitle = null;
        while (String.IsNullOrWhiteSpace(bookTitle))
        {
            Console.Write("Enter a book title to search for: ");
            bookTitle = Console.ReadLine();
        }
    
        // Perform book search logic here
    
        return ConsoleState.PatronDetails;
    }
    
  20. Seleccione el método SearchBooks.

    Nota:

    GitHub Copilot puede crear un método independiente para controlar la entrada del usuario de un título de libro. Puede seguir desarrollando la lógica principal en el método SearchBooks.

  21. Abra la vista Chat.

  22. Agrega los siguientes archivos al contexto de chat: ConsoleApp.cs, JsonData.cs, JsonLoanRepository.cs, Books.json, Loans.json, BookItems.json,.

  23. Escriba lo siguiente:

    @workspace  Explain how to update the `SearchBooks` method and ConsoleApps class to find a matching book title in the `Books.json` file. Use the user supplied book title to find a matching book. If a book is found, use Loans.json to check if the book is available for loan. If the book has been returned, display a message stating "`book.title` is available for loan". If the book is on loan, display a message stating "`book.title` is on loan to another patron. The return due date is `loan.DueDate`".
    
  24. Dedique un minuto a revisar las actualizaciones sugeridas.

    GitHub Copilot debe proponer actualizaciones similares a las siguientes sugerencias:

    Para actualizar el método SearchBooks y la clase ConsoleApp para buscar un título de libro que coincida en el archivo Books.json y comprobar si el libro está disponible para préstamo, siga estos pasos:

    a. Agregue un método para buscar libros por título en la clase JsonData. b. Actualice el método SearchBooks de la clase ConsoleApp para usar este nuevo método. c. Comprueba el estado del préstamo del libro y muestra el mensaje adecuado.

    Este es el código actualizado:

    Paso 1: Adición de un método de búsqueda de libros por título en la clase JsonData

    public class JsonData
    {
        // Existing code...
    
        public Book? SearchBookByTitle(string title)
        {
            return Books?.FirstOrDefault(b => b.Title.Equals(title, StringComparison.OrdinalIgnoreCase));
        }
    }
    

    Paso 2: Actualización del método SearchBooks en la clase ConsoleApp

    public class ConsoleApp
    {
        // Existing fields...
    
        JsonData _jsonData;
    
        public ConsoleApp(ILoanService loanService, IPatronService patronService, IPatronRepository patronRepository, ILoanRepository loanRepository, JsonData jsonData)
        {
            _patronRepository = patronRepository;
            _loanRepository = loanRepository;
            _loanService = loanService;
            _patronService = patronService;
            _jsonData = jsonData;
        }
    
        // Existing methods...
    
        async Task<ConsoleState> SearchBooks()
        {
            string bookTitle = ReadBookTitle();
    
            Book? book = _jsonData.SearchBookByTitle(bookTitle);
    
            if (book == null)
            {
                Console.WriteLine($"No book found with title: {bookTitle}");
                return ConsoleState.PatronDetails;
            }
    
            Loan? loan = _jsonData.Loans?.FirstOrDefault(l => l.BookItemId == book.Id && l.ReturnDate == null);
    
            if (loan == null)
            {
                Console.WriteLine($"{book.Title} is available for loan.");
            }
            else
            {
                Console.WriteLine($"{book.Title} is on loan to another patron. The return due date is {loan.DueDate}.");
            }
    
            return ConsoleState.PatronDetails;
        }
    
        // Existing methods...
    }
    

    Paso 3: Actualización del archivo Program.cs para pasar JsonData a ConsoleApp

    using Microsoft.Extensions.DependencyInjection;
    using Library.Infrastructure.Data;
    using Library.ApplicationCore;
    using Microsoft.Extensions.Configuration;
    
    var services = new ServiceCollection();
    
    var configuration = new ConfigurationBuilder()
    .SetBasePath(Directory.GetCurrentDirectory())
    .AddJsonFile("appSettings.json")
    .Build();
    
    services.AddSingleton<IConfiguration>(configuration);
    
    services.AddScoped<IPatronRepository, JsonPatronRepository>();
    services.AddScoped<ILoanRepository, JsonLoanRepository>();
    services.AddScoped<ILoanService, LoanService>();
    services.AddScoped<IPatronService, PatronService>();
    
    services.AddSingleton<JsonData>();
    services.AddSingleton<ConsoleApp>();
    
    var servicesProvider = services.BuildServiceProvider();
    
    var consoleApp = servicesProvider.GetRequiredService<ConsoleApp>();
    consoleApp.Run().Wait();
    

    Con estos cambios, el método SearchBooks de la clase ConsoleApp ahora buscará un libro por título en el archivo Books.json y comprobará si está prestado en el archivo Loans.json. Si el libro está disponible para préstamo, mostrará un mensaje que indique que el libro está disponible. Si el libro está en préstamo, mostrará un mensaje que indica que el libro está en préstamo y proporcionará la fecha de vencimiento de devolución.

  25. Agregue el método sugerido al final de la clase JsonData.

    public Book? SearchBookByTitle(string title)
    {
        return Books?.FirstOrDefault(b => b.Title.Equals(title, StringComparison.OrdinalIgnoreCase));
    }
    
  26. Utilice las actualizaciones que se sugieren para actualizar el archivo Program.cs.

    using Microsoft.Extensions.DependencyInjection;
    using Library.Infrastructure.Data;
    using Library.ApplicationCore;
    using Microsoft.Extensions.Configuration;
    
    var services = new ServiceCollection();
    
    var configuration = new ConfigurationBuilder()
    .SetBasePath(Directory.GetCurrentDirectory())
    .AddJsonFile("appSettings.json")
    .Build();
    
    services.AddSingleton<IConfiguration>(configuration);
    
    services.AddScoped<IPatronRepository, JsonPatronRepository>();
    services.AddScoped<ILoanRepository, JsonLoanRepository>();
    services.AddScoped<ILoanService, LoanService>();
    services.AddScoped<IPatronService, PatronService>();
    
    services.AddSingleton<JsonData>();
    services.AddSingleton<ConsoleApp>();
    
    var servicesProvider = services.BuildServiceProvider();
    
    var consoleApp = servicesProvider.GetRequiredService<ConsoleApp>();
    consoleApp.Run().Wait();
    
  27. Agregue la declaración de campo JsonData _jsonData; a la clase ConsoleApp antes del constructor de clase.

  28. Agregue un parámetro JsonData jsonData al constructor de clase ConsoleApp y úselo para inicializar el campo _jsonDatadentro del constructor.

    El constructor de clase actualizado debe tener un aspecto similar al siguiente fragmento de código:

    public ConsoleApp(ILoanService loanService, IPatronService patronService, IPatronRepository patronRepository, ILoanRepository loanRepository, JsonData jsonData)
    {
        _patronRepository = patronRepository;
        _loanRepository = loanRepository;
        _loanService = loanService;
        _patronService = patronService;
        _jsonData = jsonData;
    }
    
  29. Observe que JsonData no se reconoce en la clase ConsoleApp.

    Debe agregar using Library.Infrastructure.Data; a la parte superior del archivo ConsoleApp.cs.

  30. Asegúrese de que la instrucción using Library.Infrastructure.Data; se agrega al principio del archivo ConsoleApp.cs.

  31. Use las sugerencias de código para actualizar el método SearchBooks:

    El código que se sugiere debe usar una consulta LINQ para buscar el libro por título. Si se encuentra el libro, se usa otra consulta LINQ para determinar si está prestado. El código también incluye lógica para mostrar el estado de disponibilidad del libro en función de los resultados de la búsqueda. La lógica que se usa para mostrar mensajes de respuesta se puede implementar de varias maneras. En el siguiente fragmento de código se proporciona un ejemplo.

    El fragmento de código siguiente muestra una posible implementación del método SearchBooks:

    async Task<ConsoleState> SearchBooks()
    {
        string bookTitle = ReadBookTitle();
    
        Book? book = _jsonData.SearchBookByTitle(bookTitle);
    
        if (book == null)
        {
            Console.WriteLine($"No book found with title: {bookTitle}");
            return ConsoleState.PatronDetails;
        }
    
        Loan? loan = _jsonData.Loans?.FirstOrDefault(l => l.BookItemId == book.Id && l.ReturnDate == null);
    
        if (loan == null)
        {
            Console.WriteLine($"{book.Title} is available for loan.");
        }
        else
        {
            Console.WriteLine($"{book.Title} is on loan to another patron. The return due date is {loan.DueDate}.");
        }
    
        return ConsoleState.PatronDetails;
    }
    
  32. Seleccione el método SearchBooks.

  33. Abra la vista Chat y escriba la siguiente solicitud:

    Explain the LINQ queries and the evaluation of the book's availability status.
    
  34. Dedique un minuto a revisar la explicación proporcionada por GitHub Copilot.

    Para la consulta que comprueba si el libro está en préstamo, deberías ver una descripción similar a la siguiente explicación:

    **Search for the Loan Status of the Book**
    
    Loan? loan = _jsonData.Loans?.FirstOrDefault(l => l.BookItemId == book.Id && l.ReturnDate == null);
    
    - _jsonData.Loans: Accesses the list of loans from the JsonData class.
    
    - ?.: The null-conditional operator ensures that if _jsonData.Loans is null, the entire expression will return null without throwing a NullReferenceException.
    
    - FirstOrDefault: A LINQ method that returns the first element in the collection that matches the specified condition, or null if no such element is found.
    
    - Lambda Expression: l => l.BookItemId == book.Id && l.ReturnDate == null
    
        - l.BookItemId == book.Id: Checks if the BookItemId of the loan matches the Id of the book being searched.
    
        - l.ReturnDate == null: Checks if the loan's ReturnDate is null, indicating that the book is currently on loan and has not been returned.
    
    - Result: If a matching loan is found, it is assigned to the loan variable. If no matching loan is found, loan is null.
    
    **Evaluation of the Book's Availability Status**
    
    After executing the LINQ queries, the method evaluates the availability status of the book:
    
      - If `loan` is `null`, the book has been returned. The method prints that the book is available for loan.
      - If `loan` is not `null`, the book is currently on loan (no return date). The method prints that the book is on loan and provides the date when the book should be returned.
    
    
  35. Compruebe la lógica implementada por el Compruebe si el libro está en la consulta de préstamos.

    Operador condicional Null: El operador ?. es un operador condicional null. Garantiza que si _jsonData.Loans es null, toda la expresión se evaluará como null sin iniciar un NullReferenceException.

    Expresión lambda: La expresión lambda l => l.BookItemId == book.Id && l.ReturnDate == null define la condición para el método FirstOrDefault. Comprueba cada loan objeto l para ver si su BookItemId coincide con el Id del objeto book y si su ReturnDate es null.

    Este código intenta encontrar el primer loan de la colección _jsonData.Loans donde el BookItemId coincide con el Id del book especificado y el ReturnDate es null. Si no se encuentra este loan o si _jsonData.Loans es null, loan se establecerá en null.

    Nota:

    La mayoría de las bibliotecas modernas tienen varias copias del mismo libro. Este código supone que solo hay una copia de cada libro. Si la biblioteca tiene varias copias del mismo libro, el código deberá actualizarse para gestionar varios préstamos para el mismo libro. Para los fines de este entrenamiento, suponemos que solo hay una copia de cada libro y que la lógica proporcionada es suficiente.

  36. Compile la solución para asegurarse de que no hay errores.

    Verá mensajes de advertencia, pero no debería haber ningún error.

    Para compilar la solución en la vista Explorador de soluciones, haga clic con el botón derecho en AccelerateDevGitHubCopilot y seleccione Compilar.

Sincronización de los cambios con el repositorio remoto

  1. Seleccione la vista Control de código fuente.

  2. Asegúrese de que los archivos que ha actualizado se enumeran en Cambios.

  3. Use GitHub Copilot para generar un mensaje para el Confirmar.

  4. Para almacenar provisionalmente y confirmar los cambios, seleccione Confirmar y, a continuación, seleccione .

  5. Sincronización (o inserción) de los cambios en el repositorio remoto.

Comprobar el trabajo

En esta sección del ejercicio, completará las siguientes tareas:

  1. Compruebe que la nueva característica determina correctamente el estado de disponibilidad de un libro.
  2. Cree una solicitud de incorporación de cambios para combinar los cambios en la rama principal del repositorio.

Compruebe que la nueva característica funciona según lo previsto

Dado que no tiene pruebas automatizadas, se pueden usar pruebas manuales para comprobar que la nueva característica funciona según lo previsto. El uso de un origen de datos que se puede comprobar es importante. En este caso, se usan los archivos Books.json y Loans.json para comprobar que la nueva característica informa del estado de disponibilidad de un libro correctamente.

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

  1. Abra la vista Explorador de soluciones.

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

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

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

  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 b y presione Entrar.

    Al escribir b selecciona la opción para buscar el estado de disponibilidad de un libro.

    Debería ver un mensaje para escribir un título de libro.

  6. Escriba Book One y presione Entrar.

    En los datos originales que descargó, Book One está actualmente en préstamo para Patron Forty-Nine, por lo que no debería estar disponible.

  7. Compruebe que la aplicación muestra un mensaje que indica que el libro está en préstamo a otro patrón.

  8. Compruebe que Book Nine ha sido devuelto por Patron One.

    En el ejercicio anterior, durante una prueba de la aplicación Biblioteca, había Patrón One devolver Book Nine. Si la aplicación muestra que Book Nine no ha sido devuelto por Patron One, use las opciones de entrada para seleccionar y devolver Book Nine antes de continuar.

    Nota:

    El archivo Library.Console.csproj garantiza que los archivos de datos JSON se copien en el directorio de salida cuando se compila la aplicación. Sin embargo, la realización de operaciones de limpieza o recompilación básicamente restablecerá los datos. Las operaciones de compilación repetidas no restablecen los datos en el directorio de salida (/bin/Debug/net8.0/).

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

  10. Escriba Book Nine y presione Entrar.

  11. Compruebe que la aplicación muestra un mensaje que indica que el libro está disponible para el préstamo.

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

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

  14. Abra el archivo Loans.json .

    El archivo Loans.json se utiliza para realizar un seguimiento del estado del préstamo de cada libro. Puede usar el archivo Loans.json para comprobar que el estado de disponibilidad de Book One y Book Nine es correcto.

    El archivo Loans.json actualizado debe encontrarse en la carpeta Library.Console\bin\Debug\net8.0\Json o Library.Console\Json.

    • Si usa el depurador de Visual Studio Code para ejecutar la aplicación, el archivo Loans.json actualizado debe encontrarse en la carpeta Library.Console\bin\Debug\net8.0\Json.

    • Si usa un comando dotnet run de la carpeta AccelerateDevGitHubCopilot\src\Library.Console> para ejecutar la aplicación, el archivo de Loans.json actualizado debe encontrarse en la carpeta Library.Console\Json.

  15. Compruebe que el id. de préstamo 37 y el id. de préstamo 46 son para el Libro Uno ("BookItemId": 1).

    • El id. de préstamo 37 debe tener un valor de ReturnDate (2024-01-17)
    • El id. de préstamo 46 no debe tener un valor ReturnDate. El valor ReturnDate debe ser null.

    El valor ReturnDate se utiliza para determinar si el libro está actualmente en préstamo. Si el valor ReturnDate es null, el libro se considera que está en préstamo.

  16. Compruebe que el id. de préstamo 22 es para el Libro Nueve ("BookItemId": 9) y que el valor de ReturnDate está establecido en la fecha actual.

    Si está ejecutando en el depurador y ha limpiado la solución después de realizar cambios en el archivo Loans.json, se perderán esos cambios. Después de limpiar la solución, el archivo Loans.json se restablece a los datos originales la próxima vez que ejecute la aplicación. Puede actualizar manualmente el archivo Loans.json para probar el estado de disponibilidad de Book One y Book Nine.

Creación de una solicitud de incorporación de cambios para combinar los cambios en la rama principal

Ha completado la nueva característica que permite a un bibliotecario determinar el estado de disponibilidad de un libro. Ahora debe combinar los cambios en la rama principal del repositorio. Puede crear una solicitud de incorporación de cambios para combinar los cambios en la rama principal.

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

  1. Abra el repositorio de GitHub en un explorador web.

  2. Abra la pestaña Solicitudes de incorporación de cambios.

  3. Seleccione Nueva solicitud de incorporación de cambios.

  4. En Comparar cambios, asegúrese de que la base esté configurada para la rama principal.

  5. Asegúrese de que comparación esté configurado para la rama de disponibilidad de libros.

    Después de configurar las ramas, se muestra una comparación de los cambios entre principal y disponibilidad de libros. Debería ver los cambios de todos y cada uno de los archivos que ha actualizado.

  6. Seleccione Crear solicitud de incorporación de cambios.

  7. Escriba un título y una descripción para la solicitud de incorporación de cambios.

    Puede usar el siguiente título y descripción:

    • Título: proeza: Agregar funcionalidad de búsqueda para libros en ConsoleApp
    • Descripción: Esta solicitud de incorporación de cambios agrega una nueva característica que permite a un bibliotecario determinar el estado de disponibilidad de un libro. La característica incluye una nueva acción de SearchBooks en CommonActions, actualizaciones de los métodos WriteInputOptions, ReadInputOptions, y PatronDetails en ConsoleApp, y agrega un nuevo método de SearchBooks en ConsoleApp.

    Nota:

    Los miembros de una empresa con una suscripción a GitHub Copilot Enterprise pueden usar GitHub Copilot para generar un resumen de una solicitud de incorporación de cambios en GitHub.com. Puede usar el resumen para ayudar a los revisores a comprender los cambios, o para comprender rápidamente los cambios realizados en una solicitud de incorporación de cambios que esté revisando. Seleccione Acciones de GitHub y, después, Resumen para generar un resumen de la solicitud de cambios.

    Este es un ejemplo de un resumen de solicitudes de incorporación de cambios que se generó mediante una cuenta de GitHub Copilot Enterprise:

    Captura de pantalla que muestra un resumen de la solicitud de incorporación de cambios generado mediante una cuenta de GitHub Copilot Enterprise.

  8. Asegúrese de que el título y la descripción reflejen las actualizaciones del código y, a continuación, seleccione Crear solicitud de incorporación de cambios.

  9. Espere a que se completen las comprobaciones y compruebe que todas las comprobaciones pasadas y que no haya conflictos con la rama base.

    Las comprobaciones pueden tardar un minuto en completarse. Debe solucionar cualquier problema que se identifique antes de poder combinar los cambios en la rama principal.

  10. Para combinar los cambios en la rama principal, seleccione Solicitud de incorporación de cambios de mezcla y, a continuación, seleccione Confirmar combinación.

    Tenga en cuenta que puede eliminar la rama book-availability después de combinar los cambios.

  11. Abra Visual Studio Code.

  12. Cambie a la rama principal del repositorio.

  13. Extraer los cambios del repositorio remoto.

  14. Compruebe que los cambios realizados en la rama de disponibilidad de librosestén ahora en la rama principal.