9 bonnes pratiques pour améliorer la qualité de votre code PowerBuilder

Écrire un code PowerBuilder propre et efficace est essentiel pour développer des applications performantes et faciles à maintenir. Ce guide couvre des règles de codage clés pour éliminer la complexité inutile, clarifier la logique et suivre les meilleures pratiques de programmation structurée.

Visual Expert vous aide à détecter automatiquement ces problèmes de qualité de code dans votre code PowerBuilder et SQL, vous permettant de vous concentrer sur l’essentiel : développer un logiciel fiable. Explorons les neuf règles les plus importantes à suivre.

  1. Refactoriser les boucles avec au maximum une itération
  2. Éviter les conditions de fin de boucle FOR codées en dur
  3. Ne jamais utiliser GOTO dans les boucles
  4. Préférer les instructions EXIT structurées dans les boucles
  5. Refactoriser les boucles SQL avec une seule itération
  6. Créer des conditions d'instructions IF dynamiques
  7. Éviter les sous-requêtes nullables dans les conditions NOT IN
  8. Éliminer les conditions contradictoires dans la clause WHERE
  9. Supprimer les conditions redondantes dans la clause WHERE

Règles de qualité de code PowerBuilder

1. Refactorisez les boucles avec une seule itération

Les boucles qui ne s’exécutent qu’une seule fois ajoutent une complexité inutile et nuisent à la lisibilité du code. Il est préférable de réécrire ces blocs pour exécuter directement la logique concernée.

Pourquoi c’est important :

  • Complexité réduite : Une structure plus simple améliore la maintenabilité
  • Lisibilité accrue : Une logique claire est plus facile à comprendre
  • Meilleure efficacité : Supprime la surcharge d’exécution
  • Moins de mémoire utilisée : Réduction de la consommation des ressources

Exemple de code non conforme :

function integer TestFunctionCall (integer cnt)

integer A = 1, B = cnt

DO WHILE A <= 15 //Non compliant code (Only one iteration will take place because of EXIT)
      A = (A + 1) * B;
      EXIT;
LOOP

return A

end function

Exemple de code conforme :

function integer TestFunctionCall (integer cnt)

integer A = 1, B = cnt

DO WHILE A <= 15 //Compliant code
      A = (A + 1) * B;
         IF counter > 10 THEN
		    EXIT;
	    ELSE
		    A = B;
	    END IF;
LOOP

return A

end function
function void TestFunctionCall ()
do while IsValid (lpo_parent) //Compliant code
	if lpo_parent.TypeOf() <> window! then
		lpo_parent = lpo_parent.GetParent()
	else
		exit
	end if
loop
end function

2. Évitez les conditions de fin de boucle FOR codées en dur

Coder en dur les limites de boucle rend le code rigide et sujet aux erreurs. Les bornes doivent être définies dynamiquement selon les données traitées.

Pourquoi c’est important :

  • Flexibilité : S’adapte aux évolutions sans modifier le code
  • Lisibilité : Rend la logique d’arrêt plus claire
  • Efficacité : Facilite les ajustements rapides
  • Cohérence : Maintient un style uniforme

Exemple de code non conforme :

function string TestFunctionCall (int cnt)

integer i

for i = 1 to 10 //Non compliant code (FOR loop end condition value is hard-coded)
    boxes[i].Checked = NOT boxes[i].Checked
next

return "

end function

Exemple de code conforme :

function string TestFunctionCall (int cnt)

integer i

for i = 1 to cnt //Compliant code
    boxes[i].Checked = NOT boxes[i].Checked
next

return "

end function

3. N’utilisez jamais GOTO dans les boucles

L’instruction GOTO perturbe le flux structuré du programme et rend la logique difficile à suivre et à maintenir.

Pourquoi c’est important :

  • Évite les boucles infinies : Contrôle mieux les chemins d’exécution
  • Meilleure lisibilité : Clarifie le flux du programme
  • Facilite la maintenance : Simplifie le débogage et les modifications

Exemple de code non conforme :

function int TestFunctionCall (int cnt)

DO WHILE cnt <= 15
    
    IF cnt < 0 THEN
        goto restart; //Non compliant code (GOTO statement is used within loop)
    END IF;
      
      cnt = cnt - 1
LOOP

messagebox('Test','testing... ')

restart: 
if isvalid(cnt) and not isnull( cnt ) then
	messagebox('Test','is valid found ')
end if

return cnt;

end function

Exemple de code conforme :

function cnt TestFunctionCall (int cnt)

DO UNTIL  (cnt <= 15 AND cnt >= 0)
      cnt = cnt - 1
LOOP 

messagebox('Test','testing... ')

if isvalid(cnt) and not isnull( cnt ) then
	messagebox('Test','is valid found ')
end if

return cnt;

end function

4. Utilisez des instructions EXIT structurées

Un simple EXIT dans une boucle peut désorganiser le flux du code. Préférez des conditions structurées comme EXIT WHEN ou des alternatives équivalentes.

Pourquoi c’est important :

  • Évite les exécutions infinies
  • Lisibilité améliorée
  • Optimise l'exécution

Exemple de code non conforme :

function int TestFunctionCall (int cnt)

DO WHILE cnt <= 15
    
    IF cnt < 0 THEN
        EXIT; //Non compliant code (EXIT statement is used within loop)
    END IF;
      
      cnt = cnt - 1
LOOP

return cnt;

end function

Exemple de code conforme :

function cnt TestFunctionCall (int cnt)

DO UNTIL  (cnt <= 15 AND cnt >= 0)
      cnt = cnt - 1
LOOP 

return cnt;

end function

5. Refactorisez les boucles SQL à une seule itération

Les boucles SQL exécutées une seule fois doivent être remplacées par des structures plus simples.

Pourquoi c’est important :

  • Moins d’ambiguïté
  • Code plus clair
  • Plus facile à maintenir

Exemple de code non conforme :

WHILE ( SELECT AVG(ListPrice) FROM dbo.DimProduct) < 300   --Non compliant code (While loop will break after first iteration)
BEGIN  
    UPDATE dbo.DimProduct SET ListPrice = ListPrice * 2;  

    SELECT MAX ( ListPrice) FROM dbo.DimProduct; 

    BREAK;  
END

Exemple de code conforme :

WHILE ( SELECT AVG(ListPrice) FROM dbo.DimProduct) < 300   --Compliant code (While loop will break based on the IF condition result)
BEGIN  
    UPDATE dbo.DimProduct  
        SET ListPrice = ListPrice * 2;  

    SELECT MAX ( ListPrice) FROM dbo.DimProduct;

    IF ( SELECT MAX (ListPrice) FROM dbo.DimProduct) > 500  
        BREAK;  
END

6. Créez des conditions IF dynamiques

Les conditions IF toujours vraies ou toujours fausses sont inutiles et doivent être évitées.

Pourquoi c’est important :

  • Évite les exécutions inutiles
  • Améliore la précision du code
  • Optimise les performances
  • Lisibilité renforcée

Exemple de code non conforme :

function string TestFunctionaCall (string cnt)

if true then //Non compliant code
	messagebox('true')
end if

if false then //Non compliant code
	messagebox('false')
end if

return cnt

end function

Exemple de code conforme :

function string TestFunctionaCall (string cnt)

if cnt == 'true' then //Compliant code
	messagebox('true')
end if

if cnt == 'false' then //Compliant code
	messagebox('false')
end if

return cnt

end function

7. Évitez les sous-requêtes NULL dans les conditions NOT IN

Des valeurs NULL dans les sous-requêtes utilisées avec NOT IN peuvent produire des résultats incorrects.

Pourquoi c’est important :

  • Meilleure cohérence des données
  • Meilleure performance
  • Résultats plus fiables

Exemple de code non conforme :

CREATE TABLE Type1
(
    TypeId INT,
    TypeName VARCHAR(50),
    TypeCategory VARCHAR(50)
)
GO
CREATE TABLE Type2
( 
    TypeId INT,
    TypeName VARCHAR(50),
    TypeCategory VARCHAR(50)
)
GO

SELECT TypeId, TypeName, TypeCategory
FROM Type1  
WHERE TypeId NOT IN (SELECT TypeId FROM Type2)  --Non compliant code (TypeId column might be null)

Exemple de code conforme :

CREATE TABLE Type1
(
    TypeId INT,
    TypeName VARCHAR(50),
    TypeCategory VARCHAR(50)
)
GO
CREATE TABLE Type2
( 
    TypeId INT IDENTITY(1,1) NOT NULL, --Compliant code (Ensure that TypeId column is not null)
    TypeName VARCHAR(50),
    TypeCategory VARCHAR(50)
)
GO

SELECT TypeId, TypeName, TypeCategory
FROM Type1  
WHERE TypeId NOT IN (SELECT TypeId FROM Type2)

8. Éliminez les contradictions dans les clauses WHERE

Les conditions contradictoires rendent les requêtes incohérentes et doivent être évitées.

Exemple de contradiction :

WHERE age > 18 AND age < 18

Ce type de clause n’est jamais vrai et doit être corrigé.

Pourquoi c’est important :

  • Résultats précis
  • Code cohérent
  • Meilleure performance

Exemple de code non conforme :

SELECT Product.ProductID,  
Product.Name,
Color  
FROM Production.Product  
WHERE ListPrice > 50  AND ListPrice = 200;  --Non compliant code (Where clause condition is contradictory)

Exemple de code conforme :

SELECT Product.ProductID,  
Product.Name,
Color  
FROM Production.Product  
WHERE ListPrice > 50;  --Compliant code (Where clause condition is not contradictory)

9. Supprimez les conditions redondantes dans les clauses WHERE

Les clauses WHERE trop verbeuses ou redondantes doivent être simplifiées pour des performances accrues.

Pourquoi c’est important :

  • Code plus clair
  • Requêtes plus rapides
  • Résultats plus précis

Exemple de code non conforme :

SELECT Product.ProductID,  
Product.Name,
Color  
FROM Production.Product  
WHERE ListPrice > 50  AND ListPrice = 200;  --Non compliant code (Where clause is having redundant conditions)

Exemple de code conforme :

SELECT Product.ProductID,  
Product.Name,
Color  
FROM Production.Product  
WHERE ListPrice > 50;  --Compliant code (Where clause is not having redundant conditions)

 

Autres cas d’usage pour PowerBuilder

PowerBuilder, Coding Best Practices, Loop Optimization, SQL Query Optimization, Structured Programming, Code Review, Code Maintenance