• Advertisement
Sign in to follow this  

Can you do this with a class instance?

This topic is 1335 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

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 Edited by lonewolff

Share this post


Link to post
Share on other sites
Advertisement
#define dothis() mRenderer->dothis()

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

Edited by Ashaman73

Share this post


Link to post
Share on other sites

#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?

Share this post


Link to post
Share on other sites

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.

Share this post


Link to post
Share on other sites

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.

Edited by FRex

Share this post


Link to post
Share on other sites
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.

Share this post


Link to post
Share on other sites

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.

Share this post


Link to post
Share on other sites
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?

Share this post


Link to post
Share on other sites
If it's purely because of readability, you can consider making an auto &.. based on the mRenderer object and give it a name with one character. Then it would be: r->dothis() etc, keeping the original object's name untouched and clear to understand.

Personally I would keep it like you have right now and try bundling functions that you often call in "pairs" (like some said above)

Share this post


Link to post
Share on other sites

Some of the things programmers do to "tidy up code" or "reduce typing" are an absolute nightmare.

 

Some people call it "job security measures" because no fecker in the world can understand the code when you have finished with it.

 

Hell I saw one block of code where the programmer had redefined + - * / to be complex functions. 

 

A += B              just added the two values together and stored it in A

A = A + B          created a matrix based on B, multiplied A by it converted the results to a vector normalised it and stored it in A

 

How the hell was I supposed to read the code?

 

Just don't do it unless you have a really, really good reason for it.

Edited by Stainless

Share this post


Link to post
Share on other sites

Just don't do it unless you have a really, really good reason for it.


Don't conflate obfuscation with simplification. Good simplifications make code easier to read, not harder.

Share this post


Link to post
Share on other sites

 

Just don't do it unless you have a really, really good reason for it.


Don't conflate obfuscation with simplification. Good simplifications make code easier to read, not harder.

 

And bad ones obfuscate the code smile.png

Share this post


Link to post
Share on other sites
Sign in to follow this  

  • Advertisement