Äú¿ÉÒÔ¾èÖú£¬Ö§³ÖÎÒÃǵĹ«ÒæÊÂÒµ¡£

1Ôª 10Ôª 50Ôª





ÈÏÖ¤Â룺  ÑéÖ¤Âë,¿´²»Çå³þ?Çëµã»÷Ë¢ÐÂÑéÖ¤Âë ±ØÌî



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Model Center   Code  
»áÔ±   
   
 
     
   
 ¶©ÔÄ
  ¾èÖú
ÄÃʲôÕü¾ÈÄ㣬ÎҵĴúÂë--c#±àÂë¹æ·¶ÊµÕ½Æª
 
  2595  次浏览      27
 2019-3-25
 
±à¼­ÍƼö:
±¾ÎÄÀ´×ÔÓÚcnblogs£¬±¾ÎÄͨ¹ý¼òµ¥Ò×¶®µÄ·½·¨Öع¹ÁËÒ»¶ÎÎÊÌâ´úÂ룬ËüÏÔʾÁËÈçºÎÔÚʵ¼ÊÇé¿öÖÐʹÓÃ×î¼Ñʵ¼ùºÍÉè¼ÆÄ£Ê½À´°ïÖúÎÒÃÇд³ö¸É¾»µÄ´úÂë¡£

±¾ÎÄͨ¹ýÖØ¹¹Ò»¸öÀ¬»ø´úÂ룬²ûÊöÁËÈçºÎд³öÓÅÐãµÄ´úÂë¡£¿ª·¢ÈËÔ±¼°´úÂëÉóºËÈËÔ±Ðè°´Õմ˹淶¿ª·¢ºÍÉóºË´úÂë¡£´Ë¹æ·¶ÒÔC#ΪÀý£¬JAVAµÄͯЬһ²¢²Î¿¼£¬C++µÄͯЬ×ÔÐÐÄÔ²¹°É¡£

¼ò½é

ÕâÆªÎÄÕµÄÄ¿µÄÊÇչʾÈçºÎ½«Ò»¶ÎÀ¬»ø´úÂëÖØ¹¹³ÉÒ»¸ö¸É¾»µÄ¡¢¿ÉÀ©Õ¹ÐԺͿÉά»¤µÄ´úÂë¡£ÎÒ½«½âÊÍÈçºÎͨ¹ý×î¼Ñʵ¼ùºÍ¸üºÃµÄÉè¼ÆÄ£Ê½À´¸ÄдËü¡£

ÔĶÁ±¾ÎÄÄãÐèÒªÓÐÒÔÏ»ù´¡£º

c# »ù´¡

ÒÀÀµ×¢È룬¹¤³§Ä£Ê½£¬²ßÂÔģʽ

´ËÎÄÖеÄÀý×ÓÔ´ÓÚʵ¼ÊÏîÄ¿£¬ÕâÀï²»»áÓÐʲôʹÓÃ×°ÊÎģʽ¹¹½¨µÄÅûÈø£¬Ò²²»»áʹÓòßÂÔģʽµÄ¼ÆËãÆ÷£¬ÕâЩÀý×ÓÊǷdz£ºÃµÄ˵Ã÷£¬µ«ÊÇËüÃǺÜÄѱ»ÔÚʵ¼ÊÏîÄ¿ÖÐʹÓá£

Ò»¶ÎÀ¬»ø´úÂë

ÔÚÎÒÃÇÕæÊµµÄ²úÆ·ÖÐÓÐÕâôһ¸öÀࣺ

public class Class1
{
public decimal Calculate(decimal amount, int type, int years)
{
decimal result = 0;
decimal disc = (years > 5) ? (decimal)5/100 : (decimal)years/100;
if (type == 1)
{
result = amount;
}
else if (type == 2)
{
result = (amount - (0.1m * amount)) - disc * (amount - (0.1m * amount));
}
else if (type == 3)
{
result = (0.7m * amount) - disc * (0.7m * amount);
}
else if (type == 4)
{
result = (amount - (0.5m * amount)) - disc * (amount - (0.5m * amount));
}
return result;
}
}

ÕâÊÇÒ»¶Î·Ç³£Ôã¸âµÄ´úÂ루¶þºú£ºÈç¹ûÄãû¾õµÃÕâ¶Î´úÂëºÜÔã¸â£¬ÄÇÄãĿǰ״̬¿ÉÄܺÜÔã¸âÁË£©£¬ÎÒÃDz»Ì«Çå³þÕâ¸öÀàµÄÄ¿µÄÊÇʲô¡£Ëü¿ÉÄÜÊÇÒ»¸öÍøÉÏÉ̳ǵÄÕÛ¿Û¹ÜÀíÀ࣬¸ºÔðΪ¿Í»§¼ÆËãÕÛ¿Û¡£

Õâ¸öÀàÍêÈ«¾ß±¸Á˲»¿É¶Á¡¢²»¿Éά»¤¡¢²»¿ÉÀ©Õ¹µÄÌØµã£¬ËüʹÓÃÁ˺ܶ໵µÄʵ¼ùºÍ·´Ä£Ê½µÄÉè¼Æ¡£

