Noviembre de 2017
Volumen 33, número 11
Visual Studio: edición y depuración de código en Visual Studio para Mac
Por Alessandro Del Del | Noviembre de 2017
Visual Studio para Mac es el nuevo y eficaz entorno de desarrollo nativo de Microsoft que encarna a la perfección el enfoque de primero móvil, primero en la nube. Ayuda a compilar aplicaciones multiplataforma con Xamarin y .NET Core, así como juegos con Unity, mediante sus aptitudes de .NET existentes y sus lenguajes de programación favoritos, como C# y F#. Encontrará una introducción a Visual Studio para Mac en msdn.com/magazine/mt790182. En este artículo, me centraré en algunas características eficaces del editor de código y en las herramientas de depuración que le ayudarán a aumentar su productividad.
Editor de código con tecnología de Roslyn
Visual Studio para Mac le permite escribir en macOS código en C# y F#. Esto es posible porque el IDE aprovecha la plataforma del compilador .NET, también conocido como el proyecto "Roslyn" (github.com/dotnet/roslyn). Roslyn proporciona compiladores .NET multiplataforma de código abierto, que presentan API de análisis de código completas. Como sucede en Visual Studio 2015 y 2017 en Windows, Roslyn proporciona el editor de código de Visual Studio para Mac, que ofrece una experiencia de programación mejorada con coloración de sintaxis, IntelliSense, detección de problemas de código activo, correcciones y refactorizaciones. En la documentación oficial se explica cómo usar las correcciones y refactorizaciones de código en general (bit.ly/2jKt69D). Por tanto, en este artículo me centraré más específicamente en las características y las funcionalidades, tales como la generación de tipos, la eliminación de código redundante, la navegación por el código, y la adición de compatibilidad con fragmentos de código y lenguajes personalizados. Todas estas características están disponibles para proyectos tanto de Xamarin como de .NET Core.
Generación de tipos sobre la marcha
Una de las mejores características de productividad del editor de código es la posibilidad de generar nuevos tipos durante la programación, sin quitar el foco del editor activo. Por ejemplo, puede escribir el nombre de un tipo que aún no existe y, cuando el editor de código resalte el nombre del tipo como un problema de código, puede hacer clic en este con el botón derecho (o presionar Alt+Entrar) y seleccionar Corrección rápida | Generar tipo. En la Figura 1 se muestra un ejemplo basado en la generación de un tipo denominado Person.
Figura 1 Generación de un tipo nuevo en el editor activo
La primera opción, Generar clase "Person" en archivo nuevo, generará una nueva clase denominada Person con el modificador interno dentro de un archivo denominado Person.cs. La segunda opción, Generar clase "Person", generará una nueva clase denominada Person con el modificador interno dentro del archivo actual. La tercera opción, Generar clase anidada "Person", generará una nueva clase privada denominada Person anidada dentro del tipo actualmente activo en el editor de código (en este caso, la nueva clase se generaría dentro de la clase Program). A continuación, puede cambiar el modificar interno o privado manualmente, o bien mediante un clic con el botón derecho en el modificador y la opción Corrección rápida. En todos los casos, la nueva clase se genera con un constructor vacío. En cambio, la cuarta opción, Generar nuevo tipo, muestra un cuadro de diálogo donde puede especificar el tipo que desea crear (clase, interfaz o enumeración), el modificador de acceso y el destino. Esto no es una limitación; puede usar la misma técnica para agregar miembros al nuevo tipo generado. Simplemente, puede asignar o invocar una propiedad, un campo o un método que todavía no exista y aprovechar las correcciones rápidas para agregar uno fácilmente, como se muestra en la Figura 2, que muestra cómo agregar una nueva propiedad denominada LastName a la clase Person. La opción Generar variable "LastName" proporciona distintas sugerencias basadas en el contexto actual.
Figura 2 Generación de un miembro nuevo
En este caso, el código realiza una asignación, de modo que el editor de código le sugiere generar una propiedad o un campo nuevos. En función del código, el editor de código también asignará el tipo adecuado al nuevo miembro generado, lo que significa que generará una propiedad (o un campo) de tipo cadena. El editor de código puede analizar invocaciones de métodos y generar firmas de métodos coincidentes. Esta característica forma parte de las herramientas de refactorización de código y le ayuda a mantenerse centrado en el código mientras escribe.
Eliminación de código redundante
El editor de código de Visual Studio para Mac también resalta el código redundante, que no es necesario y no se utiliza. El código redundante se puede reconocer fácilmente porque está atenuado. Entre bastidores, el código redundante se resalta en función de algunas reglas de análisis de origen que hacen que el código redundante se considere un problema. (Puede controlar estas reglas, pero esta operación no se explica aquí). La mayoría de las veces, encontrará ejemplos de código redundante basado en directivas using innecesarias, pero el reconocimiento de código redundante no se limita a esto. Por ejemplo, un constructor vacío y el modificador interno se resaltan como redundantes en la Figura 3.
Figura 3 Eliminación de código redundante
Si hace clic con el botón derecho en algún código redundante, que puede reconocer por su color más claro, podrá seleccionar Corrección rápida, y Visual Studio mostrará una corrección de código que quitará el código innecesario. Además, podrá ver un submenú denominado Opciones que le permitirá hacer lo siguiente:
- Suprimir la detección de problemas actual.
- Ampliar la configuración de la regla de análisis en las preferencias de Visual Studio.
- Aplicar la corrección de código para varios problemas del mismo tipo en el nivel de documento, proyecto o solución.
De manera similar, en el ejemplo anterior puede corregir fácilmente los modificadores internos redundantes para las definiciones de tipos (de hecho, internal es el modificador predeterminado de C#). Esta técnica se aplica a cualquier regla de análisis que resalta el código redundante en el editor.
Navegación de código
La navegación entre archivos de código y entre miembros en un archivo de código es extremadamente común, y contar con herramientas de navegación de alta eficacia integradas contribuye notablemente a mejorar la productividad. Visual Studio para Mac proporciona varias herramientas sólidas que facilitan la navegación entre archivos, tipos y miembros. Primero de todo, puede moverse rápidamente entre archivos de código mediante Control+Tabulador. Esta acción muestra un elemento emergente donde puede ver una lista de los archivos de su solución. Si mantiene presionado Control y presiona Tab de nuevo, bajará por la lista y, cuando lo suelte, el archivo seleccionado se abrirá en el editor. Para la navegación por el código fuente, en las siguientes subsecciones hablaremos sobre características de productividad menos conocidas que son increíblemente útiles.
Herramientas Buscar todas las referencias y Navegar
La herramienta Buscar todas las referencias permite recuperar todas las referencias a un tipo o un miembro de la solución. Para ver esta herramienta en acción, solo tiene que hacer clic con el botón derecho en el nombre de un miembro o un tipo en el editor de código y, a continuación, seleccionar Buscar todas las referencias. Las referencias se muestran en el panel Resultados de la búsqueda, como se muestra en la Figura 4.
Figura 4 Búsqueda de referencias de tipo o miembro
En el panel Resultados de la búsqueda, puede ver (de izquierda a derecha) el proyecto que contiene la referencia, el archivo de código con la posición incluida, el texto de origen que contenía el objeto de referencia y el nombre de ruta de acceso completa del archivo de origen. Al hacer doble clic en una referencia, el editor de código abrirá el archivo de código adecuado y colocará el cursor en la incidencia seleccionada. Observe que el código fuente de la columna Text tiene la coloración de sintaxis básica. Buscar todas las referencias es una característica muy eficaz, pero a veces quizás preferiría filtrar la búsqueda por características de tipo y miembro determinadas. Para conseguirlo, puede usar la herramienta Navegar, que se invoca mediante un clic con el botón derecho en un tipo o un miembro y la opción Navegar. Aparecerá un submenú que muestra las opciones de búsqueda siguientes:
Find References of All Overloads (Buscar referencias de todas las sobrecargas) busca todas las referencias de un método y sus sobrecargas.
Símbolos base permite buscar la lista de tipos base e interfaces que está implementando (o de la que se hereda) el tipo en el que se ha invocado Navegar. En el caso de los métodos, Navegar buscará la lista de métodos que el método actual está reemplazando.
Símbolos derivados permite buscar la lista de tipos que se hereda del tipo en el que se ha invocado Navegar. En el caso de los métodos, busca la lista de métodos que reemplazan aquel en el que ha invocado Navegar.
Métodos de extensión busca todos los métodos de extensión del tipo en el que ha invocado Navegar y que se definen en la solución actual.
Sobrecargas de miembros es similar a Métodos de extensión, excepto en que busca la lista de sobrecargas de métodos definidas en la solución actual.
Implementando miembros, si se invoca en una interfaz o clase abstracta, muestra la lista de tipos y miembros que implementan ese tipo o esa interfaz.
La herramienta Navegar muestra los resultados de la búsqueda en el panel Resultados de la búsqueda, exactamente igual que Buscar todas las referencias.
Barra de desplazamiento y modo Minimapa
La barra de desplazamiento del editor de código muestra marcadores de colores que representan problemas de código, como advertencias y errores, puntos de interrupción, elementos de tareas pendientes y un punto de color en la parte superior, que es rojo si el archivo activo contiene errores, amarillo si contiene advertencias o verde si no se detecta ningún problema. Además, la barra de desplazamiento proporciona el denominado modo Minimapa. Cuando este modo está habilitado, la barra de desplazamiento muestra una vista previa del código fuente para facilitar la navegación, como se muestra en la Figura 5.
Figura 5 Modo Minimapa de la barra de desplazamiento
Para habilitar el modo Minimapa, haga clic con el botón derecho en la barra de desplazamiento y seleccione Show Minimap (Mostrar minimapa). Puede hacer clic en un área en el mapa y el editor de código moverá el cursor al punto correspondiente. Para deshabilitar el modo Minimapa, vuelva a hacer clic con el botón derecho en la barra de desplazamiento y seleccione Mostrar tareas. El modo Minimapa resulta especialmente útil con archivos largos y ayuda a obtener una representación visual de todo el archivo.
Exploración de objetos en un archivo de código
Visual Studio para Mac ofrece métodos visuales para explorar fácilmente el tipo y los miembros en un archivo de código. Cada ventana del editor de código muestra rutas de navegación en las que puede hacer clic para ver una lista de los tipos definidos en el editor activo; cuando selecciona un tipo, una pestaña adicional permite visualizar la lista de sus miembros. Además, puede usar el panel Esquema del documento para obtener una representación visual de la estructura de tipos en el archivo activo (consulte la Figura 6).
Figura 6 Exploración de objetos en un archivo de código
Observe cómo los diferentes iconos representan los distintos tipos de miembros. Es posible que ya conozca el panel Esquema del documento por sus funcionalidades para mostrar la jerarquía visual de la interfaz de usuario, pero también puede usarlo para obtener una vista de la estructura de un tipo, que resulta muy útil. Simplemente, puede hacer doble clic en un objeto en Esquema del documento y el editor moverá el cursor a su definición.
Trabajo con fragmentos de código
Visual Studio para Mac es compatible con fragmentos de código de IntelliSense: plantillas de bloques de código escritos previamente que se pueden personalizar para satisfacer sus necesidades. Si tiene experiencia con Visual Studio en Windows, ya sabe qué son los fragmentos de código. En Visual Studio para Mac, tiene dos opciones para insertar un fragmento de código. La primera opción es hacer clic con el botón derecho en el editor de código y, a continuación, seleccionar Insertar plantilla. Aparecerá una lista de los fragmentos de código disponibles y solo tendrá que seleccionar el que necesita. La segunda opción es seleccionar un fragmento de código de la lista de finalización de IntelliSense a medida que escribe. En la Figura 7 se muestra un ejemplo con un fragmento de código resaltado (presione el tabulador dos veces para insertar el fragmento de código).
Figura 7 Adición de un fragmento de código
Los fragmentos de código se representan con el icono (…), que hace que se puedan reconocer inmediatamente. En ambos casos, la información sobre herramientas describe la finalidad del fragmento de código al mantener el puntero del mouse sobre su nombre. Visual Studio para Mac también le permite crear nuevos fragmentos de código personalizados y editar los existentes desde el IDE, sin necesidad de herramientas externas. Para ello, seleccione Preferencias en el menú de Visual Studio y, a continuación, en el cuadro de diálogo Preferencias, localice y seleccione el elemento Fragmentos de código debajo de Editor de texto. Allí verá una lista de los fragmentos de código agrupados por lenguaje. Si selecciona un fragmento de código existente, solo tiene que pulsar el botón Editar para modificar el código. Si en su lugar hace clic en Agregar, tendrá la opción de crear un nuevo fragmento de código. Esto se realiza en el cuadro de diálogo Nueva plantilla, donde debe proporcionar un método abreviado de teclado, una descripción, un tipo MIME, un grupo de lenguajes y, por supuesto, el código fuente. En la Figura 8 se muestra un ejemplo.
Figura 8 Creación de un fragmento de código personalizado
Observe que el símbolo $ se usa para marcar identificadores para el reemplazo, mientras que la expresión $selected$$end$ delimita el fragmento de código actual. Al marcar identificadores para el reemplazo, también puede proporcionar información adicional sobre el propio identificador, como su valor predeterminado y una información sobre herramientas que describe su significado, en los cuadros del lado derecho del cuadro de diálogo. Cuando termine, solo tiene que hacer clic en Aceptar y cerrar el cuadro de diálogo Preferencias. Llegado este punto, su nuevo fragmento de código se encuentra en la biblioteca de fragmentos de código y está listo para su uso en el editor de código por medio de IntelliSense. Vale la pena destacar que puede editar los fragmentos de código existentes para asignar un método abreviado de teclado si no hay ninguno disponible. Esto le permite escribir el método abreviado de teclado en el editor de código e insertar un fragmento de código más rápido. Si es como yo y usa fragmentos de código con frecuencia, la opción para crearlos desde el IDE le ahorrará una enorme cantidad de tiempo.
Adición de lenguajes personalizados
Una de las cosas que le encantará de Visual Studio para Mac es la posibilidad de agregar nuevos lenguajes que no se incluyen de manera predefinida, cuya gramática se basa en los estándares de facto de TextMate y Sublime Text. De hecho, Visual Studio para Mac admite ambos estándares y permite agregar paquetes de idioma que ofrecen características de edición, como la coloración de sintaxis, los fragmentos de código y la finalización de palabras. Por ejemplo, supongamos que quiere agregar compatibilidad de sintaxis para editar archivos de Swift, lo que podría resultar útil en un Mac. En TextMate o Sublime Text, instale un paquete de idioma de Swift y, a continuación, expórtelo al disco. Luego, puede importar el paquete de idioma en Visual Studio para Mac. Para lograrlo, use el nodo Paquetes de idioma del cuadro de diálogo Preferencias. Aquí, podrá hacer clic en Agregar y seleccionar el paquete de idioma exportado anteriormente. En este punto, podrá abrir archivos .swift (u otros tipos de archivo según el paquete importado) y aprovechar características, como la coloración de sintaxis y el plegado de bloques de código.
El editor de código también permite insertar fragmentos de código si el paquete de idioma seleccionado contiene alguno. Evidentemente, Visual Studio para Mac no admite la compilación de archivos de origen ni la compilación y publicación de aplicaciones basadas en paquetes de idioma externos. Lo que puede hacer en su lugar es automatizar la ejecución de herramientas externas, como los compiladores, con el comando Editar herramientas personalizadas del menú Opciones.
Productividad de la depuración con paneles y con la clase Debug
La depuración es extremadamente importante y Visual Studio para Mac se suministra con el tipo de herramientas de depuración de primera clase que cualquier desarrollador necesita para compilar aplicaciones de alta calidad de manera productiva. En la documentación oficial (bit.ly/2xgJkx0) se describen las herramientas más usadas, como los puntos de interrupción, los visualizadores de datos y el control de flujo condicional. Voy a describir algunas otras características útiles que quizás le gustaría conocer, especialmente si está familiarizado con la depuración en Visual Studio en Windows y espera ver las mismas herramientas en un equipo Mac. Comencemos con la clase System.Diagnostics.Debug, que permite imprimir la evaluación de una expresión en el panel Salida de la aplicación a partir de código de C#, sin interrumpir la ejecución de una aplicación. Supongamos que tiene una aplicación de consola de .NET Core que espera la entrada del usuario con el código siguiente:
string inputString = Console.ReadLine();
Debug.WriteLine($"The entered string is {inputString.Length} characters long");
El método Debug.WriteLine imprime la expresión en el panel Salida de la aplicación, como se representan en la Figura 9, sin detener la ejecución de la aplicación. En este caso, la expresión es una cadena interpolada que contiene la longitud de la cadena introducida por el usuario.
Figura 9 Resultado de una evaluación impreso en el panel Salida de la aplicación
No está limitado al método WriteLine; de hecho, puede usar todos los demás métodos compatibles, como Assert, Equals, Fail, Write, WriteIf y WriteLineIf (consulte bit.ly/2ydS8jO para obtener más información).
En Visual Studio para Mac, existen otras maneras de evaluar expresiones e inspeccionar valores de objetos durante la depuración. Puede usar puntos de interrupción y visualizadores de datos, pero también puede usar el panel Inspección, cuya finalidad es proporcionar un método para controlar variables, métodos y expresiones visualmente. En el modo de interrupción, la ventana Inspección se habilita automáticamente y puede hacer clic en ella para agregar un nuevo objeto para su supervisión. En la Figura 10 se muestra un ejemplo basado en el valor de una propiedad.
Figura 10 Supervisión de objetos con el panel Inspección
De cada objeto que supervisa, puede ver los miembros y sus valores. También puede hacer clic en el valor y cambiarlo, lo que le permitirá ver cómo se comporta su código con un valor de objeto diferente. El panel Inspección sigue ofreciendo accesos directos a los visualizadores de datos, que puede reconocer a través de los iconos de ojo y lápiz. También encontrará otros dos paneles de depuración muy útiles: el panel Subprocesos y el panel Pila de llamadas, ambos visibles en la Figura 11.
Figura 11 Supervisión de subprocesos y llamadas de método con los paneles Subprocesos y Pila de llamadas
El panel Subprocesos muestra la lista de subprocesos en ejecución y resulta útil para comprender las ubicaciones del código donde los distintos subprocesos de su aplicación están pausados. Muestra el id. de subproceso, así como el nombre y la ubicación del código que hace referencia a cada subproceso. También puede introducir un nombre para los subprocesos, si aún no existe ninguno. El panel Pila de llamadas muestra la jerarquía de las llamadas de método, y puede habilitarlo para que también muestre las llamadas a código que no está en su solución, como los marcos de interoperabilidad. Para conseguirlo, haga clic con el botón derecho en el panel y habilite la opción Mostrar código externo. Al aprovechar todas estas opciones, cuenta con un completo y eficaz conjunto de herramientas de depuración que, junto con los puntos de interrupción, el panel Variables locales y el visualizador de datos, le proporcionan un control total sobre sus soluciones de .NET Core y Xamarin.
Resumen
Visual Studio para Mac no solo le ayuda a compilar aplicaciones multiplataforma para dispositivos móviles y para la nube con Xamarin y .NET Core en macOS, sino que también le ofrece todas las herramientas de productividad que necesita para escribir código de alta calidad. Incluye características de productividad en el editor de código y en las herramientas de depuración que le harán sentirse cómodo con este IDE, especialmente si tiene experiencia con Visual Studio en Windows.
Alessandro Del Sole ha sido MVP de Microsoft desde el año 2008. Alessandro ha sido proclamado MVP del año en cinco ocasiones y es el autor de numerosos libros, eBooks, vídeos didácticos y artículos sobre desarrollo .NET con Visual Studio. Del Sole trabaja como desarrollador senior de .NET, centrado en temas de desarrollo, aprendizaje y consultoría de .NET y de aplicaciones móviles. Recientemente, escribió un libro que se publicará próximamente titulado "Beginning Visual Studio for Mac" (bit.ly/2hsRxYx). Puede seguirlo en Twitter: @progalex.
Gracias al siguiente experto técnico de Microsoft por revisar este artículo: Mikayla Hutchinson