# Unidad 4: Documentación y optimización

* [Diapositivas](http://jamj2000.github.io/entornosdesarrollo/4/diapositivas)
* [Actividades](http://jamj2000.github.io/entornosdesarrollo/4/actividades)

## Introducción

En esta Unidad aprenderemos a:

* Trabajar de forma habitual con un sistema de control de versiones. &#x20;
* Identificar los patrones de refactorización más usuales.
* Revisar el código fuente usando un analizador de código.
* Documentar el código fuente.

## Optimización

### Hediondez del código

* También llamado **code smell** en inglés
* Es síntoma en el código fuente que indica posiblemente un problema más profundo.
* Usualmente no son bug de programación (errores): no son técnicamente incorrectos y en realidad no impiden que el programa funcione correctamente.&#x20;
* Indica deficiencias en el diseño que puede ralentizar el desarrollo o aumentan el riesgo de errores o fallos en el futuro.
* Es un motivo importante para realizar refactorización.
* [Hediondez del código](https://es.wikipedia.org/wiki/Hediondez_del_código)

### Análisis de código

* Tipos:
  * **Análisis dinámico** (unit tests)
  * **Análisis estático** (**lint**)

### Análisis estático de código

* Mediante analizadores estáticos (**linters**)
  * [Introducción a los linters -en inglés-](https://github.com/mcandre/linters)
* Mediante sitios web para inspección de código (**Continuous Inspection**)&#x20;

### Linters

* Analizadores estáticos de código:
  * **lint**: C &#x20;
  * **sonar**: Java
  * **JSLint**, **ESLint**: Javascript&#x20;

### Continuous Inspection o Continuous Analysis

* Sitios web que ofrecen **inspección de código**:
  * **Scrutinizer**
  * **SonarQube**

#### Scrutinizer

[ ![scrutinizer](http://jamj2000.github.io/entornosdesarrollo/4/assets/scrutinizer.png) ](https://scrutinizer-ci.com)

* PHP, Python y Ruby soportados
* 14 días de prueba gratis
* Precio/Mes:
  * Plan Basic: 49 €
  * Plan Professional: 99 €
  * Plan Unlimited: 199 €

Note: A fecha Diciembre 2017

#### SonarQube

[ ![sonarqube](http://jamj2000.github.io/entornosdesarrollo/4/assets/sonarqube.png) ](https://www.sonarqube.org/)

* Más de 20 lenguajes soportados
* Precio/Mes:
  * Plan Open Source: 0 $
  * Plan Private Projects: Desde 5 $&#x20;

Note: A fecha Diciembre 2017

### Refactorización

* Es el proceso de reestructurar un código fuente, alterando su estructura interna sin cambiar su comportamiento externo.&#x20;
* Técnicas:
  * Renombrado de variables
  * Pasar código duplicado a funciones
  * Eliminación de código inalcanzable
  * Eliminación de código redundante&#x20;
  * Eliminación de código muerto
  * ...

[Artículo en Wikipedia](https://es.wikipedia.org/wiki/Eliminación_de_código_muerto)

## Documentación

### Insignias (badges)

[ ![badges](http://jamj2000.github.io/entornosdesarrollo/4/assets/badges.png) ](https://shields.io/)

### Tipos de documentación

* Documentación de código
* Documentación técnica
* Documentación de usuario

### Formatos de documentación

* **HTML** (p. ej. Javadoc)
* **Markdown** (p. ej. Gitbook)
* **reStructuredText** (p. ej. Readthedocs)
* **asciiDoc**&#x20;

## Control de versiones

### Sistemas más conocidos:

* CVS
* Subversion
* Mercurial
* **Git**

### Git

**Características**

* Moderno
* Distribuido
* Eficiente

### Git (Conceptos)

* Repository (local & remote)
* Commit
* Branch
  * Checkout
  * Merge (fast-forward, 3-way)

### Git (Áreas)

![Git areas](http://jamj2000.github.io/entornosdesarrollo/4/assets/git-areas1.png)

### Git (Áreas)

![Git areas](http://jamj2000.github.io/entornosdesarrollo/4/assets/git-areas2.png)

### Git (Ramas)

![Git areas](http://jamj2000.github.io/entornosdesarrollo/4/assets/git-branches.png)

### Git (Comandos)

```bash
# Configuración
  config 

# Repositorios
  clone, remote add, remote rm

# Básicos
  init, status, log, add, rm, commit, push, pull

# Ramas (branches)
  branch, branch -d, merge, checkout, stash

# Otros
  diff, tag, submodule
```

[CheatSheet](https://services.github.com/on-demand/downloads/github-git-cheat-sheet.pdf)

### Sitios que soportan GIT

* [**GitHub**](https://github.com)
* [**Bitbucket**](https://bitbucket.org/)
* [**GitLab**](<https://gitlab.com/ >)
* [**Coding -en chino-**](https://coding.net/)

![Git sites](http://jamj2000.github.io/entornosdesarrollo/4/assets/git-sites.png)


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://kibrands.gitbook.io/apuntes-ed/4.documentacion.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