ÏÂÃæÎÒÃÇÖð²½·ÖÎöÕâÀïµ½µ×ÓжàÉÙÎÊÌ⣿

ÃüÃûÎÊÌâ - ÎÒÃÇÖ»ÄÜͨ¹ý²Â²âÕâ¸öÀൽµ×ÊÇΪÁ˼ÆËãʲô¡£ÕâʵÔÚÊÇÔÚÀË·Ñʱ¼ä¡£

Èç¹ûÎÒÃÇûÓÐÏà¹ØÎĵµ»òÕßÖØ¹¹Õâ¶Î´úÂ룬ÄÇÎÒÃÇÏÂÒ»´Î¿ÖÅÂÐèÒª»¨´óÁ¿µÄʱ¼ä²ÅÄÜÖªµÀÕâ¶Î´úÂëµÄ¾ßÌ庬Òå¡£

ħÊý - ÔÚÕâ¸öÀý×ÓÖУ¬ÄãÄܲµ½±äÁ¿typeÊÇÖ¸¿Í»§ÕË»§µÄ״̬Âð¡£Í¨¹ýif-elseÀ´Ñ¡Ôñ¼ÆËãÓŻݺóµÄ²úÆ·¼Û¸ñ¡£

ÏÖÔÚ£¬ÎÒÃÇѹ¸ù²»ÖªµÀÕË»§×´Ì¬1£¬2£¬3£¬4·Ö±ðÊÇʲôÒâ˼¡£

´ËÍ⣬ÄãÖªµÀ0.1£¬0.7£¬0.5¶¼ÊÇʲôÒâ˼Âð£¿

ÈÃÎÒÃÇÏëÏóһϣ¬Èç¹ûÄãÒªÐÞ¸ÄÏÂÃæÕâÐдúÂ룺

result = (amount - (0.5m * amount)) - disc * (amount - (0.5m * amount));

Òþ²ØµÄBUG - ÒòΪ´úÂë·Ç³£Ôã¸â£¬ÎÒÃÇ¿ÉÄÜ»á´í¹ý·Ç³£ÖØÒªµÄÊÂÇé¡£ÊÔÏëһϣ¬Èç¹ûÎÒÃǵÄϵͳÖÐÐÂÔöÁËÒ»ÀàÕË»§×´Ì¬£¬¶øÐµÄÕË»§µÈ¼¶²»Âú×ãÈκÎÒ»¸öif-elseÌõ¼þ¡£Õâʱ£¬·µ»ØÖµ»á¹Ì¶¨Îª0¡£

²»¿É¶Á - ÎÒÃDz»µÃ²»³ÐÈÏ£¬ÕâÊÇÒ»¶Î²»¿É¶ÁµÄ´úÂë¡£²»¿É¶Á=¸ü¶àµÄÀí½âʱ¼ä+Ôö¼Ó²úÉú´íÎóµÄ·çÏÕ

DRY ¨C ²»Òª²úÉúÖØ¸´µÄ´úÂë

ÎÒÃÇ¿ÉÄܲ»ÄÜÒ»ÑÛ¾ÍÕÒ³öËüÃÇ£¬µ«ËüÃÇȷʵ´æÔÚ¡£

ÀýÈ磺disc *(amount - (0.1m * amount));

ͬÑùµÄÂß¼­£º

disc *(amount - (0.5m * amount));

ÕâÀïÖ»ÓÐÒ»¸öÊýÖµ²»Ò»Ñù¡£Èç¹ûÎÒÃÇÎÞ·¨°ÚÍÑÖØ¸´µÄ´úÂ룬ÎÒÃÇ»áÓöµ½ºÜ¶àÎÊÌâ¡£±ÈÈçij¶Î´úÂëÔÚÎå¸öµØ·½ÓÐÖØ¸´£¬µ±ÎÒÃÇÐèÒªÐÞ¸ÄÕⲿ·ÖÂß¼­Ê±£¬ÄãºÜ¿ÉÄÜÖ»Ð޸ĵ½ÁË2ÖÁ3´¦¡£

µ¥Ò»Ö°ÔðÔ­Ôò

Õâ¸öÀàÖÁÉÙ¾ßÓÐÈý¸öÖ°Ôð£º

1 Ñ¡Ôñ¼ÆËãËã·¨

2 ¸ù¾ÝÕË»§×´Ì¬¼ÆËãÕÛ¿Û

3 ¸ù¾ÝÕË»§ÍøÁ伯ËãÕÛ¿Û

ËüÎ¥·´Á˵¥Ò»Ö°ÔðÔ­Ôò¡£Õâ»á´øÀ´Ê²Ã´·çÏÕ?Èç¹ûÎÒÃǽ«ÒªÐ޸ĵÚÈý¸ö¹¦Äܵϰ£¬»áÓ°Ïìµ½ÁíÍâµÚ¶þ¸ö¹¦ÄÜ¡£Õâ¾ÍÒâζ×Å£¬ÎÒÃÇÿ´ÎÐ޸ͼ»á¸Ä¶¯ÎÒÃDZ¾²»ÏëÐ޸ĵĴúÂë¡£Òò´Ë£¬ÎÒÃDz»µÃ²»¶ÔÕû¸öÀà½øÐвâÊÔ£¬ÕâʵÔÚºÜÀË·Ñʱ¼ä¡£

