Desarrollo ágil

Código y sus olores

jj.github.io/curso-tdd/temas/hacia-tests-unitarios

Refinement

Gestión de dependencias separada de tareas evita conflictos

✓ TODO

□ ¿Hemos comenzado a organizar el desarrollo en milestones?

□ ¿Se han diseñado las excepciones?

□ ¿Se han elegido un task runner y se ha empezado a configurar?

El mejor código es el que no se escribe

Código declarativo FTW

from enum import Enum

IssueState = Enum('IssueState', 'Open Closed')

class Issue:

    def __init__(self, projectName: str, issueId: int ):
        self._state = IssueState.Open
        self._projectName = projectName
        self._issueId = issueId

    def close(self):
        self._state = IssueState.Closed

    def reopen(self):
        self._state = IssueState.Open

Refinement

from enum import Enum
from dataclasses import dataclass

IssueState = Enum('IssueState', 'Open Closed')

@dataclass
class Issue:

    projectName: str
    issueId: str
    state: IssueState = IssueState.Open

    def close(self):
        self.state = IssueState.Closed

    def reopen(self):
        self.state = IssueState.Open

DRY: No te repitas

Limpia tu código

Reflexionar sobre las repeticiones

method new-issue( Project::Issue $issue where $issue.project-name eq
$!project-name) {…}
multi method new-milestone( $milestone where $milestone.project-name eq
        $!project-name) {…}
                            

Evitar los números mágicos

Código limpio y sin encantamientos

Identificar los valores

import ../project


var
  thisProject: Project

thisProject = Project( id: "Foo" )

assert thisProject.id == "Foo"

Valores identificados

import ../project

const projectId= "Foo"
var
  thisProject: Project

thisProject = Project( id: projectId )

assert thisProject.id == projectId

Algo huele mal en tu código

Code smells, código idiomático, antipatrones y otros pecados

Usa linters

Examinan estáticamente el código, dan consejos para respetar convenciones

Mi código apesta

Project/core.py:10:0: W0301: Unnecessary semicolon (unnecessary-semicolon)
Project/core.py:1:0: C0114: Missing module docstring (missing-module-docstring)
Project/core.py:1:0: C0115: Missing class docstring (missing-class-docstring)
Project/core.py:6:4: C0116: Missing function or method docstring (missing-function-docstring)
                            …
Project/core.py:9:4: C0103: Method name "newMilestone" doesn't conform to snake_case naming style (invalid-name)
-----------------------------------
Your code has been rated at 0.00/10
                            

✓ TODO hito 10

Elegir un linter y empezar a usarlo

agil.yaml

linter: RuboCop