points to
a repository with C# code, so I cannot comment on
the Smalltalk.
There is,
however, a striking thing about the C# code, qua
C#, that is
worth
mentioning.
It is not
encapsulated.
Let's
start with the most obvious one.
A bank
account has a password, and you are
supposed
to provide the right password in order
to get
information from it.
Your
interface *reveals* the password, so
malicious
code can do
var
pass = theBankAccount.password;
and then
provide the password back. What's
needed is
something like
var
balance = theBankAccount.queryBalance(pass);
where
passwords go *in* to theBankAccount but never ever
ever come
*out*.
Another
thing is that a BankAccount belongs to a specific
Customer.
There's a good way and a bad way to manage this.
The bad
way is for the caller to create a new account that
belongs to
nobody, and then *tell* the Customer "here is a
new
account". With this interface, you could tell any
number of
Customers that they own the account. That's
possible
in the real world, but in the challenge, it isn't.
The good
way is to *ask* the Customer "please create a new
account
and tell me what it is", and have no way to force
a Customer
to accept an account willy nilly. That way a
Customer
can be certain that the accounts it is holding
belong to
it and it alone.
Or it
could be were it not for a major encapsulation
issue.
The idea
of encapsulation is that
EVERY
CHANGE TO AN OBJECT'S STATE MUST BE MADE BY THAT
OBJECT
including
the start of owned containers.
In Java,
for example, you might have
public
class Customer {
private final ArrayList<Account> accounts =
new ArrayList<Account>();
...
public List<Account> getAccounts() {
return Collections.unmodifiableList(accounts);
}
...
public Account newAccount(...details...) {
final Account a = new Account(...details...');
accounts.add(a);
return a;
}
...
}
If you are
going to provide access to a collection,
(1) make
the collection immutable in the first place, or
(2) return
an immutable view of it, or
(3) best
of all, DON'T provide access to the collection
but
provide queries that extract just the information
you
want to
make available.
This has
nothing to do with Java or Smalltalk or C# as
such;
encapsulation
is object-oriented-programming 102.
For what
it's worth, I used to be a University lecturer,
and
it was
MUCH harder for students to grasp encapsulation
than
to grasp
recursion. I have no idea why. Just pretend that
you
are a nice
little object surrounded by malevolent pranksters
who can
force you to do anything in your interface, and
make
sure they
cannot harm you.
Oh, when I
asked about the source of the challenge, what I
was
getting at
was "is this your paraphrase of the challenge, in
which case
please tell us to find the original, or is this
the actual
unmodified original text, in which case --ing
h---,
you have
my profound sympathy."
This looks
like a garbled version of an exercise that I did
a little
over 10 years ago, which I found in a Java-based
book
whose
details I unfortunately forgot to record. Right
down to
the names
of the classes! That is why I am pretty sure that
there is a
description of the problem somewhere that makes
sense.