ÖØ¹¹

ͨ¹ýÒÔÏÂ9²¼£¬ÎÒ»á¸æËßÄãÃÇÈçºÎ±ÜÃâÉÏÊö·çÏÕ²¢ÊµÏÖÒ»¸ö¸É¾»µÄ¡¢¿Éά»¤µÄ¡¢¿É²âÊԵĴúÂë¡£

ÃüÃû£¬ÃüÃû£¬ÃüÃû

ÕâÊÇÁ¼ºÃ´úÂëµÄ×îÖØÒª·½ÃæÖ®Ò»¡£ÎÒÃÇÖ»ÐèÒª¸Ä±ä·½·¨£¬²ÎÊýºÍ±äÁ¿µÄÃüÃû¡£ÏÖÔÚ£¬ÎÒÃÇ¿ÉÒÔÈ·ÇеÄÖªµÀÏÂÃæµÄÀàÊǸºÔðʲôµÄÁË¡£

public decimal ApplyDiscount(decimal price, int accountStatus, int timeOfHavingAccountInYears)
{
decimal priceAfterDiscount = 0;
decimal discountForLoyaltyInPercentage = (timeOfHavingAccountInYears > 5) ? (decimal)5 / 100 : (decimal)timeOfHavingAccountInYears / 100;
if (accountStatus == 1)
{
priceAfterDiscount = price;
}
else if (accountStatus == 2)
{
priceAfterDiscount = (price - (0.1m * price)) - (discountForLoyaltyInPercentage * (price - (0.1m * price)));
}
else if (accountStatus == 3)
{
priceAfterDiscount = (0.7m * price) - (discountForLoyaltyInPercentage * (0.7m * price));
}
else if (accountStatus == 4)
{
priceAfterDiscount = (price - (0.5m * price)) - (discountForLoyaltyInPercentage * (price - (0.5m * price)));
}

return priceAfterDiscount;
}

µ«ÊÇÎÒÃÇÈÎÈ»²»ÖªµÀÕË»§×´Ì¬1£¬2£¬3µ½µ×ÊÇʲôÒâ˼¡£

ħÊý

ÔÚC#ÖбÜÃâħÊýÎÒÃÇÒ»°ã²ÉÓÃö¾ÙÀ´Ìæ»»ËüÃÇ¡£ÕâÀïʹÓÃAccountStatus ö¾ÙÀ´Ìæ»»if-elseÖеÄħÊý¡£

public enum AccountStatus { NotRegistered = 1, SimpleCustomer = 2, ValuableCustomer = 3, MostValuableCustomer = 4 }

ÏÖÔÚÎÒÃÇÀ´¿´¿´Öع¹ºóµÄÀ࣬ÎÒÃÇ¿ÉÒÔºÜÈÝÒ×µÄ˵³öÄÄÒ»¸öÕË»§×´Ì¬Ó¦¸ÃÓÃʲôËã·¨À´¼ÆËãÕÛ¿Û¡£»ìºÏÕË»§×´Ì¬µÄ·çÏÕѸËÙµÄϽµÁË¡£

public class DiscountManager
{
public decimal ApplyDiscount(decimal price, AccountStatus accountStatus, int timeOfHavingAccountInYears)
{
decimal priceAfterDiscount = 0;
decimal discountForLoyaltyInPercentage = (timeOfHavingAccountInYears > 5) ? (decimal)5 / 100 : (decimal)timeOfHavingAccountInYears / 100;

if (accountStatus == AccountStatus.NotRegistered)
{
priceAfterDiscount = price;
}
else if (accountStatus == AccountStatus.SimpleCustomer)
{
priceAfterDiscount = (price - (0.1m * price)) - (discountForLoyaltyInPercentage * (price - (0.1m * price)));
}
else if (accountStatus == AccountStatus.ValuableCustomer)
{
priceAfterDiscount = (0.7m * price) - (discountForLoyaltyInPercentage * (0.7m * price));
}
else if (accountStatus == AccountStatus.MostValuableCustomer)
{
priceAfterDiscount = (price - (0.5m * price)) - (discountForLoyaltyInPercentage * (price - (0.5m * price)));
}
return priceAfterDiscount;
}
}

¸ü¶àµÄ´úÂë¿É¶ÁÐÔ

ÔÚÕâÒ»²½ÖУ¬ÎÒÃÇʹÓÃswitch-case À´Ìæ»» if-else ifÀ´ÔöÇ¿´úÂë¿É¶ÁÐÔ¡£

ͬʱ£¬ÎÒ»¹½«Ä³Ð©³¤¶ÈºÜ³¤µÄÓï¾ä²Å·Ö³ÉÁ½ÐС£±ÈÈ磺**priceAfterDiscount = (price - (0.5m * price)) - (discountForLoyaltyInPercentage * (price - (0.5m * price)));**

±»ÐÞ¸ÄΪ£º

**priceAfterDiscount = (price - (0.5m * price));priceAfterDiscount = priceAfterDiscount - (discountForLoyaltyInPercentage * priceAfterDiscount);**

ÒÔÏÂÊÇÍêÕûµÄÐ޸ģº

