• Create Account

## Can you do this with a class instance?

Old topic!

Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.

13 replies to this topic

### #1DarkRonin  Members

1077
Like
0Likes
Like

Posted 27 May 2014 - 02:05 AM

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

Edited by lonewolff, 27 May 2014 - 02:09 AM.

Win32 Developer
One Of Them - Martial arts game that is mid development.

### #2Ashaman73  Members

13649
Like
0Likes
Like

Posted 27 May 2014 - 02:12 AM

#define dothis() mRenderer->dothis()

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

Edited by Ashaman73, 27 May 2014 - 02:13 AM.

Ashaman

### #3DarkRonin  Members

1077
Like
0Likes
Like

Posted 27 May 2014 - 02:19 AM


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

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?
Win32 Developer
One Of Them - Martial arts game that is mid development.

### #4Felix Ungman  Members

1545
Like
0Likes
Like

Posted 27 May 2014 - 02:34 AM

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

### #5DarkRonin  Members

1077
Like
0Likes
Like

Posted 27 May 2014 - 03:12 AM

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.
Win32 Developer
One Of Them - Martial arts game that is mid development.

### #6FRex  Members

1621
Like
1Likes
Like

Posted 27 May 2014 - 09:36 AM

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, 27 May 2014 - 09:41 AM.

An in-game LuaConsole for SFML: https://github.com/FRex/LuaConsole

### #7ApochPiQ  Moderators

21387
Like
8Likes
Like

Posted 27 May 2014 - 10:06 AM

POPULAR

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

### #8frob  Moderators

41244
Like
0Likes
Like

Posted 27 May 2014 - 09:38 PM

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.

Check out my book, Game Development with Unity, aimed at beginners who want to build fun games fast.

Also check out my personal website at bryanwagstaff.com, where I occasionally write about assorted stuff.

### #9DarkRonin  Members

1077
Like
0Likes
Like

Posted 27 May 2014 - 11:58 PM

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.
Win32 Developer
One Of Them - Martial arts game that is mid development.

### #10ApochPiQ  Moderators

21387
Like
0Likes
Like

Posted 28 May 2014 - 12:00 AM

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

### #11cozzie  Members

4623
Like
0Likes
Like

Posted 28 May 2014 - 11:55 AM

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)

Crealysm game & engine development: http://www.crealysm.com

Looking for a passionate, disciplined and structured producer? PM me

### #12Stainless  Members

1875
Like
0Likes
Like

Posted 28 May 2014 - 01:35 PM

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, 28 May 2014 - 01:39 PM.

### #13ApochPiQ  Moderators

21387
Like
1Likes
Like

Posted 28 May 2014 - 03:16 PM

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.
Wielder of the Sacred Wands

### #14Stainless  Members

1875
Like
0Likes
Like

Posted 29 May 2014 - 01:36 AM

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

Old topic!

Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.