2017-09-19 3 views
0

Voici un petit programme pour dire à nos employés le prix de nos couches. Existe-t-il un moyen tel qu'un tableau int ou un moyen optimisé pour définir brandLevelNumber & sizeLevelNumber aux éléments sélectionnés dans la marqueComboBox & the sizeComboBox?Puis-je définir Diaper SizeLevelNumber & BrandLevelNumber en utilisant un tableau ou une méthode différente?

En outre, pensez-vous qu'il existe une meilleure méthode pour que la méthode calculatePricePerDiaper() fonctionne qu'un commutateur dans un commutateur ou d'autres suggestions?

class Diaper 
{ 
    public string brandLevel; 
    public string sizeLevel; 
    public int brandLevelNumber; 
    public int sizeLevelNumber; 

    public string[] brands = {"Earth's Best", "Huggies Snug & Dry", "Huggies Snugglers & Movers", 
         "Luvs", "Pampers Baby Dry", "Pampers Swaddlers & Cruisers", "Seventh Generation", 
         "Store"}; 
    public string[] size = {"Size 1", "Size 2", "Size 3", "Size 4", "Size 5", "Size 6 & 7", 
          "Size N","2T-3T", "3T-4T", "4T-5T","Big Kids" }; 
    public double count; 
    public double price; 
    private double pricePerDiaper; 
    public double finalPrice; 


    public double calculatePricePerDiaper() 
    { 

      switch (brandLevelNumber) 
      { 
       case 0: 
        switch (sizeLevelNumber) 
        { 
         case 1: 
          if (count > 0 && count < 50) 
           pricePerDiaper = 0.12; 
          if (count > 50 && count <= 160) 
           pricePerDiaper = 0.11; 
          if (count > 160) 
           pricePerDiaper = 0.10; 
          break; 
         case 2: 
          if (count > 0 && count <= 42) 
          pricePerDiaper = 0.13; 
          if (count > 42 && count <=105) 
          pricePerDiaper = 0.12; 
          if (count > 150) 
          pricePerDiaper = 0.11; 
          break; 
         case 3: 
          if (count > 0 && count <=36) 
          pricePerDiaper = 0.16; 
          if (count >36) 
          pricePerDiaper = 0.12; 
          break; 
         case 4: 
          if (count > 0 && count <=31) 
          pricePerDiaper = 0.18; 
          if (count > 31 && count <=85) 
          pricePerDiaper = 0.15; 
          if (count >85) 
          pricePerDiaper = 0.14; 
          break; 
         case 5: 
          if (count > 0 && count <=28) 
          pricePerDiaper = 0.21; 
          if (count > 28 && count <= 100) 
          pricePerDiaper = 0.17; 
          if (count > 100) 
          pricePerDiaper = 0.16; 
          break; 
         case 6: 
          if (count > 0 && count <=25) 
          pricePerDiaper = 0.24; 
          if (count > 25) 
          pricePerDiaper = 0.20; 
          break; 
         case 7: 
          if (count > 0 && count <=50) 
          pricePerDiaper = 0.12; 
          if (count > 50) 
          pricePerDiaper = 0.11; 
          break; 
         case 8: 
          if (count > 0 && count <=30) 
          pricePerDiaper = 0.23; 
          if (count >30 && count <= 160) 
          pricePerDiaper = 0.22; 
          break; 
         case 9: 
          if (count > 0 && count <=25) 
          pricePerDiaper = 0.26; 
          if (count > 25 && count <= 55) 
          pricePerDiaper = 0.25; 
          if (count > 61) 
          pricePerDiaper = 0.24; 
          break; 
         case 10: 
          if (count > 0 && count <=22) 
          pricePerDiaper = 0.32; 
          if (count > 22 && count <= 40) 
          pricePerDiaper = 0.31; 
          if (count > 40 && count <= 60) 
          pricePerDiaper = 0.29; 
          if (count>60) 
          pricePerDiaper = 0.27; 
          break; 
         case 11: 
          if (count > 0 && count <=20) 
          pricePerDiaper = 0.41; 
          if (count > 20 && count <= 37) 
          pricePerDiaper = 0.37; 
          if (count >37) 
          pricePerDiaper = 0.36; 
          break; 
        } 
       break; 
      } 

     return pricePerDiaper; 
    } 
    public double calculatePrice(double pricePerDiaper, double count) 
    { 
     price = pricePerDiaper * count; 
     return price; 
    } 

} 


public partial class Form1 : Form 
{ 
    Diaper item = new Diaper(); 
    public Form1() 
    { 
     InitializeComponent(); 
     brandComboBox.DataSource = item.brands; 
     sizeComboBox.DataSource = item.size; 
    } 