public class DiscountManager
{
public decimal ApplyDiscount(decimal price, AccountStatus accountStatus, int timeOfHavingAccountInYears)
{
decimal priceAfterDiscount = 0;
decimal discountForLoyaltyInPercentage = (timeOfHavingAccountInYears > 5) ? (decimal)5 / 100 : (decimal)timeOfHavingAccountInYears / 100;
switch (accountStatus)
{
case AccountStatus.NotRegistered:
priceAfterDiscount = price;
break;
case AccountStatus.SimpleCustomer:
priceAfterDiscount = (price - (0.1m * price));
priceAfterDiscount = priceAfterDiscount - (discountForLoyaltyInPercentage * priceAfterDiscount);
break;
case AccountStatus.ValuableCustomer:
priceAfterDiscount = (0.7m * price);
priceAfterDiscount = priceAfterDiscount - (discountForLoyaltyInPercentage * priceAfterDiscount);
break;
case AccountStatus.MostValuableCustomer:
priceAfterDiscount = (price - (0.5m * price));
priceAfterDiscount = priceAfterDiscount - (discountForLoyaltyInPercentage * priceAfterDiscount);
break;
}
return priceAfterDiscount;
}
}

Ïû³ýÒþ²ØµÄBUG

ÕýÈçÎÒÃÇ֮ǰÌáµ½µÄ£¬ÎÒÃǵÄApplyDiscount·½·¨¿ÉÄܽ«ÎªÐµĿͻ§×´Ì¬·µ»Ø0¡£

ÎÒÃÇÔõÑù²ÅÄܽâ¾öÕâ¸öÎÊÌ⣿´ð°¸¾ÍÊÇÅ׳öNotImplementedException¡£

µ±ÎÒÃǵķ½·¨»ñÈ¡ÕË»§×´Ì¬×÷ΪÊäÈë²ÎÊý£¬µ«ÊDzÎÊýÖµ¿ÉÄܰüº¬ÎÒÃÇδÉè¼Æµ½µÄδ֪Çé¿ö¡£Õâʱ£¬ÎÒÃDz»ÄÜʲôҲ²»×ö£¬Å׳öÒì³£ÊÇÕâʱºò×îºÃµÄ×ö·¨¡£

public decimal ApplyDiscount(decimal price, AccountStatus accountStatus, int timeOfHavingAccountInYears)
{
decimal priceAfterDiscount = 0;
decimal discountForLoyaltyInPercentage = (timeOfHavingAccountInYears > 5) ? (decimal)5 / 100 : (decimal)timeOfHavingAccountInYears / 100;
switch (accountStatus)
{
case AccountStatus.NotRegistered:
priceAfterDiscount = price;
break;
case AccountStatus.SimpleCustomer:
priceAfterDiscount = (price - (0.1m * price));
priceAfterDiscount = priceAfterDiscount - (discountForLoyaltyInPercentage * priceAfterDiscount);
break;
case AccountStatus.ValuableCustomer:
priceAfterDiscount = (0.7m * price);
priceAfterDiscount = priceAfterDiscount - (discountForLoyaltyInPercentage * priceAfterDiscount);
break;
case AccountStatus.MostValuableCustomer:
priceAfterDiscount = (price - (0.5m * price));
priceAfterDiscount = priceAfterDiscount - (discountForLoyaltyInPercentage * priceAfterDiscount);
break;
default:
throw new NotImplementedException();
}
return priceAfterDiscount;
}

·ÖÎöËã·¨

ÔÚÕâ¸öÀý×ÓÖУ¬ÎÒÃÇͨ¹ýÁ½¸ö±ê×¼À´¼ÆËã¿Í»§ÕÛ¿Û£º

ÕË»§×´Ì¬

ÕË»§ÍøÁä

ͨ¹ýÍøÁ伯ËãµÄËã·¨¶¼ÀàËÆÕâÑù£º

(discountForLoyaltyInPercentage * priceAfterDiscount)

µ«ÊǶÔÓÚÕË»§×´Ì¬ÎªValuableCustomerµÄË㷨ȴÊÇ£º

0.7m * price

ÎÒÃǰÑËüÐÞ¸Ä³ÉºÍÆäËûÕË»§×´Ì¬Ò»ÑùµÄËã·¨£º

price - (0.3m * price)

public class DiscountManager
{
public decimal ApplyDiscount(decimal price, AccountStatus accountStatus, int timeOfHavingAccountInYears)
{
decimal priceAfterDiscount = 0;
decimal discountForLoyaltyInPercentage = (timeOfHavingAccountInYears > 5) ? (decimal)5 / 100 : (decimal)timeOfHavingAccountInYears / 100;
switch (accountStatus)
{
case AccountStatus.NotRegistered:
priceAfterDiscount = price;
break;
case AccountStatus.SimpleCustomer:
priceAfterDiscount = (price - (0.1m * price));
priceAfterDiscount = priceAfterDiscount - (discountForLoyaltyInPercentage * priceAfterDiscount);
break;
case AccountStatus.ValuableCustomer:
priceAfterDiscount = (price - (0.3m * price));
priceAfterDiscount = priceAfterDiscount - (discountForLoyaltyInPercentage * priceAfterDiscount);
break;
case AccountStatus.MostValuableCustomer:
priceAfterDiscount = (price - (0.5m * price));
priceAfterDiscount = priceAfterDiscount - (discountForLoyaltyInPercentage * priceAfterDiscount);
break;
default:
throw new NotImplementedException();
}
return priceAfterDiscount;
}
}

