« Foreach pattern (langage) » : différence entre les versions

De Wiki1000
Aucun résumé des modifications
Aucun résumé des modifications
 
(10 versions intermédiaires par 2 utilisateurs non affichées)
Ligne 1 : Ligne 1 :
{{new|Thaoe}}
{{new|650}}
===ForEachP pattern===
===ForEachP pattern===
Le pattern foreachP permet de réaliser une énumération sur une collection supportant les énumérations.
Le pattern foreachP permet de réaliser une énumération sur une collection supportant les énumérations.
Ligne 12 : Ligne 12 :
:Doit être du type de l'énumération
:Doit être du type de l'énumération


{{tip|Certains énumérateurs supportent un type par défaut pour la variable de boucle, ceci permet de définir la variable de boucle dans l'instruction sans définir son type}}
{{tip|Certains énumérateurs supportent un type par défaut pour la variable de boucle, ceci permet de définir la variable de boucle dans l'instruction sans définir son type en utilisant la syntaxe : foreachP var inst in ....}}


*in|from
*in | from
:Mode de gestion de l'énumération
:Mode de gestion de l'énumération


Ligne 21 : Ligne 21 :
|in
|in
|Get
|Get
|L'instance est obtenue de l'énumération
|L'instance est obtenue de l'énumération.
|-
|-
|from
|from
|GetAndRemove
|GetAndRemove
|L'instance est obtenue puis retirée de l'énumération
|L'instance est obtenue puis retirée de l'énumération.
|}
|}
{{tip|in et from sont équivalents pour un curseur.}}


*C
*C
Ligne 34 : Ligne 36 :
:Index de boucle
:Index de boucle


*with transaction
*with [ distinct | global | long ] transaction
:Mode de gestion de transaction
:Mode de gestion de transaction


Ligne 42 : Ligne 44 :
|Pas de gestion de transaction
|Pas de gestion de transaction
|-
|-
|distinct
|transaction
|Une transaction par corps de boucle.
|-
|distinct transaction
|Une transaction par corps de boucle.
|Une transaction par corps de boucle.
|-
|-
|global
|global transaction
|Une transaction pour l'ensemble de la boucle.
|Une transaction pour l'ensemble de la boucle.
|-
|-
|long
|long transaction
|Une transaction longue pour l'ensemble du corps de boucle.
|Une transaction longue pour l'ensemble du corps de boucle.
|}
|}
Ligne 56 : Ligne 61 :


{| class="wikitable"
{| class="wikitable"
|-
|aucun
|Une exception arrête l'instruction et est propagée.
|-
|-
|break
|break
|Une exception arrête l'instruction et est propagée.
|Une exception arrête l'instruction et est propagée.
|-
|-
|continue
|continue (par défaut)
|Une exception est trappée et n'arrête pas l'instruction.
|Une exception est trappée et n'arrête pas l'instruction.
|}
|}


Exemple :
{{tip|Lorsque le mode de gestion des exceptions est ''continue'' l'itération dans laquelle se produit l'exception sera interrompue. L'exception est ensuite ignorée et l'exécution de la boucle reprend.}}
 
Exemples :


<source lang="delphi">
<source lang="delphi">
Ligne 75 : Ligne 79 :
   Cursor := WFClasseA.CreateCursorWhere('','',true,['A',1]);
   Cursor := WFClasseA.CreateCursorWhere('','',true,['A',1]);


   foreachP inst in cursor index count with long transaction do
   with long transaction do
  begin
  foreachP inst in cursor index count do
    List.AddRef(inst);
    begin
    if List.Count=100 then
      List.AddRef(inst);
      begin
      if List.Count=100 then
        parallel doProcessList(List);
      begin
        List.Clear;
        parallel doProcessList(List);
       end;
        List.Clear;
  end;
      end;
    end;
end;
</source>
 
'''Avec gestion de la transaction :'''
 
<source lang="delphi">
var inst:WFClasseA; cursor:WFClasseACursor; count:Integer; tk:Int64;
begin
  List := WFClasseA.CreateList;
  Cursor := WFClasseA.CreateCursorWhere('','',true,['A',1]);
 
  foreachP inst in cursor index count with long(100) transaction do
    begin
       parallel doProcessInstance(inst);
    end;
end;
end;
</source>
</source>


Variable de boucle définie dans l'instruction :
'''Variable de boucle définie dans l'instruction :'''


