Singleton pattern in D
janderson
askme at me.com
Sat May 12 03:06:28 PDT 2007
David Ferenczi wrote:
>> Final point: just make sure you actually need singleton. I've seen a
>> lot of people using singleton for a single class, which would be more
>> efficiently handled by a static class.
>
> Can you mention some godd and bad examples?
>
In my option:
Good examples:
The singleton needs to be created/destroyed
You need to:
- create some sort of resource
- file handle
- deal with something that is not available until a certain time in
execution.
- To save memory by not always having the skeleton available and use the
RAII to make the singleton only available when necessary.
Bad example:
- You have something thats always available during the entire project
and no initialization/destruction is necessary. For instance, it would
be a bad idea to create a maths library with things like cos and sin in
it (unless you wanted to generate some sort of fancy lookup table at
run-time which requires initialization).
- Performance critical code. For things that are included in your most
inner loops, you don't want the overhead of an extra pointer lookup.
(note that inline'ing can sometimes cure this problem if used in the
local project)
Why?
Singletons add code bloat both in the interface and in use. It means
more reading, more typing, more debugging and slower compiles. Also it
means that things become harder to refactor because they are closely
coupled to a class.
Rant:
Personally I think some people use OOP to much.
I'm no expert however this is where I'm currently at with my coding ethic:
1) Use free functions when they make sense. Free functions are easy to
move around. If it's in the class its one more attribute you have to
maintain when that class is inherited from or move around. Also free
functions can be more generalized.
2) Use inheritance for polymorph only. Avoid using inheritance for code
reuse. This way the class becomes more manageable.
3) Use components class for code reuse. If the component changes it has
less effect on the interface of the owner class.
4) Use small classes that have one function as they are much more
re-useable and debugable. However, I concede that it can be much faster
to write a big class then lots of scaffolding small classes,
particularly in the short term.
5) Don't write getter/setter methods if the class simply exposes
everything anyway, use a struct instead. Getter/Setters should be used
for classes that do more then just provide access properties, its just
unnecessary code bloat that is time consuming to maintain.
6) If programming in C++ don't write extremely complex templates. They
slow slow down compilation and confuse everyone else. Do use templates
for generalization just don't go overboard and beware of code bloat
issues. If programming in D, go nuts with templates.
7) Use constant lookup tables/arrays (or datadriven tables) instead of
switch statements and if statements, where possible. These are easier
to maintain. For instance it makes it easier to register/remove new
types. It also helps keep all the information together that is meant to
be together.
8) Scaffolding = time. Scaffolding takes time to write, compile and
maintain. Try to minimize scaffolding and keep most of the code
actually doing something useful, without sacrificing readability.
9) Perfect is the enemy of good. Don't over design. Get the
fundamentals and then add as needed. Particularly if your writing code
that is application code or internal to a library (with public libraries
you don't know what your users will need).
More information about the Digitalmars-d-learn
mailing list