Ïû³ýħÊýµÄÁíÒ»ÖÖ·½·¨

ʹÓþ²Ì¬³£Á¿À´Ì滻ħÊý¡£0.1m,0.2m,0.3m,ÎÒm£¬ÎÒÃDz¢²»ÖªµÀËüÃÇÊÇʲôÒâ˼¡£

´ËÍâdecimal discountForLoyaltyInPercentage = (timeOfHavingAccountInYears > 5) ? (decimal)5/100 : (decimal)timeOfHavingAccountInYears/100;ÖУ¬Êý×Ö5Ò²·Ç³£ÉñÃØ¡£

ÎÒÃDZØÐëÈÃËüÃǸü¾ßÓÐÃèÊöÐÔ£¬ÕâʱʹÓó£Á¿»áÊÇÒ»¸ö±È½ÏºÃµÄ°ì·¨¡£

ÎÒÃÇÀ´¶¨ÒåÒ»¸ö¾²Ì¬Àࣺ

public static class Constants
{
public const int MAXIMUM_DISCOUNT_FOR_LOYALTY = 5;
public const decimal DISCOUNT_FOR_SIMPLE_CUSTOMERS = 0.1m;
public const decimal DISCOUNT_FOR_VALUABLE_CUSTOMERS = 0.3m;
public const decimal DISCOUNT_FOR_MOST_VALUABLE_CUSTOMERS = 0.5m;
}

½Ó×ÅÐÞ¸ÄDiscountManagerÀࣺ

public class DiscountManager
{
public decimal ApplyDiscount(decimal price, AccountStatus accountStatus, int timeOfHavingAccountInYears)
{
decimal priceAfterDiscount = 0;
decimal discountForLoyaltyInPercentage = (timeOfHavingAccountInYears > Constants.MAXIMUM_DISCOUNT_FOR_LOYALTY) ? (decimal)Constants.MAXIMUM_DISCOUNT_FOR_LOYALTY / 100 : (decimal)timeOfHavingAccountInYears / 100;
switch (accountStatus)
{
case AccountStatus.NotRegistered:
priceAfterDiscount = price;
break;
case AccountStatus.SimpleCustomer:
priceAfterDiscount = (price - (Constants.DISCOUNT_FOR_SIMPLE_CUSTOMERS * price));
priceAfterDiscount = priceAfterDiscount - (discountForLoyaltyInPercentage * priceAfterDiscount);
break;
case AccountStatus.ValuableCustomer:
priceAfterDiscount = (price - (Constants.DISCOUNT_FOR_VALUABLE_CUSTOMERS * price));
priceAfterDiscount = priceAfterDiscount - (discountForLoyaltyInPercentage * priceAfterDiscount);
break;
case AccountStatus.MostValuableCustomer:
priceAfterDiscount = (price - (Constants.DISCOUNT_FOR_MOST_VALUABLE_CUSTOMERS * price));
priceAfterDiscount = priceAfterDiscount - (discountForLoyaltyInPercentage * priceAfterDiscount);
break;
default:
throw new NotImplementedException();
}
return priceAfterDiscount;
}
}

Ïû³ýÖØ¸´µÄ´úÂë

ΪÁËÏû³ýÖØ¸´µÄ´úÂ룬ÕâÀォ²¿·ÖËã·¨ÌáÈ¡³öÀ´¡£Ê×ÏÈ£¬ÎÒÃǽ¨Á¢Á½¸öÀ©Õ¹·½·¨£º

public static class PriceExtensions
{
public static decimal ApplyDiscountForAccountStatus(this decimal price, decimal discountSize)
{
return price - (discountSize * price);
}

public static decimal ApplyDiscountForTimeOfHavingAccount(this decimal price, int timeOfHavingAccountInYears)
{
decimal discountForLoyaltyInPercentage = (timeOfHavingAccountInYears > Constants.MAXIMUM_DISCOUNT_FOR_LOYALTY) ? (decimal)Constants.MAXIMUM_DISCOUNT_FOR_LOYALTY / 100 : (decimal)timeOfHavingAccountInYears / 100;
return price - (discountForLoyaltyInPercentage * price);
}
}

ͨ¹ý·½·¨Ãû³Æ£¬ÎÒÃǾͿÉÒÔÖªµÀËüµÄÖ°ÔðÊÇʲô£¬ÏÖÔÚÐÞ¸ÄÎÒÃǵÄÀý×Ó£º

