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 :

POO : Je fais de la merde et j'ai besoin d'aide.


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 POO : Je fais de la merde et j'ai besoin d'aide.
    Bonjour à tous,

    Je viens quémander un peu d'aide pour débarbouiller un bout de code que j'ai écrit car je n'arrive pas à produire ce que je veux de manière propre.
    Mes problèmes se posent au niveau de l'héritage et de la surcharge de propriété.

    Dans la classe de base, j'ai une propriété d'un type de base. Dans la classe dérivée, j'ai une propriété d'un type dérivé aussi. Mais du coup, si j'instancie la classe dérivée, je me retrouve avec la propriété en double...

    Sans plus d'introduction, voici le code en question :
    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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    Public MustInherit Class PromoDetail
        Public Property DTO As PROMO_DTO.PromoDetail
     
        Public Sub New(d As PROMO_DTO.PromoDetail)
            Me.DTO = d
        End Sub
     
        Public Function GetProducts() As List(Of PROMO_DTO.Product)
            If Me.DTO.Products.Count > 0 Then
                Return Me.DTO.Products
            ElseIf Me.DTO.ProductsOut.Count > 0 Then
                Return Me.DTO.ProductsOut
            Else
                Return Nothing
            End If
        End Function
     
        'Public MustOverride Sub FlagAsEncoded()
     
    End Class
     
    Public Class PromoDetailDemo
        Inherits PromoDetail
     
        Public Overloads Property DTO As PROMO_DTO.PromoDetailDemo
     
        Public Sub New(dto As PROMO_DTO.PromoDetailDemo)
            MyBase.New(dto)
            Me.DTO = dto
        End Sub
     
        Public Sub Delete()
            PROMO_DAL.PromoDetail.Delete(Me.DTO.Id)
        End Sub
    End Class
     
    Public Class PromoDetailsDemo
     
        Public Overloads Property DTO As List(Of PROMO_DTO.PromoDetailDemo)
     
        Public Sub New()
            Me.DTO = New List(Of PROMO_DTO.PromoDetailDemo)
        End Sub
     
        Public Sub New(dto As List(Of PROMO_DTO.PromoDetailDemo))
            Me.DTO = dto
        End Sub
     
        Public Sub Save(prm_id As Integer, ba_id As Byte)
            If CheckPercentageIsUniqueForList() Then
                PROMO_DAL.PromoDetail.SaveDemo(prm_id, ba_id, Me.DTO)
            Else
                Throw New EncodingDemoException("duplicate percentage", DTO(0).CodeDemo)
            End If
        End Sub
     
        Friend Function CheckPercentageIsUniqueForList() As Boolean
            Dim result As Boolean = True
            Dim percentList = (From dto In Me.DTO
                               Where dto.PercentType.Description = "LIST"
                               Select dto.Percentage)
     
            For Each p As Decimal In percentList.ToList
                If (From dto In Me.DTO
                    Where dto.Percentage = p AndAlso dto.PercentType.Description = "LIST"
                    Select dto).ToList.Count > 1 Then
                    result = False
                End If
            Next
            Return result
        End Function
     
        Public Sub GetProducts()
            For Each d As PROMO_DTO.PromoDetailDemo In Me.DTO
                d.Products = PROMO_DAL.Product.GetDemoProduct(d.Id)
                d.ProductsOut = PROMO_DAL.Product.GetDemoProductOut(d.Id)
            Next
        End Sub
    End Class
     
    Public Class PromoDetailOwn
        Inherits PromoDetail
     
        Public Overloads Property DTO As PROMO_DTO.PromoDetailOwn
     
        Public Sub New(dto As PROMO_DTO.PromoDetailOwn)
            MyBase.New(dto)
            Me.DTO = dto
        End Sub
    End Class
     
    Public Class PromoDetailsOwn
        Public Property DTO As List(Of PROMO_DTO.PromoDetailOwn)
     
        Public Sub New()
            DTO = New List(Of PROMO_DTO.PromoDetailOwn)
        End Sub
     
        Public Sub New(dto As List(Of PROMO_DTO.PromoDetailOwn))
            Me.DTO = dto
        End Sub
     
        Public Sub Save(prm_id As Integer, ba_id As Byte)
            PROMO_DAL.PromoDetail.SaveOwn(prm_id, ba_id, Me.DTO)
        End Sub
     
        Public Sub GetProducts()
            For Each d As PROMO_DTO.PromoDetailOwn In Me.DTO
                d.Products = PROMO_DAL.Product.GetOwnProduct(d.Id)
                d.ProductsOut = PROMO_DAL.Product.GetOwnProductOut(d.Id)
            Next
        End Sub
    End Class
     
    Public Class PromoDetailDepartment
        Inherits PromoDetail
     
        Public Overloads Property DTO As PROMO_DTO.PromoDetailDepartment
     
        Public Sub New(dto As PROMO_DTO.PromoDetailDepartment)
            MyBase.New(dto)
            Me.DTO = dto
        End Sub
    End Class
     
    Public Class PromoDetailsDepartment
        Public Property DTO As List(Of PROMO_DTO.PromoDetailDepartment)
     
        Public Sub New()
            Me.DTO = New List(Of PROMO_DTO.PromoDetailDepartment)
        End Sub
     
        Public Sub New(dto As List(Of PROMO_DTO.PromoDetailDepartment))
            Me.DTO = dto
        End Sub
     
        Public Sub save(prm_id As Integer, ba_id As Byte)
            PROMO_DAL.PromoDetail.SaveDepartment(prm_id, ba_id, Me.DTO)
        End Sub
     
        Public Sub GetProducts() 'there is no inclusive list for department
            For Each d As PROMO_DTO.PromoDetailDepartment In Me.DTO
                d.ProductsOut = PROMO_DAL.Product.GetDeptProductOut(d.Id)
            Next
        End Sub
    End Class
    Il y a probablement plein de trucs à corriger là-dedans et, n'ayant jamais eu de vrai cours de POO ni aucun "expert" dans mon antourage avec qui échanger sur le sulet, je suis bien conscient, qu'en terme de POO, je fais de la merde. Donc lachez-vous, pour ce coup-ci, tout est permis .

  2. #2
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 204
    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 204
    Par défaut
    overloads sert à ajouter quelque chose du même nom
    overrides sert à remplacer dans un héritage, mais il ne peut etre utiliser que pour quelque chose de similaire (type et signature)

    donc ca n'ira pas dans ton cas

    par contre en général on utilise juste la propriété de base as le type de base, car tu peux ranger une instance de PromoDetailOwn dans une propriété de type PromoDetail vu qu'il y a héritage

    il faudrait détailler l'utilité de tout ca sinon
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  3. #3
    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 Pol63 Voir le message
    overloads sert à ajouter quelque chose du même nom
    overrides sert à remplacer dans un héritage, mais il ne peut etre utiliser que pour quelque chose de similaire (type et signature)

    donc ca n'ira pas dans ton cas
    Ah bin c'est ce que j'avais compris et je pensais que je faisais fausse route... Zut !
    Citation Envoyé par Pol63 Voir le message
    par contre en général on utilise juste la propriété de base as le type de base, car tu peux ranger une instance de PromoDetailOwn dans une propriété de type PromoDetail vu qu'il y a héritage
    Mais si je mets une instance de PromoDetailOwn dans une propriété de type PromoDetail, quand je tente d'accéder à la propriété, toutes les propriétés (publiques) de la classe PromoDetailOwn sont-elles alors bien accessibles ? Mon problème de compréhension/utilisation se situe quelque part ici je pense.


    Citation Envoyé par Pol63 Voir le message
    il faudrait détailler l'utilité de tout ca sinon
    Ca par contre, ça risque d'être fort long car c'est plein de concept et jargon propre à l'entreprise où je bosse... Du coup, j'aimerais autant éviter ^^

  4. #4
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 204
    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 204
    Par défaut
    Citation Envoyé par Kropernic Voir le message
    Mais si je mets une instance de PromoDetailOwn dans une propriété de type PromoDetail, quand je tente d'accéder à la propriété, toutes les propriétés (publiques) de la classe PromoDetailOwn sont-elles alors bien accessibles ? Mon problème de compréhension/utilisation se situe quelque part ici je pense.
    ca dépend ^^

    depuis visual studio l'intellisense va te l'interdire
    par contre on peut faire if typeof instance is teltype then directcast(instance,teltype).propriété

    mais si tu dois faire ca souvent ca veut dire qu'il y a un problème de conception

    normalement avec le polymorphisme on s'arrange pour ne pas se soucier de ce que c'est
    par exemple si tu as des produits en stock propre, et des produits en dépot vente, ils ont tous les 2 un fonctionnement différent lors d'une vente
    sur le produit en stock tu décrémentes le stocks et ajoute le prix sur ton compte
    pour le produit en dépot vente tu décrémentes le stock, tu ajoute une partie du prix sur ton compte et le reste est à restituer à un tiers

    dans ce cas les 2 classes ont une méthode Vente(nb as integer)
    le 1er tu fais x requetes en bases (update stock, update moncompte)
    le 2ème tu fais d'autres requetes (update stock, upate moncompte, insert into argentàrestituer)

    par contre au niveau du code tu travailles avec des collections typées sur l'instance de base, et tu fais juste .vente sans te poser de question

    ca sert à ca le polymorphisme, quand tu rajoutes une classes (même 6 mois après) tu la fait rentrer dans le moule de ce qu'on peut faire dessus, et tu codes ce qu'elle a de spécifique
    par contre il faut arriver à abstraire tout le fonctionnement pour n'avoir que des membres génériques (il arrive parfois qu'on ait un ou deux trucs spécifiques, et c'est là qu'intervient le typeof/directcast, ou des interfaces quand on a trop de spécificités, genre IGereStock)
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  5. #5
    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
    Bon puisque t'as l'air de connaître le principe, je rentre plus en détail alors (ou alors j'avais p-e déjà expliqué dans une autre discussion^^).

    Le problème est effectivement de différencier le stock propre du dépôt vente. Mais je ne travaille pas sur les produits en eux-même. Je travaille sur les promos qui les concernent.

    Au départ, il y a donc la promo qui malgré sa chiée de propriétés est une classe assez simple (j'ai viré le constructeur pour plus de concision).
    N.B. : Mes DTO's ne sont pas de vrai DTO car certains contiennent une méthode ToString et des propriétés qui sont calculées

    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
    Public Class Promo
        Implements DtoBase
     
        Public Property Isnew As Boolean Implements DtoBase.Isnew
     
        Public Property Id As Integer
        Public Property Description As String
        Public Property Surtype As Surtype
        Public Property Type As PromoType
        Public Property StartDate As Date
        Public Property EndDate As Date
        Public Property StartTime As TimeSpan
        Public Property EndTime As TimeSpan
        Public Property Validated As Boolean
        Public Property ValidatedOn As DateTime
        Public Property Encoded As Boolean
        Public Property EncodedOn As DateTime
        Public Property Released As Boolean
        Public Property ReleasedOn As DateTime
        Public Property Tested As Boolean
        Public Property TestedOn As DateTime
     
        Public Property DetailsDemo As List(Of PromoDetailDemo)
        Public Property DetailsOwn As List(Of PromoDetailOwn)
        Public Property DetailsDepartment As List(Of PromoDetailDepartment)
        Public Property Targets As List(Of Target)
        Public Property Stores As List(Of Store)
        Public Property Days As List(Of Day)
     
    End Class
    Une promo peut porter sur 3 choses :
    1. Du stock propre (propriété DetailsOwn)
    2. Du stock en dépôt vente (propriété DetailsDemo)
    3. Tout un rayon de stock propre (propriété DetailsDepartment). C'est un cas particulier, oublions-le pour le moment.


    Pour le stock propre, on a besoin :
    • d'une description
    • d'une remarque (facultatif)
    • du rayon
    • de la marque
    • du pourcentage à appliquer
    • de la liste des articles sur lesquels la promo s'applique (inclusion) ou ne s'applique pas (exclusion). C'est l'un ou l'autre, pas les deux.


    Pour le stock en dépôt vente on a besoin :
    • d'une description
    • d'une remarque (facultatif)
    • du code démo (qui est un code unique faisant référence à une triple (rayon, fournisseur, marque))
    • du pourcentage à appliquer
    • de la liste des articles sur lesquels la promo s'applique (inclusion) ou ne s'applique pas (exclusion). C'est l'un ou l'autre, pas les deux.


    Sur base de cela, il me semblait logique de créer une classe de base contenant les points en commun et deux classes dérivées pour les points propres à chaque type.
    Ce qui a donné ceci :
    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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    Public Class PromoDetail
        Implements DtoBase
     
        Public Property Isnew As Boolean Implements DtoBase.Isnew
     
        Public Property Id As Integer
        Public Property Description As String
        Public Property Note As String
        'Public Property PriceReduction As Boolean
        Public Property Percentage As Decimal
        Private _listType As String
        Public ReadOnly Property ListType As String
            Get
                Return _listType
            End Get
        End Property
        Private _productCount As Integer
        Public ReadOnly Property ProductCount As Integer
            Get
                Return _productCount
            End Get
        End Property
     
        Private _products As List(Of Product)
        Public Property Products As List(Of Product)
            Get
                Return _products
            End Get
            Set(value As List(Of Product))
                _products = value
                If value.Count > 0 Then
                    _listType = "INC"
                    _productCount = value.Count
                End If
            End Set
        End Property
     
        Private _productsOut As List(Of Product)
        Public Property ProductsOut As List(Of Product)
            Get
                Return _productsOut
            End Get
            Set(value As List(Of Product))
                _productsOut = value
                If value.Count > 0 Then
                    _listType = "EXC"
                    _productCount = value.Count
                End If
            End Set
        End Property
     
    End Class
     
    Public Class PromoDetailDemo
        Inherits PromoDetail
     
        Public Property CodeDemo As CodeDemo
     
    End Class
     
    Public Class PromoDetailOwn
        Inherits PromoDetail
     
        Public Property Department As Department
        Public Property Brand As Brand
     
    End Class
    Voilà pour les DTO. Jusque là, je pense que c'est plutôt clair et correct. Du moins je l'espère.

    J'ai donc créé les objets de la BLL qui manipulent ces DTO selon la même idée et cela a donné le code que j'ai montré au début de le discussion.

    Comment aurais-je du faire ? / Comment aurais-tu fait ?

  6. #6
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 204
    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 204
    Par défaut
    Citation Envoyé par Kropernic Voir le message
    Bon puisque t'as l'air de connaître le principe, je rentre plus en détail alors (ou alors j'avais p-e déjà expliqué dans une autre discussion^^).
    Alors soit c'est mon inconscient qui a déjà lu ca, soit j'ai tapé dans le mille, c'est en voyant des produits et des Own que j'ai imaginé cet exemple ...



    sinon tu as bien décris les données à stocker, mais pas les traitements
    parce que niveau stockage ca ne pose pas de problème de polymorpher ^^

    sinon je vois bien une classe promo (pas mustinherit, ceci c'est utile en cas de mustoverride surtout)
    description
    list produits inclus/exclus
    is inclusion
    ...
    rayon
    marque

    et une classe promoDepot inherits avec en plus fournisseur et une propriété qui génère le code démo


    mais bon après s'il n'y a pas de méthode sur tes classes ca s'arrete là (ni d'affichage)
    et pour stocker tout ca un list(of promo)
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

Discussions similaires

  1. Réponses: 2
    Dernier message: 20/03/2015, 17h33
  2. Besoin d'aide sur un exercice en POO
    Par scriptkiddie dans le forum Débuter
    Réponses: 4
    Dernier message: 24/06/2013, 09h56
  3. [POO] Classe et objet: besoin d'aide
    Par Touareg dans le forum Langage
    Réponses: 4
    Dernier message: 27/02/2007, 17h04
  4. Réponses: 3
    Dernier message: 10/11/2002, 11h03

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