Computer Chess Club Archives


Search

Terms

Messages

Subject: Re: Is there an overhead in this OO design ?

Author: Tony Werten

Date: 02:10:44 01/06/06

Go up one level in this thread


On January 06, 2006 at 03:37:17, Gerd Isenberg wrote:

>On January 05, 2006 at 18:33:58, Alexander Kure wrote:
>
>>On January 05, 2006 at 13:04:29, Mathieu Pagé wrote:
>>
>>>Hi, I want to push OO to it's limit in order to get cleaner code. Here is what I
>>>want to do :
>>>
>>>
>>>class CSquare
>>>   {
>>>   private:
>>>      unsigned int m_uiSquareIndex;
>>>   public :
>>>      // the next 3 functions allow CSquare to be used as an unsigned int in
>>>      // arithmetic operations.
>>>      inline CSquare(unsigned int);
>>>      inline CSquare operator=(unsigned int);
>>>      inline operator unsigned int();
>>>
>>>      // The next 2 functions are why i'd like to use OOP to make the
>>>manipulation
>>>      // of squares clearer.
>>>      unsigned int GetColumn()
>>>      {
>>>         return m_uiSquareIndex % 8;
>>>      };
>>>
>>>      unsigned int GetRow()
>>>      {
>>>         return m_uiSquareIndex / 8;
>>>      };
>>>   };
>>>
>>>
>>>This way I can use CSquare like this :
>>>
>>>
>>>CSquare csq(A1)
>>>csq += 8; // One row higher. csq is now equat to A2.
>>>csq.GetRow(); // Will return 1 (0 based index)
>>>csq.GetColumn(); // will return 0
>>>
>>>
>>>
>>>I think that with basic compiler optimisations like inlining this code will
>>>bring no overhead in my engine. I already asked some friends about it and they
>>>seem to think like me, but are not sure.
>>>
>>>Since it's CC related and there is some good programmers monitoring this board I
>>>though I would ask here.
>>>
>>>What is your opinion about this?
>>>
>>>Mathieu Pagé
>>
>>
>>Hi Mathieu,
>>
>>Following are a few suggestions:
>>
>>1) You should declare the following functions const:
>>
>>   operator unsigned int() const;
>>   unsigned int GetColumn() const;
>>   unsigned int GetRow() const;
>>
>>2) An additional constructor would be convenient:
>>
>>   CSquare(unsigned int file, unsigned int row);
>>
>>Then you would need another conversion function:
>>
>>   unsigned int ToSquare(unsigned int file, unsigned int row) const;
>>
>>3) Instead of low-levely maipulating a square by means of operator+=() you could
>>declare the following high-level functions in class CSquare:
>>
>>   void Up();
>>   void Down();
>>   void Left();
>>   void Right();
>>   void Next();
>>   void Previous();
>
>Isn't it better to return a reference for this functions, to cascade several
>directions in one expression? What about throwing an out of board exception?
>
>
>>
>>4) You could also declare other convenient functions outside of class CSquare:
>>
>>   bool IsAdjacent(const CSquare&, const CSquare&);
>
>while polymorphism is a nice thing to have, this function may also be member of
>CSquare.
>
>try
>{
>   if ( sq1.right().down().isAdjacent(sq2) )
>     ....
>}
>catch (OutOfBoardException e)
>{
>  printf ("oups %s", e.getErrorString());
>}
>
>;-)

The question was: "is there overhead in OO ? "

Whenever you use a try .. catch  : YES   :)

Tony

>
>Gerd
>
>>
>>5) In your program you could do something like the following:
>>
>>   CSquare sq1(E4);     // e4
>>   CSquare sq2(3, 3);   // d4
>>
>>   sq1.Right();
>>   sq1.Up();
>>   sq1.Left();
>>   sq1.Down();
>>   sq1.Next();
>>   sq1.Previous();
>>
>>   bool adj = IsAdjacent(sq1, sq2);
>>
>>
>>Greetings
>>Alex



This page took 0 seconds to execute

Last modified: Thu, 15 Apr 21 08:11:13 -0700

Current Computer Chess Club Forums at Talkchess. This site by Sean Mintz.