Growing Object-Oriented SystemPrinciples, Guidelines, and MethodsKent WangDec 6, 201213年6月6⽇日星期四
Agenda• Introduction• Understand The Problem• Broad-Brush Design• Implementation• Recommended Readings13年6月6⽇日星期四
Introduction13年6月6⽇日星期四
Why This Talk13年6月6⽇日星期四
13年6月6⽇日星期四
Software DevelopingIs a Learning Process13年6月6⽇日星期四
Feedback is CriticalUnderstandthe Problem(Analysis)Broad-BrushDesign(Architecture)Test DrivenDevelopment(Implementation)De...
Understand the Problem13年6月6⽇日星期四
Understand The Problem• User Story• Use Case• Conceptual Model• Color Modeling13年6月6⽇日星期四
User StoryUsers could pay for their orders fromvarious platform via tenpay13年6月6⽇日星期四
Use CaseUserPay13年6月6⽇日星期四
Use Case Is ValuableBut Not The End13年6月6⽇日星期四
Digging A Conceptual Model13年6月6⽇日星期四
Dig Conceptual ModelPaymentPartnerUserPaymentTypeBuyerSellerPartnerTrade13年6月6⽇日星期四
Color ModelingMoment-IntervalRoleDescriptionParty /Place /Thing13年6月6⽇日星期四
User Story ChangedUsers could pay for their orders fromvarious platform via tenpay or alipay13年6月6⽇日星期四
Simple SolutionPaymentPartnerUserPaymentTypeBuyerSellerPartnerTrade13年6月6⽇日星期四
The Missing ConceptPaymentPartnerUserPaymentTypeBuyerSellerPartnerTradeProviderPaymentPaymentProvider13年6月6⽇日星期四
Models Are Not Right Or WrongThey Are More Or Less Useful13年6月6⽇日星期四
One Team, One Language13年6月6⽇日星期四
Bounded ContextPaymentPartnerPaymentTypeProviderPaymentPaymentProvider13年6月6⽇日星期四
Context MapProviderPaymentTransactionunipay tenpayTransaction Map13年6月6⽇日星期四
Get Help If Required13年6月6⽇日星期四
Broad-Brush Design13年6月6⽇日星期四
Broad-Brush Design• Tackling Complexity• Architectural Level• Application Level• Domain Model Level13年6月6⽇日星期四
Tackling Complexity13年6月6⽇日星期四
Separation of Concerns13年6月6⽇日星期四
Layered ArchitectureApplicationPresentationData Source13年6月6⽇日星期四
Layered ArchitectureApplicationPresentationData SourceDomain13年6月6⽇日星期四
High Level of Abstraction13年6月6⽇日星期四
High Level of Abstraction13年6月6⽇日星期四
Architectural Level13年6月6⽇日星期四
Infrastructure• Distributed or Not• Synchronous or Asynchronous• Data Source13年6月6⽇日星期四
Architectural StyleTransactionScriptTable ModuleDomain ModelComplexityTool-Chain13年6月6⽇日星期四
Location of Domain LogicDAOAODomainvs.13年6月6⽇日星期四
Concurrent Control• Transaction is not Silver Bullet• Optimistic or Pessimistic• Offline or Not13年6月6⽇日星期四
Application Level13年6月6⽇日星期四
Walking Through ScenariosUser SubmitPaymentSave PaymentGet PaymentParameterSubmit ToProviderPresentationLayerApplicationLa...
Intension-Revealing InterfaceCUnipayAOGetPaymentParameterCUnipayAOProcessTradevs.13年6月6⽇日星期四
Do One ThingCUnipayAOGetPaymentParameterSave or updatePaymentsAssemble PaymentParameters13年6月6⽇日星期四
Command Query SeparationSystem CommandQueryState AStateB13年6月6⽇日星期四
Command Query SeparationCUnipayAOGetPaymentParameterSetupPaymentSave or updatePaymentsAssemble PaymentParameters13年6月6⽇日星期四
ModulePaymentPayment ProviderPartnerNotification HistorySecuritySettlement13年6月6⽇日星期四
Domain Model Level13年6月6⽇日星期四
Simplify AssociationsPaymentPartnerUserPaymentTypeBuyerSellerPartnerTradeProviderPaymentPaymentProvider13年6月6⽇日星期四
Simplify AssociationsPaymentPartnerPaymentTypePartnerTradeProviderPaymentPaymentProvider13年6月6⽇日星期四
Simplify AssociationsPaymentPartnerPaymentTypeProviderPaymentPaymentProvider1..*13年6月6⽇日星期四
Simplify AssociationsPaymentPartnerPaymentTypeProviderPaymentPaymentProvider1current13年6月6⽇日星期四
Design Is Not Just ATechnical Issue13年6月6⽇日星期四
Integrity ProblemChargePlanChargePlanLineItemChargePlanLineItemamount = 50 amount = 50amount = 100ChargePlanLineItemamount...
AggregateChargePlanChargePlanLineItemChargePlanLineItemamount = 50 amount = 50amount = 100ChargePlanLineItemamount = 5013年...
Domain Model Pollutionao_unipay_settlePaymentRelay Serviceao_unipayTransaction13年6月6⽇日星期四
Anti-Corruption Layerao_unipay_settle nao_unipay_tenpayTenpay ServicePaymentRelay Serviceao_unipayTransaction13年6月6⽇日星期四
Design To TestTenpay ServiceFacadeMock TenpayRelay ClientTenpay ServiceFacade Test1. RegisterChargePlan(plan)3. Execute(re...
Implementation13年6月6⽇日星期四
Implementation• Design Tools• Make A New Type• Consistent Abstraction Level• Open Close Principle• Extract Hidden Concept1...
Costly Tools Don’t ProduceBetter Designs13年6月6⽇日星期四
UML Without CASE13年6月6⽇日星期四
CRC CardCTenpayProviderTypeMake Tenpay Trade NoMake Tenpay Settle NoGet Request BuilderCTenpayTradeNoCTenpayProviderCTenpa...
Duplicated Code// inside NotifyPayment function// inside GetPayment fuctionif (sProviderTradeNo.length() != 28){return ERR...
Make A New TypeCTenpayTradeNoMake Tenpay Trade NoParse Tenpay Trade NoVerify Tenpay Trade NoCTenpayProviderGet Date From T...
Use The New Type// inside NotifyPayment function// inside GetPayment fuctionCTenpayTradeNo oTradeNo;if (!CProviderTradeNo:...
Too Much Detail// inside SetupPayment functionif (dwRet == ERR_PAYMENT_NOT_FOUND){CPayment oPayment;oPayment.SetPaymentId(...
Code Closer To Problem// inside SetupPayment functionif (IsPaymentNotExist(dwRet)){return CreatePayment();}else{return Mak...
Keep ConsistentAbstraction Level13年6月6⽇日星期四
Feature Envy// inside GetPaymentParameter function...if (rProvider.GetType() == TENPAY){BuildBasicParameter(rPayment);if (...
Power Of ValuesIPaymentRequestBuilderBuild Payment RequestGetPaymentUrlCopyPaymentParametersCProviderTypeCProviderCTenpayS...
The Clean Way// inside GetPaymentParameter function...IPaymentRequestBuilder* pBuilder = rSpec.GetPaymentMethod().NewPayme...
Open for ExtensionClose for Modification13年6月6⽇日星期四
Extract Hidden Concept// inside NotifyPayment function...if (rPayment.GetCurrentProviderPaymentId() ==rProviderPayment.Get...
Extract Hidden ConceptPayment ProviderPaymentIPaymentAcceptingPolicy*13年6月6⽇日星期四
Extract Hidden Concept// inside NotifyPayment functionIPaymentAcceptingPolicy* paymentAcceptingPolicy;...if (paymentAccept...
Making Implicit ConceptExplicit13年6月6⽇日星期四
Recommended Readings13年6月6⽇日星期四
13年6月6⽇日星期四
13年6月6⽇日星期四
Q & A13年6月6⽇日星期四
Thanks for your time13年6月6⽇日星期四
Upcoming SlideShare
Loading in...5
×

Growing object oriented system

223

Published on

Published in: Technology
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
223
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
7
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

Growing object oriented system

  1. 1. Growing Object-Oriented SystemPrinciples, Guidelines, and MethodsKent WangDec 6, 201213年6月6⽇日星期四
  2. 2. Agenda• Introduction• Understand The Problem• Broad-Brush Design• Implementation• Recommended Readings13年6月6⽇日星期四
  3. 3. Introduction13年6月6⽇日星期四
  4. 4. Why This Talk13年6月6⽇日星期四
  5. 5. 13年6月6⽇日星期四
  6. 6. Software DevelopingIs a Learning Process13年6月6⽇日星期四
  7. 7. Feedback is CriticalUnderstandthe Problem(Analysis)Broad-BrushDesign(Architecture)Test DrivenDevelopment(Implementation)DeployableSystem13年6月6⽇日星期四
  8. 8. Understand the Problem13年6月6⽇日星期四
  9. 9. Understand The Problem• User Story• Use Case• Conceptual Model• Color Modeling13年6月6⽇日星期四
  10. 10. User StoryUsers could pay for their orders fromvarious platform via tenpay13年6月6⽇日星期四
  11. 11. Use CaseUserPay13年6月6⽇日星期四
  12. 12. Use Case Is ValuableBut Not The End13年6月6⽇日星期四
  13. 13. Digging A Conceptual Model13年6月6⽇日星期四
  14. 14. Dig Conceptual ModelPaymentPartnerUserPaymentTypeBuyerSellerPartnerTrade13年6月6⽇日星期四
  15. 15. Color ModelingMoment-IntervalRoleDescriptionParty /Place /Thing13年6月6⽇日星期四
  16. 16. User Story ChangedUsers could pay for their orders fromvarious platform via tenpay or alipay13年6月6⽇日星期四
  17. 17. Simple SolutionPaymentPartnerUserPaymentTypeBuyerSellerPartnerTrade13年6月6⽇日星期四
  18. 18. The Missing ConceptPaymentPartnerUserPaymentTypeBuyerSellerPartnerTradeProviderPaymentPaymentProvider13年6月6⽇日星期四
  19. 19. Models Are Not Right Or WrongThey Are More Or Less Useful13年6月6⽇日星期四
  20. 20. One Team, One Language13年6月6⽇日星期四
  21. 21. Bounded ContextPaymentPartnerPaymentTypeProviderPaymentPaymentProvider13年6月6⽇日星期四
  22. 22. Context MapProviderPaymentTransactionunipay tenpayTransaction Map13年6月6⽇日星期四
  23. 23. Get Help If Required13年6月6⽇日星期四
  24. 24. Broad-Brush Design13年6月6⽇日星期四
  25. 25. Broad-Brush Design• Tackling Complexity• Architectural Level• Application Level• Domain Model Level13年6月6⽇日星期四
  26. 26. Tackling Complexity13年6月6⽇日星期四
  27. 27. Separation of Concerns13年6月6⽇日星期四
  28. 28. Layered ArchitectureApplicationPresentationData Source13年6月6⽇日星期四
  29. 29. Layered ArchitectureApplicationPresentationData SourceDomain13年6月6⽇日星期四
  30. 30. High Level of Abstraction13年6月6⽇日星期四
  31. 31. High Level of Abstraction13年6月6⽇日星期四
  32. 32. Architectural Level13年6月6⽇日星期四
  33. 33. Infrastructure• Distributed or Not• Synchronous or Asynchronous• Data Source13年6月6⽇日星期四
  34. 34. Architectural StyleTransactionScriptTable ModuleDomain ModelComplexityTool-Chain13年6月6⽇日星期四
  35. 35. Location of Domain LogicDAOAODomainvs.13年6月6⽇日星期四
  36. 36. Concurrent Control• Transaction is not Silver Bullet• Optimistic or Pessimistic• Offline or Not13年6月6⽇日星期四
  37. 37. Application Level13年6月6⽇日星期四
  38. 38. Walking Through ScenariosUser SubmitPaymentSave PaymentGet PaymentParameterSubmit ToProviderPresentationLayerApplicationLayer13年6月6⽇日星期四
  39. 39. Intension-Revealing InterfaceCUnipayAOGetPaymentParameterCUnipayAOProcessTradevs.13年6月6⽇日星期四
  40. 40. Do One ThingCUnipayAOGetPaymentParameterSave or updatePaymentsAssemble PaymentParameters13年6月6⽇日星期四
  41. 41. Command Query SeparationSystem CommandQueryState AStateB13年6月6⽇日星期四
  42. 42. Command Query SeparationCUnipayAOGetPaymentParameterSetupPaymentSave or updatePaymentsAssemble PaymentParameters13年6月6⽇日星期四
  43. 43. ModulePaymentPayment ProviderPartnerNotification HistorySecuritySettlement13年6月6⽇日星期四
  44. 44. Domain Model Level13年6月6⽇日星期四
  45. 45. Simplify AssociationsPaymentPartnerUserPaymentTypeBuyerSellerPartnerTradeProviderPaymentPaymentProvider13年6月6⽇日星期四
  46. 46. Simplify AssociationsPaymentPartnerPaymentTypePartnerTradeProviderPaymentPaymentProvider13年6月6⽇日星期四
  47. 47. Simplify AssociationsPaymentPartnerPaymentTypeProviderPaymentPaymentProvider1..*13年6月6⽇日星期四
  48. 48. Simplify AssociationsPaymentPartnerPaymentTypeProviderPaymentPaymentProvider1current13年6月6⽇日星期四
  49. 49. Design Is Not Just ATechnical Issue13年6月6⽇日星期四
  50. 50. Integrity ProblemChargePlanChargePlanLineItemChargePlanLineItemamount = 50 amount = 50amount = 100ChargePlanLineItemamount = 5013年6月6⽇日星期四
  51. 51. AggregateChargePlanChargePlanLineItemChargePlanLineItemamount = 50 amount = 50amount = 100ChargePlanLineItemamount = 5013年6月6⽇日星期四
  52. 52. Domain Model Pollutionao_unipay_settlePaymentRelay Serviceao_unipayTransaction13年6月6⽇日星期四
  53. 53. Anti-Corruption Layerao_unipay_settle nao_unipay_tenpayTenpay ServicePaymentRelay Serviceao_unipayTransaction13年6月6⽇日星期四
  54. 54. Design To TestTenpay ServiceFacadeMock TenpayRelay ClientTenpay ServiceFacade Test1. RegisterChargePlan(plan)3. Execute(request, response)4. Checking Request5. ReturnResponse6. Return Response7. ParseResponse2. Assemble Request8. Return Result9. Checking Result13年6月6⽇日星期四
  55. 55. Implementation13年6月6⽇日星期四
  56. 56. Implementation• Design Tools• Make A New Type• Consistent Abstraction Level• Open Close Principle• Extract Hidden Concept13年6月6⽇日星期四
  57. 57. Costly Tools Don’t ProduceBetter Designs13年6月6⽇日星期四
  58. 58. UML Without CASE13年6月6⽇日星期四
  59. 59. CRC CardCTenpayProviderTypeMake Tenpay Trade NoMake Tenpay Settle NoGet Request BuilderCTenpayTradeNoCTenpayProviderCTenpayRequestBuilderClassResponsibilityCollaborator13年6月6⽇日星期四
  60. 60. Duplicated Code// inside NotifyPayment function// inside GetPayment fuctionif (sProviderTradeNo.length() != 28){return ERR_APP_PARAM_INVALID;}uint64_t ddwProviderPartnerNo =lexical_cast<uint64_t>(sProviderTradeNo.substr(0, 10))uint64_t ddwSerialNo =lexical_cast<uint64_t>(sProviderTradeNo.substr(18));dwRet = GetPaymentByProviderTradeNo(ddwProviderPartnerNo, ddwSerialNo);13年6月6⽇日星期四
  61. 61. Make A New TypeCTenpayTradeNoMake Tenpay Trade NoParse Tenpay Trade NoVerify Tenpay Trade NoCTenpayProviderGet Date From Trade NoGet Serial No FromTrade No13年6月6⽇日星期四
  62. 62. Use The New Type// inside NotifyPayment function// inside GetPayment fuctionCTenpayTradeNo oTradeNo;if (!CProviderTradeNo::TryParse(sProviderTradeNo, oTradeNo){return ERR_APP_PARAM_INVALID;}dwRet = GetPaymentByProviderTradeNo(oTradeNo.GetProviderPartnerNo(),oTradeNo.GetProviderTradeSerialNo());13年6月6⽇日星期四
  63. 63. Too Much Detail// inside SetupPayment functionif (dwRet == ERR_PAYMENT_NOT_FOUND){CPayment oPayment;oPayment.SetPaymentId(NextPaymentId());oPayment.SetAmount(rTrade.GetAmount());oPayment.SetBuyerUid(rTrade.GetBuyerUid());oPayment.SetSellerUid(rTrade.GetSellerUid());// ... 50 lines moreoPayment.SetLastUpdateTime(CTime::Now());dwRet = m_pDao->SavePayment(oPayment);if (dwRet != 0){// ... 10 lines of error handling}return dwRet;}13年6月6⽇日星期四
  64. 64. Code Closer To Problem// inside SetupPayment functionif (IsPaymentNotExist(dwRet)){return CreatePayment();}else{return MakeSurePriceHasNotChanged();}13年6月6⽇日星期四
  65. 65. Keep ConsistentAbstraction Level13年6月6⽇日星期四
  66. 66. Feature Envy// inside GetPaymentParameter function...if (rProvider.GetType() == TENPAY){BuildBasicParameter(rPayment);if (rSpec.GetPaymentMethod() == STANDARD){BuildParameterOfTenpayStandardPayment(rPayment);}else if (rSpec.GetPaymentMethod() == BANK){BuildParameterOfTenpayBankPayment(rPayment);}}...13年6月6⽇日星期四
  67. 67. Power Of ValuesIPaymentRequestBuilderBuild Payment RequestGetPaymentUrlCopyPaymentParametersCProviderTypeCProviderCTenpayStandardPaymentRequestBuilderBuild Payment RequestGetPaymentUrlCopyPaymentParametersCTenpayProviderTypeCTenpayBankPaymentRequestBuilderBuild Payment RequestGetPaymentUrlCopyPaymentParametersCTenpayProviderType13年6月6⽇日星期四
  68. 68. The Clean Way// inside GetPaymentParameter function...IPaymentRequestBuilder* pBuilder = rSpec.GetPaymentMethod().NewPaymentRequestBuilder(rProvider);pBuilder->Build(rPayment);...13年6月6⽇日星期四
  69. 69. Open for ExtensionClose for Modification13年6月6⽇日星期四
  70. 70. Extract Hidden Concept// inside NotifyPayment function...if (rPayment.GetCurrentProviderPaymentId() ==rProviderPayment.GetProviderPaymentId() &&rPayment.IsWaitPay()){rPayment.Accept(rProviderPayment);}...13年6月6⽇日星期四
  71. 71. Extract Hidden ConceptPayment ProviderPaymentIPaymentAcceptingPolicy*13年6月6⽇日星期四
  72. 72. Extract Hidden Concept// inside NotifyPayment functionIPaymentAcceptingPolicy* paymentAcceptingPolicy;...if (paymentAcceptingPolicy->IsAllowedToAccept(rPayment, rProviderPayment)){rPayment.Accept(rProviderPayment);}...13年6月6⽇日星期四
  73. 73. Making Implicit ConceptExplicit13年6月6⽇日星期四
  74. 74. Recommended Readings13年6月6⽇日星期四
  75. 75. 13年6月6⽇日星期四
  76. 76. 13年6月6⽇日星期四
  77. 77. Q & A13年6月6⽇日星期四
  78. 78. Thanks for your time13年6月6⽇日星期四
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×