web-dev-qa-db-fra.com

meilleur moyen de créer un objet

Cela semble être une question très stupide et rudimentaire, mais j’ai essayé d’y chercher sur Google, mais je n’ai pas trouvé de réponse satisfaisante,

public class Person
{
    public string Name { get; set; }
    public int Age { get; set; }
    public Person(){}
    public Person(string name, int age)
    {
        Name = name;
        Age = age;
    }
    //Other properties, methods, events...
}

Ma question est la suivante: si j'ai un cours comme celui-ci, quel est le meilleur moyen de créer un objet?

Person p=new Person("abc",15)

OU 

Person p=new Person();
p.Name="abc";
p.Age=15;

Quelle est la différence entre ces deux méthodes et quel est le meilleur moyen de créer des objets?

25
DevT

Décidez si vous avez besoin d'un objet immuable ou non.

Si vous mettez des propriétés public dans votre classe, l'état de chaque instance peut être modifié à tout moment dans votre code. Donc, votre classe pourrait être comme ça:

public class Person
{
    public string Name { get; set; }
    public int Age { get; set; }
    public Person(){}
    public Person(string name, int age)
    {
        Name = name;
        Age = age;
    }
    //Other properties, methods, events...
}

Dans ce cas, avoir un constructeur Person(string name, int age) n'est pas très utile.

La deuxième option consiste à implémenter un type immutable. Par exemple:

public class Person
{
    public string Name { get; private set; }
    public int Age { get; private set; }

    public Person(string name, int age)
    {
        Name = name;
        Age = age;
    }
    //Other properties, methods, events...
}

Vous avez maintenant un constructeur qui définit l’état pour l’instance, once, au moment de la création. Notez que les paramètres pour les propriétés sont maintenant private, vous ne pouvez donc pas modifier l'état une fois votre objet instancié.

Une meilleure pratique consiste à définir les classes comme immuables à chaque fois, si possible. Pour comprendre les avantages des classes immuables, je vous suggère de lire cet article article .

34
davioooh

Cela dépend vraiment de vos besoins, bien que récemment, j’ai vu une tendance pour les classes avec au moins un constructeur nu défini.

L'avantage de publier vos paramètres dans via constructeur est que vous savez que ces valeurs peuvent être utilisées après l'instanciation. L'inconvénient est que vous devrez travailler davantage avec toutes les bibliothèques supposées pouvoir créer des objets avec un constructeur nu.

Ma préférence personnelle est d’utiliser un constructeur nu et de définir les propriétés dans la déclaration.

Person p=new Person()
{
   Name = "Han Solo",
   Age = 39
};

Cela permet de contourner le problème "La classe manque de constructeur nu" et de réduire la maintenance (je peux définir plus de choses sans changer de constructeur).

9
Paul Alan Taylor

Il n'y a pas vraiment de meilleur moyen. Les deux sont à peu près les mêmes, sauf si vous souhaitez effectuer un traitement supplémentaire à l'aide des paramètres transmis au constructeur lors de l'initialisation ou si vous souhaitez assurer un état cohérent juste après l'appel du constructeur. Si c'est le cas, préférez le premier.

Mais pour des raisons de lisibilité/maintenabilité, évitez de créer des constructeurs avec trop de paramètres.

Dans ce cas, les deux feront l'affaire.

6
xlecoustillier

À mon humble avis, il s’agit simplement de décider si les arguments sont facultatifs ou non. Si un objet Personne ne devrait pas (logiquement) exister sans Nom et Age, il devrait être obligatoire dans le constructeur. S'ils sont facultatifs (c'est-à-dire que leur absence ne menace pas le bon fonctionnement de l'objet), utilisez les setters.

Voici une citation de la documentation de Symfony sur l'injection de constructeur:

L'utilisation de l'injection de constructeur présente plusieurs avantages:

  • Si la dépendance est une exigence et que la classe ne peut pas fonctionner sans elle, alors l'injecter via le constructeur garantit sa présence lorsque la classe est utilisée car la classe ne peut pas être construite sans elle.
  • Le constructeur n'est appelé qu'une seule fois lors de la création de l'objet. Vous pouvez donc être sûr que la dépendance ne changera pas pendant la durée de vie de l'objet.

Ces avantages font en sorte que l'injection de constructeur ne convient pas pour travailler avec des dépendances facultatives. Il est également plus difficile à utiliser en combinaison avec des hiérarchies de classes: si une classe utilise l'injection de constructeur, son extension et sa substitution deviennent problématiques.

(Symfony est l’un des frameworks php les plus populaires et les plus respectés)

6
hugo_leonardo

Si vous pensez que moins de code signifie plus d'efficacité, alors utiliser la fonction construct est meilleur . Vous pouvez aussi utiliser un code comme:

Person p=new Person(){
Name='abc',
Age=15
}
4
roast_soul

Cela dépend de vos besoins, mais le moyen le plus efficace de créer est:

 Product obj = new Product
            {
                ID = 21,
                Price = 200,
                Category = "XY",
                Name = "SKR",
            };
0
KIRAN RAJ SADULA

Ou vous pouvez utiliser un fichier de données pour mettre de nombreux objets Personne dans une liste ou un tableau. Vous devez utiliser System.IO pour cela. Et vous avez besoin d'un fichier de données contenant toutes les informations sur les objets. 

Une méthode pourrait ressembler à ceci:

static void ReadFile()
{
    using(StreamWriter writer = new StreamWriter(@"Data.csv"))
    {
        string line = null;
        line = reader.ReadLine();
        while(null!= (line = reader.ReadLine())
                {
                    string[] values = line.Split(',');
                    string name = values[0];
                    int age = int.Parse(values[1]);
                }
        Person person = new Person(name, age);
    }
}
0
Chimmy