    private void Form1_Load(object sender, EventArgs e) 
    { 
     //Make the comboboxes appear empty at initial load 
     //brandComboBox.SelectedItem = null; 
     //sizeComboBox.SelectedItem = null; 
    } 

    private void countTextBox_TextChanged(object sender, EventArgs e) 
    { 
     //So exception isn't thrown if user deletes countTextBox.Text 
     string i = countTextBox.Text; 
     if (double.TryParse(i, out item.count)) 
      item.count = Convert.ToDouble(countTextBox.Text); 
    } 

    private void doneButton_Click(object sender, EventArgs e) 
    { 
     item.finalPrice=(item.calculatePrice(item.calculatePricePerDiaper(), Convert.ToDouble(countTextBox.Text))); 
     priceLabel.Text = "$" + item.finalPrice; 
    } 

    private void brandComboBox_SelectedIndexChanged(object sender, EventArgs e) 
    { 
     item.brandLevel = (string)brandComboBox.SelectedItem; 
     switch (item.brandLevel) 
     { 
      case "Huggies Snug & Dry": 
      case "Pampers Baby Dry": 
       item.brandLevelNumber = 0; 
       break; 
      case "Earth's Best": 
      case "Huggies Snugglers & Movers": 
      case "Pampers Swaddlers & Cruisers": 
      case "Seventh Generation": 
       item.brandLevelNumber = 1; 
       break; 
      case "Luvs": 
       item.brandLevelNumber = 2; 
       break; 
      case "Store": 
       item.brandLevelNumber = 3; 
       break; 
     } 
    } 

    private void sizeComboBox_SelectedIndexChanged(object sender, EventArgs e) 
    { 
     item.sizeLevel = (string)sizeComboBox.SelectedItem; 
     switch (item.sizeLevel) 
     { 
      case "Size 1": 
       item.sizeLevelNumber = 1; 
       break; 
      case "Size 2": 
       item.sizeLevelNumber = 2; 
       break; 
      case "Size 3": 
       item.sizeLevelNumber = 3; 
       break; 
      case "Size 4": 
       item.sizeLevelNumber = 4; 
       break; 
      case "Size 5": 
       item.sizeLevelNumber = 5; 
       break; 
      case "Size 6 & 7": 
       item.sizeLevelNumber = 6; 
       break; 
      case "Size N": 
       item.sizeLevelNumber = 7; 
       break; 
      case "2T-3T": 
       item.sizeLevelNumber = 8; 
       break; 
      case "3T-4T": 
       item.sizeLevelNumber = 9; 
       break; 
      case "4T-5T": 
       item.sizeLevelNumber = 10; 
       break; 
      case "Big Kids": 
       item.sizeLevelNumber = 11; 
       break; 
     } 
    } 
    } 
} 
+0

Puisque vous cherchez une "méthode optimisée", je suppose que ce code fonctionne. Si c'est le cas, cette question appartient à [Code Review] (https://codereview.stackexchange.com), pas à Stack Overflow. –

Répondre

0

Je recommanderais d'utiliser des tableaux de classes pour stocker vos informations.

class DiaperBrandClass { 
    public string BrandName; 
    public int BrandLevelNumber; 

    public DiaperBrandClass(string brandName, int brandLevel) 
    { 
     this.BrandName = brandName; 
     this.BrandLevelNumber = brandLevel; 
    } 
} 

class DiaperSizeClass { 
    public int SizeLevelNumber; 
    public string SizeDescription;  // This could be made an enum 
    public float BasePrice; 
    public Dictionary<int, float> Discounts; 

    public DiaperSizeClass(int sizeLevel, float basePrice, Dictionary<int, float> discounts, string description) 
    { 
     this.SizeLevelNumber = sizeLevel; 
     this.BasePrice = basePrice; 
     this.Discounts = discounts; 
     this.SizeDescription = description; 
    } 
} 

class DiaperBrandLevelClass { 
    public DiaperSizeClass[] DiaperSizes; 

    public DiaperBrandLevelClass(DiaperSizeClass[] diaperSizes) 
    { 
     this.DiaperSizes = diaperSizes; 
    } 
} 

Ensuite, vous pouvez définir chaque couche au moment de la conception ou de l'exécution. Exemple au moment de la conception:

// We have 4 brand levels 
DiaperBrandLevelClass[] DiaperBrandLevels = new DiaperBrandLevelClass[4]; 

// We would create the 10 DiaperSizeLevels for EACH of the 4 DiaperBrandLevels 
DiaperSizeClass[] DiaperSizeLevels = new DiaperSizeClass[10]; 
// Brand Level #0 (the 'Drys') 
DiaperBrandLevels[0] = new DiaperBrandLevelClass(DiaperSizeLevels); 

