Re: How to name a subclass of an object class?
by merlyn (Sage) on Mar 27, 2006 at 00:34 UTC
|
List IS-A Number
That's the "boggle" for me. I can't imagine how a container-class could possibly share behavior with an individual item. Are you sure it isn't "list HAS-A number"?
| [reply] |
|
|
Alright, that is counter-intuitive too, so I might as well explain.
A Number object represents a, well, number. This number is the result of a virtual die roll.
A List object represents a list of numbers (therefore Number objects indeed), or rather a series of die roll results. So yes, List HAS-A Number is true as well. But in certain circumstances, this List has to behave as if it were a Number.
For example, if I roll three dice, and then want to add 2 (the number 2) to the total result, I would need the sum of the two dice. This is when the List object should behave like a Number.
Now, a completely valid question would be: why would you want to store the result of each individual die? Why not adding them together right away?
There is an explanation for that too, you know. Imagine the same dice roll (three dice), but I only want to use the two best ones and discard the third. In this case, the List truly is a list, and not a mere number. It makes sense to store the individual results and not the total sum of the roll.
Conclusion
To answer your question: yes, list HAS-A number, but also list IS-A number (subclass).
Or do I get it wrong?
| [reply] |
|
|
If you have to explain then it doesn't make sense. This is a little like Corion's How to best pass on the context / wantarray? issue: you have to know subtle stuff beyond the immediate context to understand the code. In fact, if you don't know that stuff you may get completely the wrong idea about what the code is doing.
In this case I'd be inclined to add a member to List that calculates the total for the list. Then The code explains itself:
my $total = $list->total ();
doesn't leave much room for ambiguity.
DWIM is Perl's answer to Gödel
| [reply] [d/l] |
|
|
|
|
| [reply] |
|
|
|
|
|
|
|
|
If this were a b&d language, you'd have both Number and NumberSet implement an interface
which simply defines one method returning the "current"/"total" numeric value.
Because this is Perl, you only need to have the two
classes implement that method, without any explicitly defined interface.
Then, in any situation where you'd call that method, as long as the object is of one
class or the other, you're good to go.
And certainly, from what you've told us, the two classes don't
need to be related in the class hierarchy at all.
We're building the house of the future together.
| [reply] |
|
|
I'm not as expert as you on classes, but I wasn't thrown by List IS-A Number. What about numbers in vector spaces, which are common in physics and enginering? A unique vector space number could be represented by (4,5,6).
I'm not really a human, but I play one on earth.
flash japh
| [reply] |
Re: How to name a subclass of an object class?
by dragonchild (Archbishop) on Mar 27, 2006 at 01:30 UTC
|
From subsequent discussion, it turns out that you do want to treat "List" as a number. In this case, "List" is the wrong name. You actually want to call it "Roll". Then, a "Roll" has-a "Dieroll". The "Dieroll" is the physical rolling of the die. A Roll would have a list of Dierolls that would demonstrate what physically happened with the dice*. Then, you would use overload to allow you to treat Roll as a number.
As for the perlboot stuff, you misunderstood. You need to name it so that the casual reader of your code understands exactly what an object of this class will be used for, within the context of your program. If your code is about AD&D, I expect to see a "Roll" class. If it's called "List", I don't know what it's a list of.
*: For those confused, there are certain situations where you actually need to know which dice rolled which values. For example, certain immunities state "Reduce the value of each die rolled by 1 with a minimum of 1." This means that a 1 is still a 1, but a 2 is also a 1. But, this is only for that character. So, in the case of one person in a group having an immunity to fire and the group being subjected to a fireball, each person's damage is applied separately once the damage for the fireball is calculated. (In some rulesets, the damage for the fireball is calculated separately for each person, complicating matters further.)
My criteria for good software:
- Does it work?
- Can someone else come in, make a change, and be reasonably certain no bugs were introduced?
| [reply] |
Re: How to name a subclass of an object class?
by BrowserUk (Patriarch) on Mar 27, 2006 at 02:30 UTC
|
When you roll a pair of dice, you do not ask the die cup, or the table to total them. There seem little benefit of wrapping 2 dice in a collective object, so that you can add a method to sum their values.
my $score = sum $dice->roll;
Doesn't look like it would benefit from encapsulation to me?
Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
Lingua non convalesco, consenesco et abolesco. -- Rule 1 has a caveat! -- Who broke the cabal?
"Science is about questioning the status quo. Questioning authority".
In the absence of evidence, opinion is indistinguishable from prejudice.
| [reply] [d/l] |
Re: How to name a subclass of an object class?
by Anonymous Monk on Mar 27, 2006 at 02:37 UTC
|
I agree with all the above discussion about the List being a container of Number objects and it should have a total() or sum() method which adds up the Number objects it contains. It's really as HAS-A relationship, not an IS-A relationship. Look at the CPAN module Object::Array when implementing your List object. I'd subclass Object::Array, personally. I also agree with the suggestion that both Number and List are perhaps poorly chosen names. I'd go with "Roll" and "Die", I think. (And not "Roll::Die" or "Die::Roll" either.) | [reply] |