thats pretty much it. I am a big fan of oop and am working on a project
that is not. It now takes me so much longer to do anything and it has a
huge impact on the code base and its consumers.
I have one method like this:
CreateCashout(clerkId
as integer, officeId as integer, cashTotal as double, creditCardTotal
as double, debitTotal as double, PaymentIds() as integer)
This is then validated and passed to the same method signature in the data layer.
So
for one I have a long method signature. Some of these items will be
zero (i.e. debit totals for some consumers) so why make them put it in
at all.
Also I would like to see what payments were cash, credit
card, and debit but right now I just know all the payments by the
paymentId array.
I would create an object like this:
1 Public Class Cashout
2
3 Private mClerkId As Integer
4 Private mOfficeId As Integer
5 Private mCashTotal As Double
6 Private mCreditCardTotal As Double
7 Private mDebitTotal As Double
8
9 Private mCashPaymentIds() As Integer
10 Private mCreditCardPaymentIds() As Integer
11 Private mDebitPaymentIds() As Integer
12
13 'properties for accessing ClerkId, OfficeId, CashTotal, CreditCardTotal, and DebitTotal
14
15 Public ReadOnly Property PaymentIds() As Integer()
16 Get
17 'just an example. I have not tested this
18 Dim allIds(mCashPaymentIds.Length + mCreditCardPaymentIds.Length + mDebitPaymentIds.Length) As Integer
19 mCashPaymentIds.CopyTo(allIds, 0)
20 mCreditCardPaymentIds.CopyTo(allIds, mCashPaymentIds.Length)
21 mDebitPaymentIds.CopyTo(allIds, mCashPaymentIds.Length + mCreditCardPaymentIds.Length)
22 Return allIds
23 End Get
24 End Property
25
26 Public Sub New(ByVal clerkId As Integer, ByVal officeId As Integer, ByVal cashTotal As Double, ByVal creditCardTotal As Double, ByVal debitTotal As Double)
27 Me.ClerkId = clerkId
28 Me.OfficeId = officeId
29 Me.CashTotal = cashTotal
30 Me.CreditCardTotal = creditCardTotal
31 Me.DebitTotal = debitTotal
32 End Sub
33
34 Public Sub New(ByVal clerkId As Integer, ByVal officeId As Integer)
35 Me.ClerkId = clerkId
36 Me.OfficeId = officeId
37 End Sub
38 End Class
And the implementation for just creating a cash cashout would now look like this:
1 Dim cashout As New Cashout(clerkId, officeId)
2 cashout.cashTotal = 30.00
3 cashout.CashPaymentIds = cashPaymentIds
4 CreateCashout(cashout)
Notice how I now enforced that at least the clerkId and OfficeId are mandatory by having it in both New constructors.
Also
note that in the new constructor that I assign the parameters to
properties and not to the fields. i.e. I assigne cashTotals to
me.CashTotals instead of mCashTotals
The reason for this is that
there is now a central point to validate all data if need by. i.e. lets
say that CashTotals can not be negative we would put the check in the
property and be done with it. If we directly assigned it to mCashoutId
in the new constructor we would have to check once in the new
constructor and once in the property as there are now two ways to set
the value of mCashTotals.