Talk About Network

Google





Programming > C - C++ Learning > Re: Total Newbi...
Latest [ Topics | Posts ] Archive Post A New Topic Post a Reply
<< Topic < Post Post 15 of 53 Topic 4060 of 4400
Post > Topic >>

Re: Total Newbie Backward Compat Question

by Bart van Ingen Schenau <bart@[EMAIL PROTECTED] > Mar 12, 2008 at 05:43 PM

Daniel T. wrote:

> Bart van Ingen Schenau <bart@[EMAIL PROTECTED]
> wrote:
>> Chris ( Val ) wrote:
> 
> Code example under consideration:
> 
> class Foo {
> public:
>    int getValue() const;
>    int setValue( int v );
>       // ensure: result == old getValue() && getValue() == v
> };
> 
>> > I think I can understand your reasons for [returning a value from
>> > a command], but that is a hack in C++, and goes against
>> > everything we learn about OOP and writing good, maintainable and
>> > safe code.
>> 
>> I am sorry, but I don't see how you come to that conclusion. I
>> would regard such a setter that returns the previous value as
>> perfectly valid OOP, if two conditions are met:
>> 1. Having the setter at all does not blatantly violate the
>> principles of OOD.
> 
> It blatantly violates the Command-Query Separation principle.

Can you give me a pointer to a resource where it is stated that this is
a fundamental principle of OOD?

And if I understand the principle correctly, a setter like
  bool setValue( int v );
would also be in violation, because it both changes the state and
returns information about the state. Even throwing an exception would
violate a strict interpretation of this principle.

> 
>> 2. This return value is not the sole means of retrieving the
>> current value.

I should have left the word 'current' out.

> 
> That's an odd condition, the method in question isn't a means of
> retrieving the current value in the first place, so of course it isn't
> the sole means of retrieving it.
> 
> However, the method *is* the sole means of retrieving that which it
> retrieves (the value of getValue() before the last time setValue() was
> called,) and it only works once. Referential transparency is broken.

It does not work only once.
You can call setValue() as often as you want and each time the call
returns the value as it was prior to that call.

Referential transparency is indeed broken, because setValue() does not
claim to be a query operation. setValue() is a command that happens to
yield a value in addition to its side-effect.
Therefor, this objection is moot.

> So, both of your conditions (after correcting the second one) are
> broken...

I don't agree they are both broken.
And it seems I did not formulate my idea precisely enough.

To me, it is acceptable to return the old value from a setter if
- having the setter at all does not violate encapsulation, and
- there is a corresponding getter for retrieving the value without
changing it.

Note that I am not advocating this kind of design, but I do see it as a
valid design decision.

> 
>> > Some setters are written to return a 'boolean' value to signal
>> > either success or failure, but even that is debatable in some
>> > cir***stances, when compared to throwing an exception.
>> 
>> If it is actually a setter, and not a function that happens to set
>> some values as part of a larger operation,...
> 
> That is getting into implementation details that the interface
> shouldn't expose...

Just about any interface exposes this kind of information, if only by
the naming of the identifiers.

Or do all of your identifiers have meaningless obfuscated names?

> 
> From the client's (user of the cl*****) point of view, there should be
> no difference between a command that "is a real setter" and a command
> that "happens to set some values".

For the person writing the client code, it will often be possible or
even easy to make the distinction, by looking at the names of the
functions and the interface do***entation.
But I agree that for the code itself it should not matter.

Bart v Ingen Schenau
-- 
a.c.l.l.c-c++ FAQ: http://www.comeaucomputing.com/learn/faq
c.l.c FAQ: http://c-faq.com/
c.l.c++ FAQ: http://www.para****ft.com/c++-faq-lite/
 




 53 Posts in Topic:
