algorithme vague

This commit is contained in:
gwen 2017-04-18 21:53:35 +02:00 committed by Benjamin Bohard
parent 6e3966418f
commit a2711a778e
3 changed files with 91 additions and 7 deletions

View File

@ -141,7 +141,7 @@ En voici une autre implémentation (en OCaml) :
.. literalinclude:: code/factorielle.ml .. literalinclude:: code/factorielle.ml
:language: ocaml :language: ocaml
On remarque que le **pseudocode** (l'algorithme vague) est très proche de On remarque que le **pseudocode** est très proche de
la syntaxe du python : la syntaxe du python :
.. function:: factorielle(n:int) .. function:: factorielle(n:int)

View File

@ -199,9 +199,14 @@ Portée locale dans une expression
# a ;; # a ;;
Error: Unbound value a Error: Unbound value a
.. important::
Lordre dévaluation dans un let ... in ... est bien déterminé,
sans grande importance dans un cadre purement fonctionnel, mais important
en cas deffets de bord
Exemple de variable globale modifiée localement (** attention, mauvaise pratique ** !) : Exemple de variable globale modifiée localement (**attention, mauvaise pratique** !) :
.. code-block:: python .. code-block:: python
@ -217,11 +222,6 @@ Exemple de variable globale modifiée localement (** attention, mauvaise pratiqu
>>> >>>
.. important::
Lordre dévaluation dans un let ... in ... est bien déterminé,
sans grande importance dans un cadre purement fonctionnel, mais important
en cas deffets de bord
niveau niveau
@ -229,6 +229,36 @@ niveau
de procédures sous lesquelles elle est déclarée. Le programme principal de procédures sous lesquelles elle est déclarée. Le programme principal
a le niveau 0. a le niveau 0.
.. code-block:: python
:linenos:
def _get_config(name):
# return config value
if not isfile(CONFIG_FILE):
raise Exception("Fichier de configuration non existant")
from ConfigParser import ConfigParser
cfg = ConfigParser(allow_no_value=True)
cfg.read(CONFIG_FILE)
if name == "SUBNETS":
return eval(cfg.get('eole', 'subnets')) # c'est une liste de tuple # FIXME
elif name == "LEASES_FILE":
DHCP_PATH = cfg.get('eole', 'container_path_dhcp')
return join('/', DHCP_PATH, 'var/lib/dhcp/dhcpd.leases')
def get_routes(*args, **kwargs):
"""
Send list of reserved IP
return list of tuple (id, machine name, IP, MAC Adress)
"""
cfg = creole_loader(load_extra=True, rw=False, owner=MODNAME,
mandatory_permissive=False)
return zip(cfg.dhcp.dhcp.id_dhcp.id_dhcp, cfg.dhcp.dhcp.id_dhcp.hostname,
cfg.dhcp.dhcp.id_dhcp.ip, cfg.dhcp.dhcp.id_dhcp.macaddress)
On voit que l'objet `cfg` ligne 6 et 7 a le même nom que l'objet `cfg` ligne 19.
C'est autorisé et les espaces de nommages sont différents.
Description d'une fonction Description d'une fonction
~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~

View File

@ -227,3 +227,57 @@ c'est-à-dire des phrases en langage naturel.
jour + 1 jour + 1
et ainsi de suite jusqu'à ce que toutes les phrases soient calculables. et ainsi de suite jusqu'à ce que toutes les phrases soient calculables.
Algorithme vague
--------------------
L'algorithme vague, c'est quand on pense l'algorithme en se plaçant du côté de
l'implémentation en premier. On a le nez dans le guidon, la vue d'ensemble est
difficile.
Voici, tiré du monde réel, un exemple d'algorithme vague
("ce que doit faire une fonction"), placé dans un bout de code
(souvent la **docstring** d'une fonction).
.. code-block:: python
def upsert_route(*args, **kwargs):
"""
Create or modify an existant DHCP route
param tuple (id or null, machine name, IP, MAC Adress)
return True or False with error message
"""
# si id présent alors modification sinon ajout
# récupère la liste des réservations en cours
# y cherche la variable sur la base de l'ID
# modifie les valeurs
# applique la nouvelle conf DHCP
return True
Voici un autre bout de code avec l'algorithme en commentaire,
et l'implémentation effective de l'algorithme
.. code-block:: python
def del_route(*args, **kwargs):
"""
Delete an existant DHCP route
param tuple (id, machine name, IP, MAC Adress)
return True or False with error message
"""
# récupère la liste des réservations en cours
# y cherche la variable sur l'id donné en paramètre
# supprime l'entrée avec vérification que les données fournies
# sont bien dans l'enregistrement à supprimer
# applique la nouvelle conf DHCP
route_to_del = (1, "host2","10.1.2.4","6E:FF:56:A2:AF:17") # FIXME
routes = get_routes()
if route_to_del in routes:
c = creole_loader(load_extra=True, rw=True, owner=MODNAME, mandatory_permissive=False)
c_id = c.dhcp.dhcp.id_dhcp.id_dhcp.index(route_to_del[0])
if c.dhcp.dhcp.id_dhcp.macaddress[c_id]==route_to_del[2] and c.dhcp.dhcp.id_dhcp.ip[c_id]==route_to_del[1]:
c.dhcp.dhcp.id_dhcp.id_dhcp.pop(c_id)
config_save_values(c, MODNAME)
return True
return False