public class DiscountManager
{
public decimal ApplyDiscount(decimal price, AccountStatus
accountStatus, int timeOfHavingAccountInYears)
{
decimal priceAfterDiscount = 0;
switch (accountStatus)
{
case AccountStatus.NotRegistered:
priceAfterDiscount = price;
break;
case AccountStatus.SimpleCustomer:
priceAfterDiscount = price.ApplyDiscountForAccountStatus
(Constants.DISCOUNT_FOR_SIMPLE_CUSTOMERS)
.ApplyDiscountForTimeOfHavingAccount
(timeOfHavingAccountInYears);
break;
case AccountStatus.ValuableCustomer:
priceAfterDiscount = price.ApplyDiscountForAccountStatus
(Constants.DISCOUNT_FOR_VALUABLE_CUSTOMERS)
.ApplyDiscountForTimeOfHavingAccount
(timeOfHavingAccountInYears);
break;
case AccountStatus.MostValuableCustomer:
priceAfterDiscount = price.ApplyDiscountForAccountStatus
(Constants.DISCOUNT_FOR_MOST_VALUABLE_CUSTOMERS)
.ApplyDiscountForTimeOfHavingAccount
(timeOfHavingAccountInYears);
break;
default:
throw new NotImplementedException();
}
return priceAfterDiscount;
}
}

ɾ³ýûÓõĴúÂë

ÎÒÃÇÓ¦¸Ãд³ö¼ò¶ÌµÄ´úÂ룬ÒòΪ¼ò¶ÌµÄ´úÂë=¼õÉÙBUG·¢ÉúµÄ»úÂÊ£¬²¢ÇÒÒ²ÈÃÎÒÃÇËõ¶ÌÀí½âÒµÎñÂß¼­µÄʱ¼ä¡£

ÎÒÃÇ·¢ÏÖ£¬ÕâÀïÈýÖÖ״̬µÄ¿Í»§µ÷ÓÃÁËÏàͬµÄ·½·¨£º

.ApplyDiscountForTimeOfHavingAccount
(timeOfHavingAccountInYears);

ÕâÀï¿ÉÒԺϲ¢´úÂ룺

public class DiscountManager
{
public decimal ApplyDiscount(decimal price, AccountStatus
accountStatus, int timeOfHavingAccountInYears)
{
decimal priceAfterDiscount = 0;
switch (accountStatus)
{
case AccountStatus.NotRegistered:
priceAfterDiscount = price;
break;
case AccountStatus.SimpleCustomer:
priceAfterDiscount = price.ApplyDiscountForAccountStatus
(Constants.DISCOUNT_FOR_SIMPLE_CUSTOMERS);
break;
case AccountStatus.ValuableCustomer:
priceAfterDiscount = price.ApplyDiscountForAccountStatus
(Constants.DISCOUNT_FOR_VALUABLE_CUSTOMERS);
break;
case AccountStatus.MostValuableCustomer:
priceAfterDiscount = price.ApplyDiscountForAccountStatus
(Constants.DISCOUNT_FOR_MOST_VALUABLE_CUSTOMERS);
break;
default:
throw new NotImplementedException();
}
priceAfterDiscount = priceAfterDiscount.ApplyDiscountForTimeOfHavingAccount
(timeOfHavingAccountInYears);
return priceAfterDiscount;
}
}

9.×îºó£¬µÃµ½¸É¾»µÄ´úÂë

×îºó£¬ÈÃÎÒÃÇͨ¹ýÒýÈëÒÀÀµ×¢ÈëºÍ¹¤³§·½·¨Ä£Ê½À´µÃµ½×îÖյİ汾°É¡£

ÏÈÀ´¿´¿¨×îÖÕ½á¹û£º

public class DiscountManager
{
private readonly IAccountDiscountCalculatorFactory
_factory;
private readonly ILoyaltyDiscountCalculator
_loyaltyDiscountCalculator;

public DiscountManager(IAccountDiscountCalculatorFactory
factory, ILoyaltyDiscountCalculator
loyaltyDiscountCalculator)
{
_factory = factory;
_loyaltyDiscountCalculator = loyaltyDiscountCalculator;
}

public decimal ApplyDiscount(decimal price,
AccountStatus accountStatus, int timeOfHavingAccountInYears)
{
decimal priceAfterDiscount = 0;
priceAfterDiscount = _factory.
GetAccountDiscountCalculator(accountStatus)
.ApplyDiscount(price);
priceAfterDiscount = _loyaltyDiscountCalculator.ApplyDiscount
(priceAfterDiscount, timeOfHavingAccountInYears);
return priceAfterDiscount;
}
}

public interface ILoyaltyDiscountCalculator
{
decimal ApplyDiscount(decimal price,
int timeOfHavingAccountInYears);
}

public class DefaultLoyaltyDiscountCalculator
: ILoyaltyDiscountCalculator
{
public decimal ApplyDiscount(decimal price, int timeOfHavingAccountInYears)
{
decimal discountForLoyaltyInPercentage =
(timeOfHavingAccountInYears
> Constants.MAXIMUM_DISCOUNT_FOR_LOYALTY) ? (decimal)Constants.MAXIMUM_DISCOUNT_FOR_LOYALTY / 100 : (decimal)timeOfHavingAccountInYears / 100;
return price - (discountForLoyaltyInPercentage * price);
}
}

public interface IAccountDiscountCalculatorFactory
{
IAccountDiscountCalculator GetAccountDiscountCalculator
(AccountStatus accountStatus);
}

