7. Feedback is Critical
Understand
the Problem
(Analysis)
Broad-Brush
Design
(Architecture)
Test Driven
Development
(Implementation)
Deployable
System
13年6月6⽇日星期四
38. Walking Through Scenarios
User Submit
Payment
Save Payment
Get Payment
Parameter
Submit To
Provider
Presentation
Layer
Application
Layer
13年6月6⽇日星期四
59. CRC Card
CTenpayProviderType
Make Tenpay Trade No
Make Tenpay Settle No
Get Request Builder
CTenpayTradeNo
CTenpayProvider
CTenpayRequest
Builder
Class
Responsibility
Collaborator
13年6月6⽇日星期四
61. Make A New Type
CTenpayTradeNo
Make Tenpay Trade No
Parse Tenpay Trade No
Verify Tenpay Trade No
CTenpayProvider
Get Date From Trade No
Get Serial No From
Trade No
13年6月6⽇日星期四
62. Use The New Type
// inside NotifyPayment function
// inside GetPayment fuction
CTenpayTradeNo oTradeNo;
if (!CProviderTradeNo::TryParse(sProviderTradeNo, oTradeNo)
{
return ERR_APP_PARAM_INVALID;
}
dwRet = GetPaymentByProviderTradeNo(
oTradeNo.GetProviderPartnerNo(),
oTradeNo.GetProviderTradeSerialNo());
13年6月6⽇日星期四
63. Too Much Detail
// inside SetupPayment function
if (dwRet == ERR_PAYMENT_NOT_FOUND)
{
CPayment oPayment;
oPayment.SetPaymentId(NextPaymentId());
oPayment.SetAmount(rTrade.GetAmount());
oPayment.SetBuyerUid(rTrade.GetBuyerUid());
oPayment.SetSellerUid(rTrade.GetSellerUid());
// ... 50 lines more
oPayment.SetLastUpdateTime(CTime::Now());
dwRet = m_pDao->SavePayment(oPayment);
if (dwRet != 0)
{
// ... 10 lines of error handling
}
return dwRet;
}
13年6月6⽇日星期四
64. Code Closer To Problem
// inside SetupPayment function
if (IsPaymentNotExist(dwRet))
{
return CreatePayment();
}
else
{
return MakeSurePriceHasNotChanged();
}
13年6月6⽇日星期四