|
Richard MacCutchan wrote: Sorry but you are asking for a tutorial on OOP
Well, not really. I 've read already many books about OOP, even studied and done some programmes. I found out that there can be solutions and concepts which vary a lot. In the above example there could be two solutions with or without inheritance between the classes I mentioned. And both could be acceptable and good. Both? Maybe? THat's why I asked here, to get answers from more experienced members. This cannot be done in a tutorial.
Thanks for the links.
|
|
|
|
|
If you want a good insight into design, try The Gang of Four[^], it provides some very good non-language specific information. If you are serious about design, I would suggest it as a must-have.
Panic, Chaos, Destruction. My work here is done.
Drink. Get drunk. Fall over - P O'H
OK, I will win to day or my name isn't Ethel Crudacre! - DD Ethel Crudacre
I cannot live by bread alone. Bacon and ketchup are needed as well. - Trollslayer
Have a bit more patience with newbies. Of course some of them act dumb - they're often *students*, for heaven's sake - Terry Pratchett
|
|
|
|
|
nstk wrote: What I am really trying to do, is to find out why and where to use a base class
in a hypothetical (but indeed very common) design problematic of, let's say, an
ERP software.
Again...you start with the problem domain and it defines the classes.
If you don't have a problem domain then you cannot defined classes.
nstk wrote: But do we need to build a base class in our programme and if yes why?
Because the problem domain has requirements that specify that sort of implementation. Or because the problem domain lead to a specific implmentation and that implementation is best implemented that way.
|
|
|
|
|
No. I mean as candidate classes.
Begin by writing out in plain English [other languages are available] what you want to do. As an example, your system could be described thus:
Requirements: Provide software to manage the relationships between the company and it's suppliers and customers. All the contacts can be either individual people or companies. Any company will have one or more contact. Orders are recieved from customers and placed with suppliers for the provision of Widgets and associated products. Every order received will result in an invoice being raised by the accounting system. Orders placed with suppliers will be filled and invoices for payment will be sent to the accounting system. Each order [inbound or outbound] will have a billing address and a delivery address, these need not be the same. Each customer can have default addresses associated with it.
From this initial requirement, you can take out all the nouns and noun phrases. These are your candidate classes. The next stage is to decide which ones are classes in their own right and which are attributes. Often a lot of candidates can be reduced. As an exercise, I would recommend giving this a go and see where it takes you.
Panic, Chaos, Destruction. My work here is done.
Drink. Get drunk. Fall over - P O'H
OK, I will win to day or my name isn't Ethel Crudacre! - DD Ethel Crudacre
I cannot live by bread alone. Bacon and ketchup are needed as well. - Trollslayer
Have a bit more patience with newbies. Of course some of them act dumb - they're often *students*, for heaven's sake - Terry Pratchett
|
|
|
|
|
Thanks for your effort, I really appreciate this great help. I will indeed develop this as an exercise and if there is something to discuss I will write it here.
|
|
|
|
|
Here is a simple set of candidate classes:
+------------+
| Customer |
| |
+------------+
|
v
+------------+ +------------+ +------------+
| Supplier |--->| Contact |--->| Person |
| | | <Abstract> | | |
+------------+ +------------+ +------------+
|
+------+--------+
| impliments |
+------------+ +------------+
| Company | | Individual |
| | | |
+------------+ +------------+
Panic, Chaos, Destruction. My work here is done.
Drink. Get drunk. Fall over - P O'H
OK, I will win to day or my name isn't Ethel Crudacre! - DD Ethel Crudacre
I cannot live by bread alone. Bacon and ketchup are needed as well. - Trollslayer
Have a bit more patience with newbies. Of course some of them act dumb - they're often *students*, for heaven's sake - Terry Pratchett
|
|
|
|
|
Shouldn't Person inherit from Contact?
The arrow direction between them indicates the opposite situation.
|
|
|
|
|
The arrows represents a reference, so a Contact 'has a' Person.
Panic, Chaos, Destruction. My work here is done.
Drink. Get drunk. Fall over - P O'H
OK, I will win to day or my name isn't Ethel Crudacre! - DD Ethel Crudacre
I cannot live by bread alone. Bacon and ketchup are needed as well. - Trollslayer
Have a bit more patience with newbies. Of course some of them act dumb - they're often *students*, for heaven's sake - Terry Pratchett
|
|
|
|
|
Add a class called Company and then add an optional CompanyId (can be null) field to the Person class. That way you can deal with individuals and or individuals from a company.
"You get that on the big jobs."
|
|
|
|
|
I'd argue the other way around. Company is not an attribute of a person, but a person - as in a contact - is an attribute of a company.
Panic, Chaos, Destruction. My work here is done.
Drink. Get drunk. Fall over - P O'H
OK, I will win to day or my name isn't Ethel Crudacre! - DD Ethel Crudacre
I cannot live by bread alone. Bacon and ketchup are needed as well. - Trollslayer
Have a bit more patience with newbies. Of course some of them act dumb - they're often *students*, for heaven's sake - Terry Pratchett
|
|
|
|
|
Agreed: start with the largest discreet object and work back from that.
"If you think it's expensive to hire a professional to do the job, wait until you hire an amateur." Red Adair.
nils illegitimus carborundum
me, me, me
|
|
|
|
|
And all the customers who are buying products and services for their own personal use. They don't have companies so what do you do about them?
"You get that on the big jobs."
|
|
|
|
|
You missed the BIG POINT earlier. A customer is a person or a company, A company also has a person as a contact.
I almost feel an article...
Panic, Chaos, Destruction. My work here is done.
Drink. Get drunk. Fall over - P O'H
OK, I will win to day or my name isn't Ethel Crudacre! - DD Ethel Crudacre
I cannot live by bread alone. Bacon and ketchup are needed as well. - Trollslayer
Have a bit more patience with newbies. Of course some of them act dumb - they're often *students*, for heaven's sake - Terry Pratchett
|
|
|
|
|
Nagy Vilmos wrote: A customer is a person or a company, A company also has a person as a contact.
What about putting the Persons class as a nested class in the Company class in that case?
Complicated?
|
|
|
|
|
Not a good idea.
The attributes of a person - name, date of birth, sex, etc - are independent of the role they perform. A decent representation of a person will be reusable if you ignore how it is used.
Similarly, the concept of a company is independent of the problem domain. A company has employees but, and this is true in real life as much as in a program, the employee does not have a company.
Panic, Chaos, Destruction. My work here is done.
Drink. Get drunk. Fall over - P O'H
OK, I will win to day or my name isn't Ethel Crudacre! - DD Ethel Crudacre
I cannot live by bread alone. Bacon and ketchup are needed as well. - Trollslayer
Have a bit more patience with newbies. Of course some of them act dumb - they're often *students*, for heaven's sake - Terry Pratchett
|
|
|
|
|
I still missed the big point but if you do get around to writing the article, It would be interesting. I guess your talking about some kind of interface that both person and customer implement.
Anyway I've just spent the last month discovering values such as the "delivery contact name" being stored in the weather_sunny field. So I'm a bit paranoid about such things at the moment.
"You get that on the big jobs."
|
|
|
|
|
This is a long story which I will try to make as short as possible, thanks for your patience in advance
I am working on a program that has evolved from a web application to a Windows Forms client, then was ported to a WPF client and now has become a XNA client with a homemade UI. Porting the application from Windows Forms to WPF and now or own UI was possible because it was based on a (modified) MVP pattern. It was just a matter of porting the MVP framework to the new UI and then redesigning the views. The presenters or other logic remained the same.
You may have noted the (modified) above. This modification deals with the application's workflow and and controlling the application's workspace. The main workspace is nothing else than an empty window. The application can then subdivide it as needed and assign the subworkspaces eventually to presenters which display views in them. Seen from the perspective of the UI, workspaces are windows(!), panels and all kinds of layout controls.
Now, while working on my own UI, I have stumbled over a question which I already swept under the rug in the initial Windows Forms implementation and kept under the rug in the WPF implementation. Now I cannot put it off any longer, but I also sit between two chairs.
My UI has a hierarchy of controls, very similar to what you are accustomed to from Windows Forms or WPF. With our MVP being an inegral part of the UI, windows (or forms, if you like) are in the 'workspace' branch of the class hierarchy. Traditionally UIs don't have any concept of workspaces and treat windows just like any other control. This leaves me with those choices:
1) Windows are workspaces. To stay consistent with the established architecture, the correct procedure will be to open an empty window and assign it to a presenter as workspace. The presenter will then show its view inside this window. The option to open a simple dialog on the fly, like a MessageBox, will be lost.
2) Windows are controls. This will stand in opposition to the application's main workspace, which must be a window. Also, this would be absolutely against the existing architechture. Dialogs would always have to be opened like controls and would be outside the MVP.
Of course I tend to 1), but I don't like departing from the accustomed way of opening a window or dialog. Seeing a MessageBox (or any other 'common dialog') as yet another control of the view is practical at times. Simply implementing both versions looks to me like bad class design and would also introduce significant redundancy. The classes would be a few ancestors remote and with single inheritance this could not be resolved without redundancy. The redundancy may even get worse if I also take modal windows and modeless windows into account.
So what do you say? Have I overlooked something? Which path should I follow?
And from the clouds a mighty voice spoke: "Smile and be happy, for it could come worse!"
And I smiled and was happy And it came worse.
|
|
|
|
|
This solution to a real world problem just seems too easy to be foolproof, so I thought I would see if anyone can show a problem with it. Say I have the same item in two sizes, one cost $2.00, and the other $2.25. The summary tables used for reporting have only fields for the total quantity sold: 137, and the total cost: $286.50. The customer would like a monthly report/export showing quantity by price. The first approach was pulling the inforation directly from the transaction tables which contain millions of records. Though this approach provided the seperation, the performance hit made me search for a better solution. It made sense to me that only one correct combination of (x * 2.00) + (y * 2.25) could equal 286.50. So, how to get the correct combination? Examples in vbscript for simplicity/proof of concept.
totalQuantity = 137
wantedResult = 286.5
premiumPrice = 2.25
standardPrice = 2.00
for x = totalQuantity to 0 step -1
y = totalQuantity - x
if (x * premiumPrice) + (y * standardPrice) = wantedResult then exit for
next
This approach, even it the raw form, is much, much quicker than querying the transaction tables. The following revision finds the correct answer in 6 iterations. When I tested it for an extreme case of 1 million total (999,999 of standard price and 1 premium) it found the answer in 25 guesses.
totalQuantity = 137
wantedResult = 286.5
premiumPrice = 2.25
standardPrice = 2.00
success = 1
currentSplit = Int(totalQuantity / 2)
a = currentSplit
b = totalQuantity - a
counter = 0
currentresult = (a * premiumPrice) + (b * standardPrice)
counter = counter + 1
Do While currentresult <> wantedResult
if currentSplit > 1 then
currentSplit = Int(currentSplit / 2)
end if
if counter > totalQuantity then
msgbox "result not found"
success = -1
exit do
end if
If currentresult < wantedResult Then
a = a + currentSplit
Else
a = a - currentSplit
End If
counter = counter + 1
b = totalQuantity - a
currentresult = (a * premiumPrice) + (b * standardPrice)
Loop
if success = 1 then
MsgBox a & " at " & premiumPrice & " and " & b & " at " & standardPrice & " in " & counter & " guesses"
end if
The point is, this function may keep me (or the customer) from having to ask the database vendor for a change to their summary tables. I am not asking for code testing, only opinions on the soundness of the concept. As far as I know, there will only ever be two price points for this single item and the highest total quantity would likely be around 5000 for a reporting range.
"Go forth into the source" - Neal Morse
|
|
|
|
|
Why not just use a system of linear equations?
"The clue train passed his station without stopping." - John Simmons / outlaw programmer
"Real programmers just throw a bunch of 1s and 0s at the computer to see what sticks" - Pete O'Hanlon
"Not only do you continue to babble nonsense, you can't even correctly remember the nonsense you babbled just minutes ago." - Rob Graham
|
|
|
|
|
The algebra is a bit rusty...I gave up on an elegant one equation solution, and found it easier to go for a brute force attack. Thanks to your suggestion, I tried to form the equation again, realizing that it should be formed with just one variable instead of two and ended up with:
2a + 2.25(137 - a) = 286.5 resulting in:
2a + (308.25 - 2.25a) = 286.5 resulting in:
2a - 2.25a = -21.75 resulting in:
-.25a = -21.75 resulting in:
a = 87 which is correct!
Now, getting this into code:
totalQuantity = 137
totalCost = 286.50
a = 0
b = 0
standardPrice = 2.00
premiumPrice = 2.25
a = (totalCost - (premiumPrice * totalQuantity)) / (standardPrice - premiumPrice)
b = totalQuantity - a
It's a bit alarming how quickly I had given up on getting the solution correctly in favor of something way too complicated!...and looking at it now, I realize this is probably a 5th grade math problem! (hanging head)
"Go forth into the source" - Neal Morse
|
|
|
|
|
Excellent! That is the same answer I found as well.
kmoorevs wrote: I realize this is probably a 5th grade math problem!
In this day and age, in the fifth grade they do begin to introduce this type of problem. My kids were faced with the same type of problem just before junior high school. At the pace they are trying to teach kids math now, it is not of surprise seeing high school sophomores or juniors in calculus courses.
"The clue train passed his station without stopping." - John Simmons / outlaw programmer
"Real programmers just throw a bunch of 1s and 0s at the computer to see what sticks" - Pete O'Hanlon
"Not only do you continue to babble nonsense, you can't even correctly remember the nonsense you babbled just minutes ago." - Rob Graham
modified 18-Oct-11 11:48am.
|
|
|
|
|
Paul Conrad wrote: At the pace they are trying to teach kids math now, it is not of surprise seeing high school sophomores or juniors in calculus courses.
It's just too bad they don't make the kids learn what they're teaching. Looking at why my younger siblings are learning, the schools are making kids more reliant on calculators and computers and less capable of doing the problems by hand.
|
|
|
|
|
Bert Mitton wrote: the schools are making kids more reliant on calculators and computers and less capable of doing the problems by hand
That is sad. When I did teach high school math a while back, I tried to get the students to be less reliant on calculators, and it did work with a lot of the kids to regain confidence that they could solve the problems without a calculator.
In college, my Physics professor did not allow calculators at all. He wanted to see how we derived our solution, and could have cared less about punching a bunch of buttons on a calculator to come up with an answer.
"The clue train passed his station without stopping." - John Simmons / outlaw programmer
"Real programmers just throw a bunch of 1s and 0s at the computer to see what sticks" - Pete O'Hanlon
"Not only do you continue to babble nonsense, you can't even correctly remember the nonsense you babbled just minutes ago." - Rob Graham
|
|
|
|
|
kmoorevs wrote: only opinions on the soundness of the concept.
I seriously doubt that is going to work.
Price1: 2.00
Price2: 2.25
Total price: 18.00
Solution1: 9 items at price1
Solution2: 8 items at price2
Scenario 2
Total price: 36.00
Solution1: 18 items at price1
Solution2: 16 items at price2
Solution3: 9 items at price1 and 8 items at price2
kmoorevs wrote: The first approach was pulling the inforation directly from the transaction
tables which contain millions of records.
No indexes?
What about creating a daily summary table locally. Your app pulls daily in the background. You use those local data stores to build your monthly report.
|
|
|
|
|
the total number of items is also known, so there are two linear equations and two unknown values, yielding as it should zero, one or an infinite number of solutions depending on the values.
|
|
|
|