algorithme vague
This commit is contained in:
parent
cf1b3ac498
commit
4e29983800
|
@ -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)
|
||||||
|
|
|
@ -199,9 +199,14 @@ Portée locale dans une expression
|
||||||
# a ;;
|
# a ;;
|
||||||
Error: Unbound value a
|
Error: Unbound value a
|
||||||
|
|
||||||
|
.. important::
|
||||||
|
|
||||||
|
L’ordre d’évaluation dans un let ... in ... est bien déterminé,
|
||||||
|
sans grande importance dans un cadre purement fonctionnel, mais important
|
||||||
|
en cas d’effets 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::
|
|
||||||
|
|
||||||
L’ordre d’évaluation dans un let ... in ... est bien déterminé,
|
|
||||||
sans grande importance dans un cadre purement fonctionnel, mais important
|
|
||||||
en cas d’effets 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
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue