IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB.NET Discussion :

Concision vs Lisibilité : entre les deux, mon coeur balance


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre expérimenté
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Par défaut Concision vs Lisibilité : entre les deux, mon coeur balance
    Hello,

    Juste une petite question rapide.

    Voici deux bouts de code qui, sauf erreur de ma part, sont fonctionnellement identique.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
                        For Each p As PROMO_DTO.Product In If(dto.ListType = "INC", dto.Products, dto.ProductsOut)
                            Dim drp As DataRow = product.NewRow
                            drp.Item("BRA_ID") = dto.Brand.Id
                            drp.Item("DEP_ID") = dto.Department.Id
                            drp.Item("DTO_PERCENT") = dto.Percentage
                            drp.Item("PLO_BARCODE") = p.EAN
                            drp.Item("PLO_INCLUSIVE") = If(dto.ListType = "INC", True, False)
                            drp.Item("PLO_COLOR") = p.Color
                            drp.Item("PLO_DESC") = p.Description
                            If p.Price.HasValue Then
                                drp.Item("PLO_PRICE") = p.Price.Value
                            End If
                            drp.Item("PLO_SIZE") = p.Size
                            product.Rows.Add(drp)
                        Next
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
                        If dto.ListType = "INC" Then
                            For Each p As PROMO_DTO.Product In dto.Products
                                Dim drp As DataRow = product.NewRow
                                drp.Item("BRA_ID") = dto.Brand.Id
                                drp.Item("DEP_ID") = dto.Department.Id
                                drp.Item("DTO_PERCENT") = dto.Percentage
                                drp.Item("PLO_BARCODE") = p.EAN
                                drp.Item("PLO_INCLUSIVE") = True
                                drp.Item("PLO_COLOR") = p.Color
                                drp.Item("PLO_DESC") = p.Description
                                If p.Price.HasValue Then
                                    drp.Item("PLO_PRICE") = p.Price.Value
                                End If
                                drp.Item("PLO_SIZE") = p.Size
                                product.Rows.Add(drp)
                            Next
                        ElseIf dto.ListType = "EXC" Then
                            For Each p As PROMO_DTO.Product In dto.ProductsOut
                                Dim drp As DataRow = product.NewRow
                                drp.Item("BRA_ID") = dto.Brand.Id
                                drp.Item("DEP_ID") = dto.Department.Id
                                drp.Item("DTO_PERCENT") = dto.Percentage
                                drp.Item("PLO_BARCODE") = p.EAN
                                drp.Item("PLO_INCLUSIVE") = False
                                drp.Item("PLO_COLOR") = p.Color
                                drp.Item("PLO_DESC") = p.Description
                                If p.Price.HasValue Then
                                    drp.Item("PLO_PRICE") = p.Price.Value
                                End If
                                drp.Item("PLO_SIZE") = p.Size
                                product.Rows.Add(drp)
                            Next
                        End If
    Le premier est plus court mais pas forcément le plus clair au premier abord avec les fonctions If.

    Le second est plus long mais on identifie du premier coup d’œil l'utilité de chaque branche du If.

    On est bien d'accord que pour si peu, ma question n'a pas de grand intérêt. Mais j'suis du genre perfectionniste et j'ai pas trop l'habitude des fonctions If. Est-ce une bonne pratique ? Si quelqu'un d'autre doit reprendre ce code (ou si je dois revenir dessus dans 3 mois), j'ai des doutes sur la meilleure écriture.

    Merci d'avance pour vos avis éclairés .

  2. #2
    Expert confirmé Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Par défaut
    Pour éviter la répétition de code identique, j'opterai pour la solution1.

    Si on veut identifier plus clairement les branches du If, on peut prendre la solution 2 à condition d'écrire une procédure "AddProduct" qui aura comme paramètres "p" et "dto".

  3. #3
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 197
    Par défaut
    la 2ème est à bannir, quand on se retrouve avec une bonne partie de code en commun il faut toujours préférer regrouper
    la 1ère je suis pas fan (mais ce n'est en rien illisible vu que quand on relie le code d'une boucle on regarde forcément sur quoi ca boucle, et c'est compréhensible)

    je ferais plutot comme ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    dim coll as ce_que_cest = dto.ProductsOut
    if dto.ListType = "INC" Then coll = dto.Products
     
    For Each p As PROMO_DTO.Product In coll
    mais chacun ses gouts ...
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  4. #4
    Membre expérimenté
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Par défaut
    Ouais mais y a un booleen qui varie aussi dans le for each

  5. #5
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 197
    Par défaut
    soit tu lui laisses ta syntaxe, soit tu appliques la mienne (en 2 lignes par contre) et dans les 2 cas tu peux faire if coll is dto.Products à la place si tu préfères
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  6. #6
    Membre Expert
    Avatar de Sehnsucht
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2008
    Messages
    847
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Octobre 2008
    Messages : 847
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    Dim source = dto.ProductsOut
    Dim isInclusive = False
    If dto.ListType = "INC" Then
        source = dto.Products
        isInclusive = True
    End If
     
    For Each p As PROMO_DTO.Product In source
        Dim drp As DataRow = product.NewRow
        drp("BRA_ID") = dto.Brand.Id
        drp("DEP_ID") = dto.Department.Id
        drp("DTO_PERCENT") = dto.Percentage
        drp("PLO_BARCODE") = p.EAN
        drp("PLO_INCLUSIVE") = isInclusive
        drp("PLO_COLOR") = p.Color
        drp("PLO_DESC") = p.Description
        If p.Price.HasValue Then drp("PLO_PRICE") = p.Price.Value
        drp("PLO_SIZE") = p.Size
        product.Rows.Add(drp)
    Next
    Item est l'indéxeur par défaut de DataRow du coup on est pas obligé d'utiliser .Item à chaque fois (on pourrait aussi utiliser le dictionary member access operator mais comme c'est peu connu et usité )
    À voir aussi si on peut pas simplifier le Price.HasValue ; en assignant directement p.Price (et donc drp("PLO_PRICE") prendrait la valeur Nothing si le Nullable n'a pas de valeur ?)

  7. #7
    Membre expérimenté
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Par défaut
    Ah j'ai bien la manière de Sehnsucht (comment ça se prononce ?^^).

    Pour le membre nullable, c'est la première fois que j'utilise ces machins-là... Du coup, je sais pas trop ce qu'on peut faire ou pas.
    J'ai toujours peur qu'en mettant nothing, que ce soit mal traduit coté db... Au moins en ne mettant rien, je suis certain d'avoir NULL. (qui a dit parano ?)

  8. #8
    Membre expérimenté
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Par défaut
    Citation Envoyé par Sehnsucht Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Dim source = dto.ProductsOut
    Dim isInclusive = False
    If dto.ListType = "INC" Then
        source = dto.Products
        isInclusive = True
    End If
    Item est l'indéxeur par défaut de DataRow du coup on est pas obligé d'utiliser .Item à chaque fois (on pourrait aussi utiliser le dictionary member access operator mais comme c'est peu connu et usité )
    À voir aussi si on peut pas simplifier le Price.HasValue ; en assignant directement p.Price (et donc drp("PLO_PRICE") prendrait la valeur Nothing si le Nullable n'a pas de valeur ?)
    Une mini-question pour être sûr de mettre de nommer correctement le concept utilisé.

    Le fait de ne pas typer explicitement les variables source et isInclusive, c'est bien ce qu'on appelle l'inférence de type ?

    A part économiser quelques caractères, cela a-t-il un autre avantage ?

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 3
    Dernier message: 21/02/2010, 01h24
  2. Réponses: 5
    Dernier message: 28/07/2006, 15h33
  3. [JSP] [JSF] interactions entre les deux ?
    Par faya972 dans le forum Servlets/JSP
    Réponses: 4
    Dernier message: 11/05/2006, 21h25
  4. [GTK/FMOD] Erreur entre les deux
    Par titor dans le forum GTK+ avec C & C++
    Réponses: 6
    Dernier message: 28/12/2005, 20h23
  5. [visual C++/Matlab] communication entre les deux
    Par Bilouzzz dans le forum MFC
    Réponses: 2
    Dernier message: 15/10/2005, 05h05

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo