Как я могу наилучшим образом _select_, какие из внутренних параметров работать? - PullRequest
1 голос
/ 23 марта 2012

Это простой вопрос. У меня есть класс CubeMap. Внутри класса CubeMap находится vector<ColorValue>, который содержит значения цвета для каждой из 6 граней кубической карты.

class CubeMap
{
    vector<ColorValue> colorValues, rotatedColorValues ;
    void save( char* filename ) ;
} ;

Кубическая карта может вращаться во время работы программы. Если он повернут, то rotatedColorValues ​​содержит повернутую версию, а colorValues ​​всегда содержит исходную версию.

CubeMap имеет функцию-член save( char* filename ); Исходная кубическая карта всегда хранится в colorValues, а «повернутая» версия кубической карты МОЖЕТ ИЛИ НЕ МОЖЕТ храниться в rotatedColorValues.

Теперь подпрограмма сохранения будет либо сохранять colorValues ​​, либо rotatedColorValues. У меня есть несколько вариантов.

Как мне лучше всего выбрать с какими внутренними параметрами работать?

Изменить подпись CubeMap::save на:

// 1. use the name:
void saveRotatedVersion( char* filename ) ;
void saveOriginal( char* filename ) ;

// 2. OR use a parameter:
void save( char* filename, bool rotatedVersion ) ;

// 3. OR turn it into a static function and require the object
// being saved to be included
static void save( char* filename, const vector<ColorValue> &toSave ) ;

// 4. OR use an enum
enum CubeMapObject { Original, Rotated } ;
static void save( char* filename, CubeMapObject objectToSave ) ;

редактирование:

a 5. Я также мог бы установить параметр внутреннего состояния, как селектор сортов

class CubeMap
{
    vector<ColorValue> colorValues, rotatedColorValues, *currentSource ;
    // save uses currentSource, whatever that points to
    void save( char* filename ) ;
} ;

Какой из них является лучшим и почему?

Ответы [ 2 ]

2 голосов
/ 23 марта 2012

Я бы пошел с номером 1 или номером 4. Номер 2 проигрывает с номером 4 в удобочитаемости и не столь очевиден, как номер 4, в то время как номер 3 показывает слишком много реализации.

Номер трихорошо бы иметь в качестве частного метода, скрывающего детали реализации вашего процесса сохранения.

PS Номер 4 был бы более уместным, если вы ожидаете добавить другие CubeMapObject значения, скажем, RotatedLeft и RotatedRight.

0 голосов
/ 23 марта 2012

В итоге я использовал свое окончательное редактирование:

class CubeMap
{
    vector<ColorValue> colorValues, rotatedColorValues, *currentSource ;

    // save uses currentSource, whatever that points to
    void save( char* filename ) ;

    void setSource( vector<ColorValue> *newSource ) ;
    void revertToPreviousSource() ; // "pop"
} ;

Преимущество этого в том, что интерфейсные функции просто названы.Кроме того, все функции cCubeMap теперь используют указатель currentSource, поэтому все становится чище.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...