Can you do this with a class instance?

Started by
12 comments, last by Stainless 9 years, 10 months ago
Hi guys,

I have created a renderer framework with an instance called mRenderer.

I have a huge amount of calls to mRenderer in my application. For example;


mRenderer->dothis();
mRenderer->dothat();
mRenderer->etc();

Is there any way to have the application 'assume' that mRenderer is constantly going to be called and just have this instead? Something similar to namespaces?


dothis();
dothat();
etc();

Any suggestions would be awesome cool.png
Advertisement

#define dothis() mRenderer->dothis()

Is this a good idea ? Hmmm, I'm not a big fan of meta-languages...



#define dothis() mRenderer->dothis()
Is this a good idea ? Hmmm, I'm not a big fan of meta-languages...


Thanks for the reply.

I can see how this could get tedious setting up defines for every function.

I guess using that method you would also have to setup macro's for anything that requires a parameter, right?

You could take a look at http://en.wikipedia.org/wiki/Fluent_interface

Instead of returning void the methods would return Renderer* (or possibly Renderer&) and you can chain calls like this:


mRenderer->dothis()
    ->dothat()
    ->etc();

openwar - the real-time tactical war-game platform

You could take a look at http://en.wikipedia.org/wiki/Fluent_interface

Instead of returning void the methods would return Renderer* (or possibly Renderer&) and you can chain calls like this:




mRenderer->dothis()
    ->dothat()
    ->etc();

That is an interesting concept. I have never seen that done before.

Although, a lot of my call return values for either error codes or calculations.

Paradoxically the thread title involves part of the 'answer'.

Yes, you can (sort of) do that with a class instance.

This is available in a few languages as a built in feature and is called 'With statement' : http://www.freepascal.org/docs-html/ref/refsu58.html

In C++ you can use a quite genius but very nasty trick that you can wrap in a macro:

http://stackoverflow.com/questions/2279180/does-c-have-with-keyword-like-pascal

That'll most likely confuse many programmers who never seen that in Pascal (or in any language with 'with' keyword).

It also doesn't let you use any local variables, unlike real with.

If you have such sequences, it's generally a sign that you can factor your code better. For example, if you do this a lot:

someObject->Foo();
someObject->Bar();
someObject->Baz();
someObject->Quux();

You should probably refactor. Consider something like this at a minimum:

void SomeClass::DoSequence () {
    Foo();
    Bar();
    Baz();
    Quux();
}

If you need a lot of parameters and error checking, intermediate objects can be useful. In general, though, this is a sign that your classes are doing too much and need to be cleaned up.

Wielder of the Sacred Wands
[Work - ArenaNet] [Epoch Language] [Scribblings]

As ApochPiQ points out, trying to use an object many times in a row to accomplish a task is a code smell.

It can be a symptom of several problems. It can be a symptom that your code is written for micromanagement; you wrote tiny tasks rather than big tasks. His solution is to consolidate the work into bigger tasks.

In addition to micromanagement smells, it could be a symptom of a god class, of a SRP violation, feature envy, trivial modules, primitive obsession, or several other problems.

Each of those problems has its own set of different solutions.

Or, it might just happen that you need to do a series of operations on an object as a matter of course, which is no problem at all. In that case, you just use the object and manipulate it as you need. If retyping the name bothers you, rename the variable to something shorter. The compiler doesn't care what it is named; the object's address will be loaded to a register and reused each time without any penalty or anything.

Or, it might just happen that you need to do a series of operations on an object as a matter of course, which is no problem at all. In that case, you just use the object and manipulate it as you need. If retyping the name bothers you, rename the variable to something shorter. The compiler doesn't care what it is named; the object's address will be loaded to a register and reused each time without any penalty or anything.


It is more a case of the above I think.

For example my renderer has separate functions for position, rotate, scale, and a lot more.

I could do this all in one call but then on the other hand it would be silly to set all paramters if I only wanted to reposition x & y.
This is what I'd consider a great opportunity for reorganization. As a possible suggestion, what if you had a simple SetTransform() on your renderer that takes a standard 4x4 matrix, and then a library of free functions for composing transformation matrices from various components?

Wielder of the Sacred Wands
[Work - ArenaNet] [Epoch Language] [Scribblings]

This topic is closed to new replies.

Advertisement