$include_dir="/home/hyper-archives/boost/include"; include("$include_dir/msg-header.inc") ?>
From: Mattias Flodin (flodin_at_[hidden])
Date: 2001-11-15 14:44:46
On Thu, 15 Nov 2001, Peter Dimov wrote:
> > I'd say there are more psychological reasons than this. I like to be able
> > to express intent with source code rather than comments, when possible.
>
> What is the advantage of using C++ instead of a natural language to express
> intent? I can easily cite several drawbacks.
I wouldn't say "instead of" - documentation in a natural language is still
a must (in a separate document), but I like when I can express intent such
as what we're discussing without comments in the source file. Why? Because
a source file is more limited in terms of space. By sparing me the need to
point out details like "A is a singleton", "it is an iterator", or
"member_ is a class member variable", there is more room left to write
other, less regular but useful pieces of information about the code at
hand. I think too much commentation text in a piece of code makes it
harder to follow the actual statements, or get a grasp of what the
function / code block as a whole is doing.
> Is this a library interface? If it is, why do you need the class name at
> all? You know that there is a single instance of A.
>
> Instead of
>
> class A: public /* public? */ singleton<A>
> {
> void f();
> };
>
> A::instance().f();
>
> why not simply
>
> namespace A
> {
> void f();
> }
>
> f();
For one thing there is a difference here in that A does not need to
implement f(), it can be a pure virtual function - whereas in your
namespace version f() is bound by the ODR to be the only possible
implementation.
A inherits publically because that is how to describe isa relationships;
singleton<A> is the class implementing the instance() function.
> > Furthermore there is a big difference between just a global variable and a
> > singleton, in that the singleton may defer instantiation to the user, and
> > thus provide a form of polymorphism.
>
> So can a global scoped_ptr<A>.
Yes, but that would not be enough to prevent A from being created multiple
times. You could assign a new instance to the scoped pointer in the middle
of execution.
> MyApp looks like a global to me.
Well it may be in a nameless namespace (giving it the lifetime of a global
while still not polluting the global namespace). My point here though was
that when just using a global the library cannot do simply do "extern
Application app;" and then let the client define it as "MyApp app;".
> My general point is, provide something simple that solves 85% of the
> problems rather than something complex that solves 89% of the problems.
I totally agree with this - it's been on my mind as well. I trust
that not all of Gennadiy's policies / requirements will be needed. But I
saw them as a good starting point - perhaps we can afford a little more
than is necessary in the beginning, and then let empirical results judge
what can be stripped. Because personally, I do not feel that I have enough
experience to judge what others will find useful or not. Neverhteless,
having a template argument for each of those orthogonal 'axes' that he
presented would probably produce a too complex class I agree.
/Mattias
-- Mattias Flodin <flodin_at_[hidden]> "A good thing about C++ is that only Room D418 friends can access your private parts" Department of Computing Science Umeå University S-901 87 Umeå, Sweden Note: Any opinions expressed in this mail are personal, and do not necessarily reflect an official standpoint of Umeå University.