<source lang="delphi">
<source lang="delphi">
Ligne 95 : Ligne 115 :
   Cursor := WFClasseA.CreateCursorWhere('','',true,['A',1]);
   Cursor := WFClasseA.CreateCursorWhere('','',true,['A',1]);


   foreachP var inst:WFClasseA in cursor index count with long transaction do
   with long transaction do
  begin
  foreachP var inst:WFClasseA in cursor index count do
    List.AddRef(inst);
    begin
    if List.Count=100 then
      List.AddRef(inst);
      begin
      if List.Count=100 then
        parallel doProcessList(List);
      begin
        List.Clear;
        parallel doProcessList(List);
      end;
        List.Clear;
  end;
      end;
    end;
end;
end;
</source>
</source>


Variable de boucle typée par l'énumération :
'''Variable de boucle typée par l'énumération :'''


<source lang="delphi">
<source lang="delphi">
Ligne 132 : Ligne 153 :
[[Category:Langage]]
[[Category:Langage]]
[[Category:Code pattern]]
[[Category:Code pattern]]
[[category:Tahoe]]
[[Category:Version650]]

Dernière version du 10 février 2016 à 15:22

stock}}

ForEachP pattern

Le pattern foreachP permet de réaliser une énumération sur une collection supportant les énumérations.

Les différentes syntaxes de ce pattern sont :

foreachP V in|from C [index I] [with [distinct|global|long] transaction] [on except break|continue]  do Statement 
  • V variable de boucle
Doit être du type de l'énumération
Tip : Certains énumérateurs supportent un type par défaut pour la variable de boucle, ceci permet de définir la variable de boucle dans l'instruction sans définir son type en utilisant la syntaxe : foreachP var inst in ....
  • in | from
Mode de gestion de l'énumération
in Get L'instance est obtenue de l'énumération.
from GetAndRemove L'instance est obtenue puis retirée de l'énumération.
Tip : in et from sont équivalents pour un curseur.
  • C
Collection énumérable
  • index I
Index de boucle
  • with [ distinct | global | long ] transaction
Mode de gestion de transaction
aucun Pas de gestion de transaction
transaction Une transaction par corps de boucle.
distinct transaction Une transaction par corps de boucle.
global transaction Une transaction pour l'ensemble de la boucle.
long transaction Une transaction longue pour l'ensemble du corps de boucle.
  • on except
Mode de gestion des exceptions
break Une exception arrête l'instruction et est propagée.
continue (par défaut) Une exception est trappée et n'arrête pas l'instruction.
Tip : Lorsque le mode de gestion des exceptions est continue l'itération dans laquelle se produit l'exception sera interrompue. L'exception est ensuite ignorée et l'exécution de la boucle reprend.

Exemples :

<source lang="delphi"> var list:WFClasseAList; inst:WFClasseA; cursor:WFClasseACursor; count:Integer; tk:Int64; begin

 List := WFClasseA.CreateList;
 Cursor := WFClasseA.CreateCursorWhere(,,true,['A',1]);
 with long transaction do
  foreachP inst in cursor index count do
   begin
     List.AddRef(inst);
     if List.Count=100 then
      begin
        parallel doProcessList(List);
        List.Clear;
      end;
   end;

end; </source>

Avec gestion de la transaction :

<source lang="delphi"> var inst:WFClasseA; cursor:WFClasseACursor; count:Integer; tk:Int64; begin

 List := WFClasseA.CreateList;
 Cursor := WFClasseA.CreateCursorWhere(,,true,['A',1]);
 foreachP inst in cursor index count with long(100) transaction do
   begin
     parallel doProcessInstance(inst);
   end;

end; </source>

Variable de boucle définie dans l'instruction :

<source lang="delphi"> var list:WFClasseAList; cursor:WFClasseACursor; count:Integer; tk:Int64; begin

 List := WFClasseA.CreateList;
 Cursor := WFClasseA.CreateCursorWhere(,,true,['A',1]);
 with long transaction do 
  foreachP var inst:WFClasseA in cursor index count do
   begin
     List.AddRef(inst);
     if List.Count=100 then
      begin
        parallel doProcessList(List);
        List.Clear;
      end;
   end;

end; </source>

Variable de boucle typée par l'énumération :

<source lang="delphi"> var list:WFClasseAList; cursor:WFClasseACursor; count:Integer; tk:Int64; begin

 List := WFClasseA.CreateList;
 Cursor := WFClasseA.CreateCursorWhere(,,true,['A',1]);
 foreachP var inst in cursor index count with long transaction do
  begin
    List.AddRef(inst);
    if List.Count=100 then
     begin
       parallel doProcessList(List);
       List.Clear;
     end;
  end;

end; </source>

Note : La portée des variable de boucle définie dans l'instruction est limitée à l'instruction