我的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 );
}