This is something I like and use a lot. So I adapted his code samples to C#, in case you will be interested in the syntax. And contrary to what Dave mentioned this is not specific to JavaScript, you can do the same thing with C#, though JavaScript's syntax is cleaner for solution #2.
First a code sample using a switch statment.
public static decimal GetItemPricing_V1(Customer customer, Item item) {
switch(customer.Type) {
// VIPs are awesome. Give them 50% off.
case CustomerType.VIP: return item.Price * item.Quantity * 0.50M;
// Preferred customers are no VIPs, but they still get 25% off.
case CustomerType.Preferred: return item.Price * item.Quantity * 0.75M;
// No discount for other customers.
case CustomerType.Regular:
default: return item.Price * item.Quantity;
}
}
Solution #1
public static decimal GetItemPricing_V2(Customer customer, Item item) {
var Pricing = new Dictionary() {
{ CustomerType.VIP, 0.50M },
{ CustomerType.Preferred, 0.75M },
{ CustomerType.Regular, 1M }
};
if(Pricing.ContainsKey(customer.Type))
return item.Price * item.Quantity * Pricing[customer.Type];
else
return item.Price * item.Quantity * Pricing[CustomerType.Regular];
}
Solution #2
public static decimal GetItemPricing_V3(Customer customer, Item item) {
var Pricing = new Dictionary<CustomerType, Func<Item, Decimal>>() {
{ CustomerType.VIP, delegate(Item item2) { return item.Price * item.Quantity * 0.50M; } },
{ CustomerType.Preferred, delegate(Item item2) { return item.Price * item.Quantity * 0.75M; } },
{ CustomerType.Regular, delegate(Item item2) { return item.Price * item.Quantity * 1M; } },
};
if(Pricing.ContainsKey(customer.Type))
return Pricing[customer.Type](item);
else
return Pricing[CustomerType.Regular](item);
}
Full source code
[TestClass]
public class UnitTest1
{
public enum CustomerType {
VIP,
Preferred,
Regular
}
public class Customer {
public CustomerType Type;
}
public class Item {
public decimal Quantity;
public decimal Price;
}
public static decimal GetItemPricing_V1(Customer customer, Item item) {
switch(customer.Type) {
// VIPs are awesome. Give them 50% off.
case CustomerType.VIP: return item.Price * item.Quantity * 0.50M;
// Preferred customers are no VIPs, but they still get 25% off.
case CustomerType.Preferred: return item.Price * item.Quantity * 0.75M;
// No discount for other customers.
case CustomerType.Regular:
default: return item.Price * item.Quantity;
}
}
public static decimal GetItemPricing_V2(Customer customer, Item item) {
var Pricing = new Dictionary<CustomerType, Decimal>() {
{ CustomerType.VIP, 0.50M },
{ CustomerType.Preferred, 0.75M },
{ CustomerType.Regular, 1M }
};
if(Pricing.ContainsKey(customer.Type))
return item.Price * item.Quantity * Pricing[customer.Type];
else
return item.Price * item.Quantity * Pricing[CustomerType.Regular];
}
public static decimal GetItemPricing_V3(Customer customer, Item item) {
var Pricing = new Dictionary<CustomerType, Func<Item, Decimal>>() {
{ CustomerType.VIP, delegate(Item item2) { return item.Price * item.Quantity * 0.50M; } },
{ CustomerType.Preferred, delegate(Item item2) { return item.Price * item.Quantity * 0.75M; } },
{ CustomerType.Regular, delegate(Item item2) { return item.Price * item.Quantity * 1M; } },
};
if(Pricing.ContainsKey(customer.Type))
return Pricing[customer.Type](item);
else
return Pricing[CustomerType.Regular](item);
}
Customer vipCustomer = new Customer() { Type = CustomerType.VIP };
Customer preferredCustomer = new Customer() { Type = CustomerType.Preferred };
Customer regularCustomer = new Customer() { Type = CustomerType.Regular };
Item item = new Item() { Price = 100M, Quantity = 10M };
[TestMethod]
public void GetItemPricing_V1()
{
Assert.AreEqual( 500, GetItemPricing_V1(vipCustomer, item) );
Assert.AreEqual( 750, GetItemPricing_V1(preferredCustomer, item) );
Assert.AreEqual( 1000, GetItemPricing_V1(regularCustomer, item) );
}
[TestMethod]
public void GetItemPricing_V2()
{
Assert.AreEqual( 500, GetItemPricing_V2(vipCustomer, item) );
Assert.AreEqual( 750, GetItemPricing_V2(preferredCustomer, item) );
Assert.AreEqual( 1000, GetItemPricing_V2(regularCustomer, item) );
}
[TestMethod]
public void GetItemPricing_V3()
{
Assert.AreEqual( 500, GetItemPricing_V3(vipCustomer, item) );
Assert.AreEqual( 750, GetItemPricing_V3(preferredCustomer, item) );
Assert.AreEqual( 1000, GetItemPricing_V3(regularCustomer, item) );
}
}
Nice post very helpful
ReplyDeletedbakings