Total Newbie Backward Compat Question
Hal Vaughan <hal@[EMAI  2008-03-10 05:38:03 
Re: Total Newbie Backward Compat Question
Richard Heathfield <rj  2008-03-10 05:48:22 
Re: Total Newbie Backward Compat Question
Hal Vaughan <hal@[EMAI  2008-03-10 05:49:42 
Re: Total Newbie Backward Compat Question
Richard Heathfield <rj  2008-03-10 06:24:13 
Re: Total Newbie Backward Compat Question
Hal Vaughan <hal@[EMAI  2008-03-11 14:35:17 
Re: Total Newbie Backward Compat Question
Crazy c <chrisNchrist@  2008-03-10 04:12:17 
Re: Total Newbie Backward Compat Question
Richard Heathfield <rj  2008-03-10 12:05:13 
Re: Total Newbie Backward Compat Question
"Daniel T." <  2008-03-11 06:37:11 
Re: Total Newbie Backward Compat Question
"Chris ( Val )"  2008-03-10 06:15:26 
Re: Total Newbie Backward Compat Question
Richard Heathfield <rj  2008-03-10 14:21:14 
Re: Total Newbie Backward Compat Question
"Chris ( Val )"  2008-03-11 02:15:39 
Re: Total Newbie Backward Compat Question
Richard Heathfield <rj  2008-03-11 10:29:42 
Re: Total Newbie Backward Compat Question
Bart van Ingen Schenau &l  2008-03-11 18:58:25 
Re: Total Newbie Backward Compat Question
"Daniel T." <  2008-03-12 06:26:50 
Re: Total Newbie Backward Compat Question
Bart van Ingen Schenau &l  2008-03-12 17:43:08 
Re: Total Newbie Backward Compat Question
"Chris ( Val )"  2008-03-11 04:21:32 
Re: Total Newbie Backward Compat Question
Richard Heathfield <rj  2008-03-11 14:56:52 
Re: Total Newbie Backward Compat Question
Anand Hariharan <mailt  2008-03-11 19:31:54 
Re: Total Newbie Backward Compat Question
"Chris ( Val )"  2008-03-12 06:15:16 
Re: Total Newbie Backward Compat Question
"Chris ( Val )"  2008-03-12 06:19:55 
Re: Total Newbie Backward Compat Question
"Chris ( Val )"  2008-03-12 06:27:42 
Re: Total Newbie Backward Compat Question
"Chris ( Val )"  2008-03-12 06:54:16 
Re: Total Newbie Backward Compat Question
Bart van Ingen Schenau &l  2008-03-12 18:40:28 
Re: Total Newbie Backward Compat Question
"Chris ( Val )"  2008-03-12 07:10:18 
Re: Total Newbie Backward Compat Question
Richard Heathfield <rj  2008-03-12 14:28:48 
Re: Total Newbie Backward Compat Question
Hal Vaughan <hal@[EMAI  2008-03-13 05:43:14 
Re: Total Newbie Backward Compat Question
Richard Heathfield <rj  2008-03-13 07:11:42 
Re: Total Newbie Backward Compat Question
Jerry Coffin <jcoffin@  2008-03-14 00:25:02 
Re: Total Newbie Backward Compat Question
Hal Vaughan <hal@[EMAI  2008-03-13 03:23:30 
Re: Total Newbie Backward Compat Question
Philip Potter <pgp@[EM  2008-03-13 15:57:05 
Re: Total Newbie Backward Compat Question
"Daniel T." <  2008-03-12 11:46:58 
Re: Total Newbie Backward Compat Question
Bart van Ingen Schenau &l  2008-03-14 21:34:35 
Re: Total Newbie Backward Compat Question
"Daniel T." <  2008-03-14 22:01:32 
Re: Total Newbie Backward Compat Question
Francis Glassborow <fr  2008-03-15 10:02:29 
Re: Total Newbie Backward Compat Question
Anand Hariharan <mailt  2008-03-12 18:36:13 
Re: Total Newbie Backward Compat Question
"Daniel T." <  2008-03-13 06:52:53 
Re: Total Newbie Backward Compat Question
Anand Hariharan <mailt  2008-03-12 23:36:10 
Re: Total Newbie Backward Compat Question
Micah Cowan <micah@[EM  2008-03-14 09:40:31 
Re: Total Newbie Backward Compat Question
"Daniel T." <  2008-03-13 10:23:19 
Re: Total Newbie Backward Compat Question
Bart van Ingen Schenau &l  2008-03-14 21:45:47 
Re: Total Newbie Backward Compat Question
"Daniel T." <  2008-03-15 07:14:33 
Re: Total Newbie Backward Compat Question
Francis Glassborow <fr  2008-03-15 16:14:23 
Re: Total Newbie Backward Compat Question
"Daniel T." <  2008-03-16 09:37:37 
Re: Total Newbie Backward Compat Question
"Chris ( Val )"  2008-03-18 05:04:15 
Re: Total Newbie Backward Compat Question
"Chris ( Val )"  2008-03-18 05:40:29 
Re: Total Newbie Backward Compat Question
Richard Heathfield <rj  2008-03-18 22:54:23 
Re: Total Newbie Backward Compat Question
"Chris ( Val )"  2008-03-18 07:12:06 
Re: Total Newbie Backward Compat Question
"Chris ( Val )"  2008-03-21 05:44:42 
Re: Total Newbie Backward Compat Question
Richard Heathfield <rj  2008-03-21 13:34:56 
Re: Total Newbie Backward Compat Question
Ben Bacarisse <ben.use  2008-03-12 18:05:26 
Re: Total Newbie Backward Compat Question
"Daniel T." <  2008-03-12 20:46:50 
Re: Total Newbie Backward Compat Question
Ben Bacarisse <ben.use  2008-03-13 01:57:08 
Re: Total Newbie Backward Compat Question
Ben Bacarisse <ben.use  2008-03-13 18:54:38 

Post A Reply:
  Go here to Signup

AddThis Feed Button


About - Advertising - Contact - Frequently Asked Questions - Privacy Policy - Terms of Use - Signup

Contact
localhost-V2008-12-19 Wed Jan 7 13:13:21 PST 2009.