EDIT 2私が実際に問題を解決する方法。
InternalTableNumber を遅延ロードされるプロパティにします。利用できない場合は、InternalTableName を介して検索します。次に、メソッドに常に InternalTableNumber プロパティを使用します。
private int? internalTableNumber;
private int InternalTableNumber
{
get
{
if (!internalTableNumber.HasValue)
{
internalTableNumber = GetValueFromTableName( internalTableName );
}
return internalTableNumber;
}
set
{
internalTableNumber = value;
}
}
public int Number
{
get
{
string value = this.RunTableInfoCommand(InternalTableNumber,
TableInfoEnum.TAB_INFO_NUM);
return Convert.ToInt32( value );
}
}
EDIT ポリモーフィズムを使用して...
現在のクラスの名前が Foo であると仮定すると、それを FooWithName と FooWithNumber の 2 つのクラスにリファクタリングします。FooWithName は、テーブル名がある場合に使用するクラスであり、FooWithNumber は、テーブル番号がある場合に使用するクラスです。次に、Number メソッドを使用して各クラスを作成します。実際には、相互に使用できるように、それぞれが実装するインターフェイス IFoo も作成します。
public interface IFoo
{
int Number { get; }|
}
public class FooWithName : IFoo
{
private string tableName;
public FooWithName( string name )
{
this.tableName = name;
}
public int Number
{
get { return this.RunTableInfoCommand(this.tableName,
TableInfoEnum.TAB_INFO_NUM);
}
... rest of class, including RunTableInfoCommand(string,int);
}
public class FooWithNumber : IFoo
{
private int tableNumber;
public FooWithNumber( int number )
{
this.tableNumber = number;
}
public int Number
{
get { return this.RunTableInfoCommand(this.tableNumber,
TableInfoEnum.TAB_INFO_NUM);
}
... rest of class, including RunTableInfoCommand(int,int);
}
次のように使用します。
IFoo foo;
if (tableNumber.HasValue)
{
foo = new FooWithNumber( tableNumber.Value );
}
else
{
foo = new FooWithName( tableName );
}
int number = foo.Number;
明らかに、既存のクラスに多くの if-then-else 構造がない限り、このソリューションは実際にはそれほど改善しません。このソリューションは、ポリモーフィズムを使用して IFoo を作成し、実装を気にせずにインターフェイス メソッドを使用するだけです。これは、IFoo を継承し、FooWithNum および FooWithName の基本クラスである抽象クラスで RunTableCommand( int ) の共通実装を継承するように簡単に拡張できます。