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

ASP.NET Discussion :

Avis sur l'utilisation de Class en ASP.NET ?


Sujet :

ASP.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    IT Développeur
    Inscrit en
    Mars 2009
    Messages
    274
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : IT Développeur

    Informations forums :
    Inscription : Mars 2009
    Messages : 274
    Par défaut Avis sur l'utilisation de Class en ASP.NET ?
    Bonjour,

    je voudrais avoir l'avis d'expert sur mon utilisation de Class pour un site Web.

    J'ai fais une petite page pour tester.

    J'ai une base de données avec une tables Ouvrages. J'ai créé une class Books.

    Sur mapage, j'ai une DropDownList qui charge 2 colonnes de ma table ouvrages. Pour cela, j'ai instancié un objet book de Type Books.

    Toujours sur cette même page, j'ai un formulaire qui me permet d'enregistrer un nouveau livre dans ma BD.



    Mes Questions sont les suivantes :

    1- Est-ce que créer une class Books vaut la peine?

    2- Est-ce que mon utilisation de la Class est la bonne?

    3- Est-ce que cela vaut la peine d'instancier un objet aussi bien pour charger mes données de ma BD que pour enregistrer mes nouveaux livres dans ma BD?

    Bref, j'ai besoin de vos avis et de vos conseils.

    Merci à tous et voici mon code :

    1- Ma Class Books
    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
    public class Book
    {
        private string bookTitle;
        private string isbn;
        private string auteur;
        private int categorie;
        private decimal prix;
        private int CD;
        private DateTime dateParution;
        private int nbPages;
     
        // Constructeur
        public Book(string bookTitle, string isbn)
        {
            this.bookTitle = bookTitle;
            this.isbn = isbn;
        }
     
        public Book(string isbn, string bookTitle, string auteur, int categorie, decimal prix, int CD, DateTime dateParution, int nbPages )
        {
            this.isbn = isbn;
            this.bookTitle = bookTitle;
            this.auteur = auteur;
            this.categorie = categorie;
            this.prix = prix;
            this.CD = CD;
            this.dateParution = dateParution;
            this.nbPages = nbPages;
        }
     
     
        public string BookTitle { get { return this.bookTitle; } }
     
        public string Isbn { get { return this.isbn; } }
     
        public string Auteur { get { return this.auteur; } }
     
        public int Categorie { get { return this.categorie; } }
     
        public decimal Prix { get { return this.prix; } }
     
        public int Cd { get { return this.CD; } }
     
        public DateTime DateParution { get { return this.dateParution; } }
     
        public int NbPages { get { return this.nbPages; }}
    }
    2- Le traitement
    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
    public partial class _Default : System.Web.UI.Page
    {
     
        protected void Page_Load(object sender, EventArgs e)
        {
            if (IsPostBack == false)
            {
                ChargerListe();
            } 
        }
     
     
        void ChargerListe()
        {
                SqlConnection myConnection = new SqlConnection();
     
     
            myConnection.ConnectionString = "Data Source=PC-LAURENCE\\SQLEXPRESS; Initial Catalog=Librarie; Integrated Security=True;";
            myConnection.Open();
     
            // Requete SQL
            SqlCommand myCommande;
            myCommande = new SqlCommand("SELECT Titre, ISBN from Ouvrages", myConnection);
            SqlDataReader lecteur = myCommande.ExecuteReader();
     
     
            List<Book> books = new List<Book>();
            while (lecteur.Read())
            {
                books.Add(new Book(lecteur["Titre"].ToString(), lecteur["ISBN"].ToString()));
            }
            DdlBooks.DataSource = books;
            DdlBooks.DataTextField = "BookTitle";
            DdlBooks.DataValueField = "Isbn";
            DdlBooks.DataBind();
     
            lecteur.Close();
            myConnection.Close();
        }
     
     
        protected void DdlBooks_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (DdlBooks.SelectedIndex > -1)
            {
                LbBook.Text = DdlBooks.SelectedItem.Text;
                LbIsbn.Text = DdlBooks.SelectedValue;
            }
        }
        protected void Confirmer_Click(object sender, EventArgs e)
        {
            // Instatiation de l'objet Book
     
            Book NewBook = new Book(TxtIsbn.Text, TxtTitre.Text, TxtAuteur.Text, int.Parse(TxtCategorie.Text), decimal.Parse(TxtPrix.Text), int.Parse(TxtCD.Text), DateTime.Parse(TxtParution.Text), int.Parse(TxtPage.Text));
     
            if (Page.IsValid)
            {
                // Connexion à la DB
                // 1° Declaration de l'Objet connexion et création de l'objet
                SqlConnection myConnection = new SqlConnection();
     
                // 2° Ecriture de la chaine de connexion
                myConnection.ConnectionString = "Data Source=PC-LAURENCE\\SQLEXPRESS; Initial Catalog=Librarie; Integrated Security=True;";
                myConnection.Open();
     
                // Requete SQL
                SqlCommand myCommande;
                myCommande = new SqlCommand("Insert INTO Ouvrages (ISBN, Titre, Auteur, Catégorie, Prix, CD, DateParution, NbPages) VALUES('" + TxtIsbn.Text + "', '" + TxtTitre.Text + "', '" + TxtAuteur.Text + "','" + int.Parse(TxtCategorie.Text) +"','"+ decimal.Parse(TxtPrix.Text) +"', '"+ int.Parse(TxtCD.Text) +"', '"+ DateTime.Parse(TxtParution.Text) +"', '"+ int.Parse(TxtPage.Text) +"')", myConnection);
                myCommande.ExecuteReader();
     
            }
     
        }
    }

  2. #2
    Membre extrêmement actif

    Homme Profil pro
    Software Developer
    Inscrit en
    Mars 2008
    Messages
    1 470
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Software Developer

    Informations forums :
    Inscription : Mars 2008
    Messages : 1 470
    Par défaut
    Oui crée une classe Books qui contient une liste de Book.

    Mais tu ne respecte pas les standards.
    Dans ta classe c'est bien tu utilise des "get", mais pourquoi n'utilise pas les "set". Cela te permettra de vérifier la validité des données en entré et de supprimer tous tes private en début de classe (a moins que tu souhaite faire un systeme de cache par exemple).

    J'ai pas mal de cours et de liens sur la POO et les design patterns qui sont le b-a ba du code de qualité, mas c'est en c# et en anglais, fait moi signe si tu es tout de meme intéressé car ca ne s'applique pas spécialement a un language mais a la technique que l'on retrouve partout.

    En tout cas ton accees a la base de données ne doit surtout pas etre dans ton code asp, surtout si tu utilise de la POO.
    Met tout ca dans ta classe Books :
    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
    public class Book
    {
    public Book GetBook(string isbn)
    {
    // ...
    }
    public IEnumerable<Book> GetBooks()
    {
    // ...
    }
    public void InsertBook(Book book)
    {
    // ...
    }
    public void DeleteBook(Book book)
    {
    // ...
    }
    // ...
    }
    Encore mieux, crée une couche d'acces aux données (Data access layer).
    Cela te permettra d'effectuer le lien entre tes classes et ta base de données. Par ailleurs cela facilite grandement la réutilisation, maintenance, sécurité...

    Bon courage.

  3. #3
    Membre éclairé
    Profil pro
    IT Développeur
    Inscrit en
    Mars 2009
    Messages
    274
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : IT Développeur

    Informations forums :
    Inscription : Mars 2009
    Messages : 274
    Par défaut
    Bonjour Alex_Vino,

    merci pour tes conseils. Oui je suis intéressé par tes cours et liens sur la POO. Je connais le principe de la POO mais j'ai du mal à l'appliquer pour un site web. Je cherche des exemples mais je n'en trouve pas.
    J'aimerais bien connaître les bonnes pratiques de la POO en ASP.

    En ce qui concerne la connexion à la BD, après des recherches je mis un ConfigurationSettings dans mon Web.config et j'y fais appel dans mes class pour m'y connecter.

    Merci pour tes conseils

  4. #4
    Membre extrêmement actif

    Homme Profil pro
    Software Developer
    Inscrit en
    Mars 2008
    Messages
    1 470
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Software Developer

    Informations forums :
    Inscription : Mars 2008
    Messages : 1 470
    Par défaut
    Voici des liens:
    - AvSol Coding Guidelines for CSharp 3.0 and 4.0 Cheat Sheet
    - http://csharpguidelines.codeplex.com...ses/view/46137
    - http://www.mediafire.com/?7zbnw2vstrqqtyc
    - http://archive.msdn.microsoft.com/en...ReleaseId=3352
    - http://msdn.microsoft.com/en-us/library/dd460654.aspx
    - http://www.c-sharpcorner.com/UploadF...tedcsharp.aspx
    - http://www.sitepoint.com/c-asp-net-developers/

    C'est un peu dans le désordre, tu regarde ce qui t'intéresse, il y a pas mal de choses sur Google de toute maniere.

    Prend le temps de bien lire si tu veux vraiment bien maitriser la POO et surtout comment bien l'utiliser.
    Si on ne s'y penche pas et que son projet commence a devenir un peu conséquent ou que l'on doit ajouter de nouvelles fonctionnalités, alors c'est la catastrophe et pour bien faire il faudrait recommencer son projet a chaque nouvelle modification demandé par le client.

    Une des choses formatrice est aussi de regarder le code des autres, il n'existe jamais la solution parfaite et c'est bien de comprendre l'approche qu'on les autres.

    Par exemple a mon boulot, toutes les semaines tous les dev se regroupent, on prend le code d'un développeur et on critique en argumentant.

    Le code que tu as écrit fonctionne avec tes classes alors?

  5. #5
    Expert confirmé
    Avatar de Immobilis
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2004
    Messages
    6 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 559
    Par défaut
    Salut,

    La POO est la même quelque soit le langage. Pour ce qui est des architectures et objets à utiliser en .Net cela dépend de beaucoup de choses.

    Pour ce qui est de ton code il y a quelques soucis. Cela peut se résumer par les termes "couplage" et "résponsabilité".

    Couplage: est-ce que mon code est pas un peu trop dépendant d'autres classes?

    Responsabilité: est-ce que ce que je demande à mon code est bien son boulot ou est-ce que je ne devrais pas le faire faire par un autre objet.

    Premièrement, la page fait trop de choses. Comme dit alex_vino, l'accès au données directement dans l'interface est à éviter. Ce n'est pas sa résponsabilité. Le rôle de la page (toutes les IHM) est d'afficher.

    Deuxièmement, un objet métier (Book) ne devrait pas implémenter de méthodes. C'est le rôle des objets résponsable de la logique. Pour reprendre le code d'alex_vino:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public class BookManager
    {
    public Book GetBook(Isbn isbn)
    {
    // ...
    }
    }
    J'ajouterai juste un objet "Isbn" pour éviter d'utiliser une chaine.

    Les objets métier (Book) se contentent de transporter les données. A la rigueur, on peut y ajouter de quoi valider les valeurs.

    Tu trouveras une implémentation parmis d'autres dans ce tutoriel: http://immobilis.developpez.com/arti...ouche-asp-net/

    A+
    "Winter is coming" (ma nouvelle page d'accueil)

  6. #6
    Membre extrêmement actif

    Homme Profil pro
    Software Developer
    Inscrit en
    Mars 2008
    Messages
    1 470
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Software Developer

    Informations forums :
    Inscription : Mars 2008
    Messages : 1 470
    Par défaut
    Merci pour ton tuto Immobilis, il résume exactement tout a la perfection.

    J'ai vu ton lien vers ce tuto sur... mes 3 dernieres pages vues sur le forum.
    C'est vrai qu'il est tres intéressant, dommage qu'il soit si difficile a trouver sur developpez.com

    Je pense que ce sujet est résolu donc, maintenant paintbox tu n'a plus d'excuse pour réaliser un grand projet !

  7. #7
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Par défaut
    Citation Envoyé par alex_vino Voir le message
    Voici des liens:
    - AvSol Coding Guidelines for CSharp 3.0 and 4.0 Cheat Sheet
    - http://csharpguidelines.codeplex.com...ses/view/46137
    - http://www.mediafire.com/?7zbnw2vstrqqtyc
    - http://archive.msdn.microsoft.com/en...ReleaseId=3352
    - http://msdn.microsoft.com/en-us/library/dd460654.aspx
    - http://www.c-sharpcorner.com/UploadF...tedcsharp.aspx
    - http://www.sitepoint.com/c-asp-net-developers/

    C'est un peu dans le désordre, tu regarde ce qui t'intéresse, il y a pas mal de choses sur Google de toute maniere.

    Prend le temps de bien lire si tu veux vraiment bien maitriser la POO et surtout comment bien l'utiliser.
    Si on ne s'y penche pas et que son projet commence a devenir un peu conséquent ou que l'on doit ajouter de nouvelles fonctionnalités, alors c'est la catastrophe et pour bien faire il faudrait recommencer son projet a chaque nouvelle modification demandé par le client.

    Une des choses formatrice est aussi de regarder le code des autres, il n'existe jamais la solution parfaite et c'est bien de comprendre l'approche qu'on les autres.

    Par exemple a mon boulot, toutes les semaines tous les dev se regroupent, on prend le code d'un développeur et on critique en argumentant.

    Le code que tu as écrit fonctionne avec tes classes alors?

  8. #8
    Membre éclairé
    Profil pro
    IT Développeur
    Inscrit en
    Mars 2009
    Messages
    274
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : IT Développeur

    Informations forums :
    Inscription : Mars 2009
    Messages : 274
    Par défaut
    Bonjour,

    je suis toujours le tuto de Immobilis sur l'architecture Multicouches.
    J'ai adapté son exemple à mon cas, site de vente en ligne de livres (simple exercice pour tester le multicouches).

    J'ai donc créé dans mon projet :
    1° - Mon Application Web

    2°- Ma BLL avec :
    - une Class BookManager
    - une Class CategorieManager

    3°- Ma DTO avec :
    - une Class BookEntity
    - une Class CategorieEntity

    4°- Ma DAL avec :
    - une Class BookProvider
    - une Class CategorieProvider

    La Class Categorie me permet simplement d'afficher les différentes catégories de livres (ex: informatique, science...). Je voudrais avoir votre avis sur l'utilité de créer cette Class Categorie. Est-il nécessaire de créer une Class pour cela? Je pense avoir la réponse mais j'aimerais votre avis. (Selon moi : oui c'est nécessaire sinon on perd l’intérêt du Multicouches)
    Est-ce que le fait de la mettre dans une DataList est une bonne pratique.
    Voici comment je l'affiche dans ma page web :
    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
     
    <div class="MenuGauche">
                <ul class="NavigationGauche">
                <asp:DataList ID="ListCategorie" runat="server" 
                     DataSource='<%# this.List %>'>
                     <ItemTemplate>
                     <li>
                      <a href='<%# "default.aspx?Categorie=" + (Container.DataItem as DTO.CategorieEntity).Categorie + "&CodeCategorie= " + (Container.DataItem as DTO.CategorieEntity).Code_Categorie %>' >
                      <%# (Container.DataItem as DTO.CategorieEntity).Categorie %> 
                      </a>
                     </li>
                     </ItemTemplate>
                 </asp:DataList>
              </ul>
            </div>
    Mais là où je rencontre un vrai problème est pour l'affichage de ma galerie de produits. En fait, je pense que cela doit un problème de conversion de type mais je ne vois pas très bien comment le résoudre.
    C'est pour l'affichage de mon code ISBN (il doit apparaître dans ImageUrl). Il me sert à rechercher l'image correspondante du livre dans un dossier images. Dans ma DB il s'agit d'un varchar je l'ai donc délcaré comme un string dans mon BookEntity.

    Idemn pour le prix, qui lui est un decimal dans ma BD.
    Voici mon fichier BookEntity:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    public class BookEntity
        {
            public string IdProduit { get; set; }
            public int ISBN { get; set; }
            public string Titre { get; set; }
            public string Auteur { get; set; }
            public string Catégorie { get; set; }
            public decimal Prix { get; set; }
            public string CD { get; set; }
            public string DateParution { get; set; }
            public string NbPages { get; set; }
        }
    et l'affichage dans ma page web via une DataList:

    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
     
            <asp:DataList ID="DataList1" runat="server" DataKeyField="IDProduit"
                RepeatColumns="4" RepeatDirection="Horizontal" BorderWidth="0px" DataSource='<%# this.ListBook %>'>
                <ItemTemplate>
                    <div class="GalerieLivre">
                        <%--<a href='<%#  "fiche.aspx?IDProduit=" + DataBinder.Eval(Container.DataItem, "IDProduit") + "&Categorie= " + LabTheme.Text %>'>--%>
                            <div class="GalerieTitre">
                                <%# (Container.DataItem as DTO.BookEntity).Titre %>
                            </div>
                            <div class="GalerieImage">
                             <asp:Image ID="Image1" runat="server" ImageUrl='<%# (Container.DataItem as DTO.BookEntity).ISBN %>' />
                             <%# (Container.DataItem as DTO.BookEntity).ISBN %>
                            </div>
                            <div class="GalerieAuteur">
                                Auteur:
                                <%# (Container.DataItem as DTO.BookEntity).Auteur %>
                            </div>
                            <div class="GaleriePrix">
                                Prix:
                                <%# (Container.DataItem as DTO.BookEntity).Prix %>
                            </div>
                        </a>
                    </div>
                </ItemTemplate>
            </asp:DataList>
    A noter que le reste des données pour cette page s'affiche correctement.

    Pouvez-vous me donner votre avis sur le code et surtout me dire pourquoi le code ISBN (il doit apparaître dans ImageUrl) et le prix ne s'affichent pas?

    Merci pour votre aide.

    N'hésitez pas à me dire si je dois créer un nouveau Post?

Discussions similaires

  1. Un avis sur l'utilisation ou non d'AMFPHP
    Par berceker united dans le forum Flex
    Réponses: 2
    Dernier message: 24/07/2009, 17h40
  2. Votre avis sur un diagramme de classe
    Par bassim dans le forum Diagrammes de Classes
    Réponses: 3
    Dernier message: 12/06/2007, 02h24
  3. Votre avis sur ce module de classe perso
    Par borislotte dans le forum Access
    Réponses: 2
    Dernier message: 06/12/2006, 12h20
  4. demande d'avis sur l'utilisation d'une date
    Par mrkinfo dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 27/07/2006, 19h50
  5. [UML] Avis sur un diagramme de classe
    Par TraPpeur dans le forum Diagrammes de Classes
    Réponses: 6
    Dernier message: 15/03/2006, 11h56

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