мои методы Getter / Setter проверяют значение, прежде чем они устанавливают / возвращают его. Если значение недействительно, они генерируют исключение (BadArgumentException или IllegalStateException). Это необходимо, поскольку мы инициализируем все члены с недопустимыми значениями - и поэтому мы избегаем работы с этими недопустимыми значениями (== получение ошибок / ошибок / исключений в других местах).
Преимущества следующие:
Это кажется очень необычным, поскольку большинство новых членов команды сначала жалуются на это - даже если они соглашаются со мной после того, как я им это объясню.
Вопрос: Это хороший стиль программирования? (Даже если это немного снижает производительность)
Пример кода :
inline bool MyClass::HasGroupID const { return m_iGroupID != 0; }
int MyClass::GetGroupID() const
{
if( !HasGroupID() )
throw EPTIllegalStateException( "Cannot access uninitialized group ID!" );
return m_iGroupID;
} // END GetGroupID() const
void MyClass::SetGroupID( int iGroupID )
{
// negative IDs are allowed!
if( iGroupID != 0 )
throw EPTBadArgumentException( "GroupID must not be zero!", iGroupID );
m_iGroupID = iGroupID;
} // END SetGroupID( int )
Использование :
// in serialization
if( myObject.HasGroupID() )
rStream.writeAttribute( "groupid", GetGroupID() );
// in de-serialization
try {
// required attribute - throw exception if value is invalid
myObject.SetGroupID( rStream.GetIntegerAttribute( "groupid" );
} catch( EPTBadArgumentException& rException )
{
throw EPTBadXmlAttribute( fileName, rException );
}