// DiaperBrandLevels[0] - Size level #0 ("Size 1") 
DiaperSizeLevels[0] = new DiaperSizeClass(
    0, 
    0.12f, 
    new Dictionary<int, float>() 
    { 
     {50, 0.01},  // Anything above 50 gets a 0.01 discount 
     {160, 0.02}  // Anything above 160 gets a 0.02 discount 
    }, 
    "Size 1" 
); 
// Size level #1 ("Size 2") 
DiaperSizeLevels[1] = new DiaperSizeClass(
    1, 
    0.13f, 
    new Dictionary<int, float>() 
    { 
     {42, 0.01},  // Anything above 50 gets a 0.01 discount 
     {105, 0.02}  // Anything above 160 gets a 0.02 discount 
    }, 
    "Size 2" 
); 
// ... for Size Levels #2-9 ... 

// ... repeat the same as above for the other BrandLevels ... 

Vous aussi créer chaque marque:

DiaperBrandClass[] DiaperBrands = new DiaperBrandClass[8]; 
DiaperBrands[0] = new DiaperBrandClass("Earth's Best", 1); 
DiaperBrands[1] = new DiaperBrandClass("Huggies Snug & Dry", 0); 
// ... 

Vous pouvez ensuite utiliser:

int SelectedBrandLevel = DiaperBrands[brandComboBox.Index].BrandLevelNumber; 
float BasePrice = DiaperBrandLevels[SelectedBrandLevel].DiaperSizes[sizeComboBox.Index].BasePrice; float Discount = DiaperBrandLevels[SelectedBrandLevel].DiaperSizes[sizeComboBox.Index].Discounts[NumberOfDiapers]; 

Bien sûr, aucune vérification d'erreur a été inclus et cela a été écrit sans compilateur ou IDE à proximité, il peut y avoir des erreurs, mais l'idée de base est là. Le bonus à cette méthode est que vous pourriez créer un fichier texte/xml contenant toutes les marques, prix, niveaux, etc. que le programme pourrait charger afin que vous n'ayez pas besoin de recompiler le code chaque fois qu'un prix change. Des trucs de codage dur comme ça doivent être évités (mais c'est bien pour les tests).

EDIT: Si vous utilisez des fichiers texte, utilisez un caractère de commentaire tel que #.

Un fichier de marque pourrait être aussi simple que chaque ligne contenant le nom et le niveau de marque, tels que:

# List all brands using "<name>", <brand level> 
"Earth's Best", 1 
"Huggies Snug & Dry", 0 

Ensuite, vous pouvez créer des fichiers de niveau de la marque qui détiendrait le prix de chaque niveau (éventuellement en 2 lignes, la configuration du fichier est votre choix):

# List each size as <size level>, <base price>, "<description>" on first line 
# and (<threshold1>, <discount1>), (<threshold2>, <discount2>), etc on second 
0, 0.12f, "Size 1" 
(50, 0.01), (160, 0.02) 
1, 0.13f, "Size 2" 
(42, 0.01), (105, 0.02) 

Quelque chose comme ça. La façon dont vous disposez les fichiers est votre choix, juste une idée de base pour vous. Vous pouvez également utiliser des fichiers XML Google et du code C# pour lire/écrire des fichiers XML.

+0

Je clique sur la flèche du haut, mais malheureusement ma réputation est trop faible pour que ça compte. J'apprécie vraiment vos commentaires. J'aime aussi beaucoup votre idée de maintenabilité pour quand je ne travaille pas ici, alors la personne de R & D peut éditer le fichier text/xml. Je pensais que je devrais mettre en place une forme complètement différente dans le Winform avec des fonctions pour ajouter des niveaux de marque, mise à jour des prix, etc. Je ne sais pas comment créer un fichier texte/xml qui contient toutes les marques, les prix, niveaux, etc que le programme pourrait charger "si. Si vous avez le temps et que vous le souhaitez, pourriez-vous m'envoyer un courriel à [email protected]? – PumpedUpKicks91

+0

Vous pouvez créer plusieurs fichiers texte. Voir des exemples dans edit ci-dessus. –

+0

Très bien. Merci pour votre perspicacité. J'ai aussi d'autres programmes de tarification à écrire, et c'est un projet beaucoup plus important que les couches. Jusqu'à présent, j'ai écrit un prix pour animaux de compagnie qui a utilisé quelque chose de similaire à la méthodologie des commutateurs.Je peux modifier celui-ci et celui de la couche-culotte, puis je passerai probablement au papier toilette, aux serviettes de table et à d'autres catégories que nous avons rationalisées pour les prix. – PumpedUpKicks91