public class DefaultAccountDiscountCalculatorFactory : IAccountDiscountCalculatorFactory
{
public IAccountDiscountCalculator GetAccountDiscountCalculator(AccountStatus
accountStatus)
{
IAccountDiscountCalculator calculator;
switch (accountStatus)
{
case AccountStatus.NotRegistered:
calculator = new NotRegisteredDiscountCalculator();
break;
case AccountStatus.SimpleCustomer:
calculator = new SimpleCustomerDiscountCalculator();
break;
case AccountStatus.ValuableCustomer:
calculator = new ValuableCustomerDiscountCalculator();
break;
case AccountStatus.MostValuableCustomer:
calculator = new
MostValuableCustomerDiscountCalculator();
break;
default:
throw new NotImplementedException();
}

return calculator;
}
}

public interface IAccountDiscountCalculator
{
decimal ApplyDiscount(decimal price);
}

public class NotRegisteredDiscountCalculator
: IAccountDiscountCalculator
{
public decimal ApplyDiscount(decimal price)
{
return price;
}
}

public class SimpleCustomerDiscountCalculator
: IAccountDiscountCalculator
{
public decimal ApplyDiscount(decimal price)
{
return price - (Constants
.DISCOUNT_FOR_SIMPLE_CUSTOMERS
* price);
}
}

public class ValuableCustomerDiscountCalculator : IAccountDiscountCalculator
{
public decimal ApplyDiscount(decimal price)
{
return price - (Constants
.DISCOUNT_FOR_VALUABLE_CUSTOMERS
* price);
}
}

public class MostValuableCustomerDiscountCalculator : IAccountDiscountCalculator
{
public decimal ApplyDiscount(decimal price)
{
return price - (Constants.DISCOUNT_FOR_MOST_VALUABLE_CUSTOMERS
* price);
}
}

Ê×ÏÈ£¬ÎÒÃǰÚÍÑÁËÀ©Õ¹·½·¨£¨¾²Ì¬Àࣩ£¬Èç¹ûÎÒÃÇÏë¶ÔApplyDiscount·½·¨½øÐе¥Ôª²âÊÔÊDZȽÏÀ§Äѵģ¬·Ï³ýÎÒÃǶÔPriceExtensionsÀ©Õ¹ÀàÒ²½øÐвâÊÔ¡£

ΪÁ˱ÜÃâÕâ¸öÎÊÌ⣬ÎÒÃÇ´´½¨ÁËDefaultLoyaltyDiscountCalculator ÀàÀ´Ìæ»»ApplyDiscountForTimeOfHavingAccountÕâ¸öÀ©Õ¹·½·¨£¬´ËÀ໹ʵÏÖÁËILoyaltyDiscountCalculator½Ó¿Ú¡£ÏÖÔÚ£¬µ±ÎÒÃÇÒª²âÊÔDiscountManagerÀàʱ£¬ÎÒÃÇÖ»¹¹Ô캯Êý×¢ÈëILoyaltyDiscountCalculator½Ó¿ÚµÄʵÏÖ¼´¿É¡£ÕâÀïʹÓÃÁËÒÀÀµ×¢Èë¡£

ͨ¹ýÕâÑù×ö£¬ÎÒÃǽ«ÍøÁäÕÛ¿ÛµÄËã·¨Ç¨ÒÆµ½ÀàËÆDefaultLoyaltyDiscountCalculator µÄ²»Í¬ÀàÖУ¬ÕâÑùµ±ÎÒÃÇÐÞ¸Äijһ¸öËã·¨²»»á¸²¸Çµ½ÆäËûÒµÎñ¡£

¶ÔÓÚ¸ù¾ÝÕË»§×´Ì¬À´¼ÆËãÕÛ¿ÛµÄÒµÎñ£¬ÎÒÃÇÐèÒªÔÚDiscountManagerÖÐɾ³ýÁ½¸öÖ°Ôð£º

¸ù¾ÝÕË»§×´Ì¬Ñ¡Ôñ¼ÆËãµÄËã·¨

ʵÏÖ¼ÆËãËã·¨

ÕâÀïÎÒÃÇͨ¹ýDefaultAccountDiscountCalculatorFactory¹¤³§ÀàÀ´½â¾öÕâ¸öÎÊÌ⣬DefaultAccountDiscountCalculatorFactory¹¤³§ÀàʵÏÖÁËIAccountDiscountCalculatorFactory½Ó¿Ú¡£

ÎÒÃǵŤ³§½«¾ö¶¨Ñ¡ÔñÄÄÒ»¸öÕÛ¿ÛËã·¨¡£½Ó×Å£¬¹¤³§À౻ͨ¹ý¹¹Ô캯Êý×¢Èëµ½DiscountManagerÀàÖС£

ÏÂÃæÎÒÖ»ÐèÒªÔÚDiscountManager ÖÐʹÓù¤³§£º

priceAfterDiscount = _factory.GetAccountDiscountCalculator
(accountStatus).ApplyDiscount(price);

ÒÔÉÏ£¬ÎÒÃǽâ¾öÁ˵ÚÒ»¸öÎÊÌ⣬ÏÂÃæÎÒÃÇÐèҪʵÏÖ¼ÆËãËã·¨¡£¸ù¾ÝÕË»§×´Ì¬£¬Ìṩ²»Í¬µÄËã·¨£¬ÕâÕýºÃ·ûºÏ²ßÂÔģʽ¡£ÎÒÃÇÐèÒª¹¹½¨Èý¸ö²ßÂÔ£ºNotRegisteredDiscountCalculator£¬SimpleCustomerDiscountCalculator£¬MostValuableCustomerDiscountCalculatorÒѾ­³éÏó³öÀ´µÄ½Ó¿ÚIAccountDiscountCalculator¡£

ºÃÁË£¬ÏÖÔÚÎÒÃÇÓпÉÒ»¶Î¸É¾»¿É¶ÁµÄ´úÂëÁË£¬Õâ¶Î´úÂëÖÐËùÓеÄÀà¶¼Ö»ÓÐÒ»¸öÖ°Ôð£º

DiscountManager - ¹ÜÀí

DefaultLoyaltyDiscountCalculator - ÍøÁ伯ËãÕÛ¿Û

DefaultAccountDiscountCalculatorFactory - ¸ù¾ÝÕË»§×´Ì¬Ñ¡ÔñÕÛ¿Û²ßÂÔ

NotRegisteredDiscountCalculator,
SimpleCustomerDiscountCalculator,
MostValuableCustomerDiscountCalculator-¼ÆËãÕÛ¿ÛËã·¨

ÎÒÃÇÀ´±È½ÏÒ»ÏÂÐÞ¸ÄǰºóµÄ´úÂ룺

public class Class1
{
public decimal Calculate(decimal amount, int type, int years)
{
decimal result = 0;
decimal disc = (years > 5) ? (decimal)5 / 100 : (decimal)years / 100;
if (type == 1)
{
result = amount;
}
else if (type == 2)
{
result = (amount - (0.1m * amount)) - disc * (amount - (0.1m * amount));
}
else if (type == 3)
{
result = (0.7m * amount) - disc * (0.7m * amount);
}
else if (type == 4)
{
result = (amount - (0.5m * amount)) - disc * (amount - (0.5m * amount));
}
return result;
}
}

Ð޸ĺó£º

public class DiscountManager
{
private readonly IAccountDiscountCalculatorFactory
_factory;
private readonly ILoyaltyDiscountCalculator
_loyaltyDiscountCalculator;

public DiscountManager(IAccountDiscountCalculatorFactory
factory, ILoyaltyDiscountCalculator loyaltyDiscountCalculator)
{
_factory = factory;
_loyaltyDiscountCalculator = loyaltyDiscountCalculator;
}

public decimal ApplyDiscount(decimal price,
AccountStatus accountStatus,
int timeOfHavingAccountInYears)
{
decimal priceAfterDiscount = 0;
priceAfterDiscount = _factory.
GetAccountDiscountCalculator(accountStatus)
.ApplyDiscount(price);
priceAfterDiscount = _loyaltyDiscountCalculator.ApplyDiscount
(priceAfterDiscount, timeOfHavingAccountInYears);
return priceAfterDiscount;
}
}

×ܽá

±¾ÎÄͨ¹ý¼òµ¥Ò×¶®µÄ·½·¨Öع¹ÁËÒ»¶ÎÎÊÌâ´úÂ룬ËüÏÔʾÁËÈçºÎÔÚʵ¼ÊÇé¿öÖÐʹÓÃ×î¼Ñʵ¼ùºÍÉè¼ÆÄ£Ê½À´°ïÖúÎÒÃÇд³ö¸É¾»µÄ´úÂë¡£

¾ÍÎҵŤ×÷¾­ÑéÀ´Ëµ£¬±¾ÎÄÖгöÏֵIJ»Á¼×ö·¨ÊǾ­³£·¢ÉúµÄ¡£±àдÕâÖÖ´úÂëµÄÈË×ÜÊÇÈÏΪËûÃÇÄܹ»±£³ÖÕâÖÖ¹æÔò£¬µ«²»ÐÒµÄÊÇϵͳºÍÒµÎñÍùÍù¶¼»áÔ½À´Ô½¸´ÔÓ£¬Ã¿´ÎÐÞ¸ÄÕâÀà´úÂëʱ¶¼»á´øÀ´¾Þ´óµÄ·çÏÕ¡£

   
2595 ´Îä¯ÀÀ       27
Ïà¹ØÎÄÕÂ

Éî¶È½âÎö£ºÇåÀíÀôúÂë
ÈçºÎ±àд³öÓµ±§±ä»¯µÄ´úÂë
ÖØ¹¹-ʹ´úÂë¸ü¼ò½àÓÅÃÀ
ÍŶÓÏîÄ¿¿ª·¢"±àÂë¹æ·¶"ϵÁÐÎÄÕÂ
Ïà¹ØÎĵµ

ÖØ¹¹-¸ÄÉÆ¼ÈÓдúÂëµÄÉè¼Æ
Èí¼þÖØ¹¹v2
´úÂëÕû½àÖ®µÀ
¸ßÖÊÁ¿±à³Ì¹æ·¶
Ïà¹Ø¿Î³Ì

»ùÓÚHTML5¿Í»§¶Ë¡¢Web¶ËµÄÓ¦Óÿª·¢
HTML 5+CSS ¿ª·¢
ǶÈëʽC¸ßÖÊÁ¿±à³Ì
C++¸ß¼¶±à³Ì