Jump to content

  • Log In with Google      Sign In   
  • 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.

  • You cannot reply to this topic
13 replies to this topic

#1 DarkRonin   Members   -  Reputation: 604

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 cool.png

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


Sponsor:

#2 Ashaman73   Crossbones+   -  Reputation: 6846

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.


#3 DarkRonin   Members   -  Reputation: 604

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...


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?

#4 Felix Ungman   Members   -  Reputation: 943

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


#5 DarkRonin   Members   -  Reputation: 604

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.

#6 FRex   Members   -  Reputation: 276

Like
1Likes
Like

Posted 27 May 2014 - 09:36 AM

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


#7 ApochPiQ   Moderators   -  Reputation: 14617

Like
8Likes
Like

Posted 27 May 2014 - 10:06 AM

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.



#8 frob   Moderators   -  Reputation: 19586

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 personal indie blog at bryanwagstaff.com.

#9 DarkRonin   Members   -  Reputation: 604

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.

#10 ApochPiQ   Moderators   -  Reputation: 14617

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?

#11 cozzie   Members   -  Reputation: 1538

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)

#12 Stainless   Members   -  Reputation: 765

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.


#13 ApochPiQ   Moderators   -  Reputation: 14617

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.

#14 Stainless   Members   -  Reputation: 765

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 smile.png






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.



PARTNERS